Pomoc s návrhem algoritmu – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomoc s návrhem algoritmu – C / C++ – Fórum – Programujte.comPomoc s návrhem algoritmu – C / C++ – Fórum – Programujte.com

 

Sprinter
~ Anonymní uživatel
102 příspěvků
15. 1. 2013   #1
-
0
-

Ahoj,

nevím si rady s postupem, jak napsat v jazyku C následující věc:

Mám vstupní pole, ve kterém jsou obsaženy nějaká slova, formát je následující

input = "S:aS S:a D:b E:TA"

Já potřebuji napsat funkci, které by našla slova, která nemají za znakem ":" velké písmeno a zároveň jsou tyto znaky obsaženy alespoň dvakrát ve slově (prostě z pole výše by to bylo S:aS a S:a). Všechny tyto slova by pak uložila do nějakého pole.

Já se v tom zamotal a nejsem schopnej vymyslet nic funkčního. Myslel jsem, že bych mohl použít counter, který, když by byl větší jak 1, tak by indikoval že je na vstupu více slov, které splňují podmínku výše...

void fce (char *input)
{
	int size = strlen(input)+1;
	char *token;
	char *next_token;
	char working_input [size];
	char help [size];
	buffer[0] = '\0';
	strcpy(working_input, input);
	token = strtok_r(working_input, " ", &next_token);
	while (token != NULL)
	{
		strcpy(help, token);
		if (isupper(help[2]) == 0)
		{
			char detect [strlen(help)];
			detect[0] = help[0];
			detect[1] = help[1];
			detect[2] = help[2];
			detect[3] = '\0';
			
			int counter = 1;
			int last_size = 0;
			char *token_a;
			char *next_token_a;
			char current_input [size];
			char temp [size];
			char buffer [size];
			strcpy(current_input, input);
			token_a = strtok_r(current_input, " ", &next_token_a);
			while (token_a != NULL)
			{
				strcpy(temp, token_a);
				int i;
				for (i = 0; temp[i] != '\0'; i++)
				{
					if (temp[i] == detect[0] && temp[i + 1] == detect[1] && temp[i + 2] == detect[2])
					{
						printf("Detekoval jsem slovo {%s}{%i}\n", temp, counter);
						strcat(buffer, temp);
						counter++;
					}
				}
				token_a = strtok_r(NULL, " ", &next_token_a);
			}
		}
		token = strtok_r(NULL, " ", &next_token);
	}
}
Nahlásit jako SPAM
IP: 147.228.209.–
vitamin+8
Grafoman
15. 1. 2013   #2
-
0
-

Vsimol som si ze mas casto problemi s algoritmami ktore pracuju so stringami. Preco si ten string pred spracovanim nerozlozis na viacej casti, napr:

typedef struct{
	char* line;	//pole terminalnych a neterminalnych symbolov + epislon
}rule_t;

typedef struct{
	char N;		//znak neterminalu
	rule_t* rule;	//pravidla neterminalu (pole lebo neterminal moze mat viac pravidiel)
	
}nterm_t;
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
15. 1. 2013   #3
-
0
-

#2 vitamin
O něčem takovém jsem uvažoval, ale problém je, že jedna ze zásad pro tento projekt je nepoužívat struktury (máme zadávány ulohy postupně a v každé můžeme použít další datový typ či nějakou funkci)...

Nahlásit jako SPAM
IP: 147.228.209.–
zlz
~ Anonymní uživatel
634 příspěvků
16. 1. 2013   #4
-
0
-

Můžeš to zadání upřesnit? Proč bude výsledek S:aS a S:a? Protože obě slova mají na třetí pozici a, někde ve slově mají a, začínají stejně, obsahují stejné znaky, ... ? Z popisu v kombinaci s tím kódem to nechápu.

Nahlásit jako SPAM
IP: 80.188.216.–
zlz
~ Anonymní uživatel
634 příspěvků
16. 1. 2013   #5
-
0
-

A ono je to vlastně celkem jedno, podmínky si můžeš upravit.

void fce (char *input)
{
    int size = strlen(input)+1;
    char *token, *next_token;
    char working_input[size];

    strcpy(working_input, input);
    for (token = strtok_r(working_input, " ", &next_token); token; token = strtok_r(NULL, " ", &next_token))
    {
        if (islower(token[2]))
        {
            char *token_a, *next_token_a;
            char current_input[size];

            int counter = 0;
            strcpy(current_input, input);
            for (token_a = strtok_r(current_input, " ", &next_token_a); token_a && counter < 2; token_a = strtok_r(NULL, " ", &next_token_a))
            {
                if (token_a[2] == token[2])
                    counter++;
            }

            if (counter > 1)
                printf("%s\n", token);
        }
    }
}
Nahlásit jako SPAM
IP: 80.188.216.–
Sprinter
~ Anonymní uživatel
102 příspěvků
16. 1. 2013   #6
-
0
-

#5 zlz
Jojo, takhle to funguje, děkuji. Akorát znaky na třetí pozici mohou být všechny krom velkých písmen (např i lomítko třeba). Takže podmínku islower předělám na !isupper.

Ten for cyklus takhle zapsaný jakoby nahrazuje konstrukci s while? Jinak je pro mě novinkou, že mohu pracovat s indexem u klasického char*.. já si všude kopíroval data z charu* do pole char[], abych mohl procházet jednotlivé indexy pole.. 

Nahlásit jako SPAM
IP: 147.228.209.–
zlz
~ Anonymní uživatel
634 příspěvků
16. 1. 2013   #7
-
0
-

for (a;b;c) { d; } funguje jako a; while (b) { d; c; }. Výhoda je v tom, že to a,b,c máš pohromadě.

Ano, ukazatel jde indexovat jako pole. On vlastně mezi polem a ukazatelem není rozdíl (teda někdy je, a docela zásadní) a proto ti to kopírování funguje.

Nahlásit jako SPAM
IP: 80.188.216.–
Sprinter
~ Anonymní uživatel
102 příspěvků
16. 1. 2013   #8
-
0
-

Ok, děkuji.

Jěště takový dotaz - potřebuji do pole uložit velké písmena, které jsou například s háčkem či čárkou. Chtěl bych třeba z ASCII tabulky použít http://sorry.vse.cz/…ii/index.htm

char znak = 143;

a to pak uložit do pole.. ale za prvý nevím jak to z "nepointeru" udělat a za druhé - myslíte, že tento znak, i když je velké písmeno, projde podmínkou isupper?

Nahlásit jako SPAM
IP: 147.228.209.–
vitamin+8
Grafoman
16. 1. 2013   #9
-
0
-

#8 Sprinter
musis skusit, ale pochybujem ze to pojde. Ale nie je problem spravyt vlastnu funkciu ktora ti bude fungovat (mono by stacilo aj makro).

Na aky predmet potrebujes tuto ulohu?

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
16. 1. 2013   #10
-
0
-

#9 vitamin
Jazyk C a překladače... máme to jako takovou větší semestrálku, už na tom sedím skoro dva měsíce (z toho jsem nějaký funkce několikrát smazal a napsal znovu, protože jsem třeba zvolil špatný systém). V podstatě nikdy jsem neprogramoval, tak jsem si dal radši velkou rezervu a i tak mam co dělat, abych to stihnul včas...

To co se teď snažim udělat je levá faktorizace http://www.algoritmy.net/…rmace-na-LL1

Potřebuji vymyslet nějaký systém, který ty pravidla bude takto transformovat...

S tou funkcí či makrem je problém, že v dalším postupu mam asi 20x použitou podmínku isupper a musel bych to vše předělávat.. pokud by to takto nešlo, tak spíš použiji např X, Y, Z, .. a napíši, že to se ze vstupu zadávat nesmí... (což může být)

Nahlásit jako SPAM
IP: 147.228.209.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 42 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý