Ukládání prvků do pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Ukládání prvků do pole – C / C++ – Fórum – Programujte.comUkládání prvků do pole – C / C++ – Fórum – Programujte.com

 

Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #1
-
0
-

Ahoj mám problém s úsekem kódu, kde se snažím manipulovat s prvkami a přesouvat je v poli.

Na vstupu je např: S:aSAb S:AB A:Bb A:aA A:bB B:@

Já se snažím najít slovo, které obsahuje znak @. Z tohoto slova je pro mě důležité to, co je před dvojtečkou, čili znak B. tento znak uložím do množiny Ne. Nyní podle tohoto znaku vytvořím fiktivní slovo B:B. a uložím do množiny F. No a teď koukám na vstupní řetězec a hledám znak B, který se vyskytuje na pravé straně slova (prostě za dvojtečkou). Pokud toto slovo najdu, tak přidám tečku za znak B a uložím ho do množiny F (např. najdu S:AB - čili do F uložím S:AB.).

V podstatě se snažím vytvořit Follow algoritmus (Firts and Follow algorithm). Problém je, že právě to poslední "tečkování" nefunguje - respektive vypíše se správně jen první slovo, pak už ne... jedná se o tu poslední konstrukci (přitom když sem si to zkoušel cvičně rozepsat na papír, chybu jsem nenašel)

void follow_algorithm (char *input)
{
	/* Hledani e-pravidel ve vstupnim retezci */
	char text_for_f_set [strlen(input)];
	strcpy(text_for_f_set, input);
	char text_for_e_rules [strlen(input)];
	strcpy(text_for_e_rules, input);
	char *token_a;
	token_a = strtok(text_for_e_rules, " ");
	char e_rules [strlen(text_for_e_rules)];
	while (token_a != NULL)
	{
		if (strchr(token_a, '@') != NULL)
		{
			if (e_rules[2] != '@')
			{
				strcpy(e_rules, token_a);
			}
			else
			{
				strcat(e_rules, token_a);
			}
		}
		token_a = strtok(NULL, " ");
	}
	
	/* 
	*   Ulozeni vsech prvku, ktere se daji prepsat na
	*   prazdny retezec do mnoziny Ne
	*/
	int size = ((strlen(e_rules))/3) + 1;
	char ne_set [size];
	int i = 0;
	int j = 0;
	do
	{
		ne_set[j] = e_rules[i];
		i = i + 3;
		j++;
	}
	while (e_rules[i] != '\0');
	ne_set[j] = '\0';
	
	/* Ulozeni fiktivniho pravidla do mnoziny F */ 	
	char f_set [500];
	int iter;
	for (iter = 0; iter <= strlen(f_set)-1; iter++)
	{
		f_set[iter] = '0';
	}
	f_set[0] = ne_set[0];
	f_set[1] = ':';
	f_set[2] = f_set[0];
	f_set[3] = '.';
	f_set[4] = ' ';
	f_set[5] = '\0';
	
	/* Prozatim follow pouze pro prvni prvek mnoziny Ne */
	printf("* Prvky mnoziny Ne: {%s} *\n", ne_set);
	printf("* Prvky mnoziny F: {%s} *\n", f_set);
	
	
	char *token_b;
	token_b = strtok(text_for_f_set, " ");
	char help [strlen(text_for_f_set)];
	while (token_b != NULL)
	{
		strcpy(help, token_b);
		int n;
		for (n = 2; help[n] != '\0'; n++)
		{
			if (help[n] == ne_set[0])
			{
				char temp [strlen(help)];
				strcpy(temp, help);
				int last = strlen(temp) - 1;
				int m;
				for (m = n+1; m >= last; m--)
				{
					if (m != last)
					{						
						temp[m+1] = help[m];
					}
				}
				if (m != last)
				{
					temp[last+1] = '.';
					temp[last+2] = ' ';
					temp[last+3] = '\0';
				}
				else
				{
					temp[n] = '.';
					temp[last+2] = ' ';
					temp[last+3] = '\0';
				}
				printf("Slovo: %s\n", temp);
				strcat(f_set, temp);
			}
		}
		token_b = strtok(NULL, " ");
	}	
	printf("* Prvky mnoziny F: {%s} *\n", f_set);
	
	
	
}
Nahlásit jako SPAM
IP: 92.62.224.–
KIIV
~ Moderátor
+43
God of flame
30. 12. 2012   #2
-
0
-

zkus si to cvicne vypisovat podrobne v kodu... to ze na papire to funguje, neznamena ze mas kod spravne ...

Nahlásit jako SPAM
IP: 94.113.92.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
30. 12. 2012   #3
-
0
-

#1 Sprinter


Naco potrebujes first a fallow mnoziny, robis daky parser?

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ů
30. 12. 2012   #4
-
0
-

Koukám na to už tři hodiny a nejsem schopný v tom kódu najít chybu.. jde o to, že je rozdíl, jestli je ten znak B na konci pole, nebo někde uprostřed... a to je celý problém, kde to dělá chybu

First a follow potřebuji pro výpočet rozkladové tabulky (vstupem je LL(1) bezkontextová gramatika). Vůbec si nejsem jistý, jestli jsem na to zvolil správný postup. Napadlo mě už i použít frontu, abych nemusel furt projíždět ty tokeny... A vůbec nejlepší by bylo kdyby ten algoritmus už byl obsažen v nějaký funkci :-)

Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
30. 12. 2012   #5
-
0
-

#4 Sprinter
Najlepsie by bolo keby si si najprv spracoval gramatiku z textoveho tvaru do "lepsieho" tvaru kde nebudes musiet pracovat so stringami  Ja mam parser v c++ a tam sa to robilo ovela lepsie. 

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ů
30. 12. 2012   #6
-
0
-

#5 vitamin
No jo, ale já furt potřebuji procházet ten vstupní text prvek po prvku a pro to se nejlépe hodí pole :-(

Prozkoumal jsem znovu ten úsek kódu, který mi nefunguje a poopravil pár chyb. V podstatě řeším jen úpravu polí. Pokud v ne_set[0] bude uložen znak "B", tak budu porovnávat všechny vstupní tokeny a hledat slovo, které má za dvojtečkou právě znak "B". Čili například dostanu:

S:AB

A:Bb

A:bB

No a teď použiji první podmínku if(n == last) - do této podmínky vstoupí pouze S:AB a A:bB (prostě všechny slova, které mají na konci "B"). Poslední slovo má znak "B" uvnitř, takže vstoupí do else a pak by mělo přejít do for cyklu. A zde je ten problém - for cyklus se vůbec nevykoná (Kontrolní výpis se vůbec nevypíše). Cyklus je zapsán správně a i při výpisu posledního prvku mi to správně háže 3ku...

char *token_b;
token_b = strtok(text_for_f_set, " ");
char help [strlen(text_for_f_set)];
while (token_b != NULL)
{
	strcpy(help, token_b);
	int n;
	for (n = 2; help[n] != '\0'; n++)
	{
		if (help[n] == ne_set[0])
		{
			char temp [strlen(help)];
			strcpy(temp, help);
			int last = strlen(temp) - 1;
							
			if (n == last)
			{
				temp[last+1] = '.';
				temp[last+2] = ' ';
				temp[last+3] = '\0';
			}
			else
			{
				int m;
				int b = strlen(help)-1;
				printf("Index posledniho prvku: %i\n", b);
				for (m = 0; m >= strlen(help)-1; m--)
				{	
					printf("*** Kontrolni vypis ***\n");
					if (m == n)
					{
						temp[n+1] = '.';
						int rest;
						for (rest = 0; rest <= n; rest++)
						{
							temp[rest] = help[rest];
						}
						break;
					}
					temp[m+1] = help[m];
				}
			}
			printf("Slovo: %s\n", temp);
			strcat(f_set, temp);
		}
	}
	token_b = strtok(NULL, " ");
}
Nahlásit jako SPAM
IP: 92.62.224.–
Sprinter
~ Anonymní uživatel
102 příspěvků
30. 12. 2012   #7
-
0
-

For cyklus byl špatně, prohodil jsem prvky:

for (m = strlen(help)-1; m >= 0; m--)

Ale furt to nefunguje tak jak by mělo :-D

Nahlásit jako SPAM
IP: 92.62.224.–
Sprinter
~ Anonymní uživatel
102 příspěvků
31. 12. 2012   #8
-
0
-

Tak už to funguje :-) Problém byl jen v nějakých indexech, chtělo to správně ukončovat řetězec (ty ukončovací nuly mě jednou zabijou :-D)

Nahlásit jako SPAM
IP: 92.62.224.–
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, 40 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ý