Anonymní profil Sprinter – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Sprinter – Programujte.comAnonymní profil Sprinter – Programujte.com

 

Příspěvky odeslané z IP adresy 37.188.255.–

Sprinter
C / C++ › Uložení čísla do matice podl…
5. 1. 2013   #169819

Tak budu mít ještě jeden dotaz do tohoto vlákna. :-)

Úsek kódu, kde vytvářím mám furt stejný (kromě přidaného výpisu do souboru). Ovšem mám pár nových funkcí, které mi v určitých případech mohou výrazně změnit vstupní parametry funkce create_table(). Jde o to, že proměnné mohou vypadat například takto:

Je jasné, že originální pole mají navíc znak ":" a nejsou v něm uplicitní znaky. Pole line a column pak používám pro nadpisový řádek a slopec v tabulce (beze změny). Ovšem problém je u pole orig_line a orig_column. Tato pole totiž používám pro tvoření čísel, které pak vkládám do tabulky. Já bych ale potřeboval, aby když algoritmus narazí na znak ":", tak aby pozastavil počítání - respektive přičítal nulu. Takto:

Výsledná tabulka by se pak měla vygenerovat jako:

Nevíte, jak by měla vypadat podmínka, která by toto řešila?

/*
*	Funkce vytvori matici prvku ze ktere posleze vypise rozkladovou tabulku
*/
void create_table (char* orig_line, char* orig_column, char* line, char* column)
{
	int a = strlen(line);
	int b = strlen(column);
	char matrix [a] [b];
	
	/* Inicializace matice */
	int n;
	for (n = 0; n <= a; n++)
	{
		int m;
		for (m = 0; m <= b; m++)
		{
			matrix [n] [m] = '-';
		}
	}
	
	/* Naplneni matice ciselnymi hodnotami dle danych souradnic */
	int iter;
	for (iter = 0; orig_line[iter] != '\0' && orig_column[iter] != '\0'; iter++)
	{
		matrix [get_index(line, orig_line[iter])] [get_index(column, orig_column[iter])] = '0' + (iter + 1);
	}
	
	/* */
	FILE *fw;
	fw = fopen("temp.txt", "w");
	
	/* Vypsani rozkladove tabulky (matice)  a ulozeni do textoveho souboru*/
	printf("Tabulka:\n");
	fprintf(fw, "M");
	printf("M");
	int x;
	for (x = 0; column[x] != '\0'; x++)
	{
		printf("\t%c", column[x]);
		fprintf(fw, "\t%c", column[x]);
	}
	printf("\n");
	fprintf(fw, "\n");
	int z;
	for (z = 0; line[z] != '\0'; z++)
	{
		printf("%c\t", line[z]);
		fprintf(fw, "%c\t", line[z]);
		int y;
		for (y = 0; column[y] != '\0'; y++)
		{
			printf("%c\t", matrix [z] [y]);
			fprintf(fw, "%c\t", matrix [z] [y]);
		}
		printf("\n");
		fprintf(fw, "\n");
	}
	fclose(fw);
}


/*
*	Funkce pro zjisteni indexu pole
*/
unsigned get_index (const char* str, char c)
{
	for (unsigned i = 0; str[i] != '\0'; i++)
	{
		if (str[i] == c)
		{
			return i;
		}
	}
	assert(0 && "!!! Chyba ve funkci get_index() !!!");
}
Sprinter
C / C++ › Problém s indexem pole
5. 1. 2013   #169818

#33 Furynka
To je fakt no :-) Děkuji, už je to funkční přesně tak, jak jsem chtěl

Sprinter
C / C++ › Problém s indexem pole
5. 1. 2013   #169814

#31 Furynka

Super, děkuji. Akorát ještě jedna věc - teď mi to vypisuje bez toho znaku "@" a mělo by to vypsat i s ním.. např:

poleA: SSAABB

poleB: aA@ab@

transf: A@b B@ba

současný výpis:

SS:A:AB:BB:

aA:b:ab:ba:

a mělo by to být takto:

SS:AA:AB:BBB:

aA:@b:ab:@ba:

Sprinter
C / C++ › Problém s indexem pole
5. 1. 2013   #169807

#29 Furynka
:-) Děkuju

Sprinter
C / C++ › Problém s indexem pole
5. 1. 2013   #169805

#27 Furynka
Tak teď se výpis zkrátil jen na toto:

Pom_1: {ABB}

Pom_2: {ab@}

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169801

#25 KIIV
Jojo, místo na ukončovací nuly si hlídám. Proto tomu poli také dávám místo mnohem větší, než potřebuje (oříznout ho mohu vždycky).

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169799

#22 Furynka

Tak teď to háže tyto výsledky:

Pom_1: {SS:A :ABB}

Pom_2: {aA:B         }

Pro jistotu radši přikládám i současný kód:

char pom_1 [200];
char pom_2 [200];
int count = 0;
int j;
int size = strlen(column_buffer);
for (j = 0; j < size; j++)
{
	char *follow;
	follow = strtok(transfer_form, " ");
	char temp [strlen(transfer_form)];
	while (follow != NULL)
	{
		strcpy(temp, follow);
		if (column_buffer[j] == '@' && line_buffer[j] == temp[0])
		{
			pom_1[count + j] = ':';
			pom_2[count + j] = ':';
			int n;
			for (n = 2; temp[n] != '\0'; n++)
			{
				pom_1[count + n - 1 + j] = temp[0];
				pom_2[count + n - 1 + j] = temp[n];
			}
			pom_1[count + n + j] = ':';
			//pom_1[count + n + 1] = '\0';
		
			pom_2[count + n + j] = ':';
			//pom_2[count + n + 1] = '\0';
		
			count = count + n;
		}
		else
		{
			pom_1[count + j] = line_buffer[j];
			pom_2[count + j] = column_buffer[j];
		}
		follow = strtok(NULL, " ");
	}
}
Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169796

#19 Furynka
Jojo, chápu. No teď se snažím zjistit, kde je chyba.. mám zadáno toto:

line_buffer[0] = 'S';
	line_buffer[1] = 'S';
	line_buffer[2] = 'A';
	line_buffer[3] = 'A';
	line_buffer[4] = 'B';
	line_buffer[5] = 'B';
	line_buffer[6] = '\0';
	
	column_buffer[0] = 'a';
	column_buffer[1] = 'A';
	column_buffer[2] = '@';
	column_buffer[3] = 'a';
	column_buffer[4] = 'b';
	column_buffer[5] = '@';
	column_buffer[6] = '\0';
	
	transfer_form[0] = 'A';
	transfer_form[1] = '@';
	transfer_form[2] = 'b';
	transfer_form[3] = ' ';
	transfer_form[4] = 'B';
	transfer_form[5] = '@';
	transfer_form[6] = 'b';
	transfer_form[7] = 'a';
	transfer_form[8] = '\0';

A ve výpisu mám jako výsledek:

Pom_1: {SS:AA:ABB}

Pom_2: {aA:@b:ab@}

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169795

#18 KIIV
No ten bod 1 moc nechápu.. transfer_form má mnohem větší délku, než token (jestli jde o ukončovací znak). Co se týče bodu 3, tak tam šlo o to, že je lepší místo strlen použí např. toto?

column_buffer[j] != '\0'
Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169785

#16 Furynka
Tak jsem to odzkoušel a ještě je tam nějaká chyba, takhle to furt vypisuje špatně. Jinak co se týče toho

count = count + n

Tak ta jednička tam byla kvůli tomu, aby posunula count na další prvek v poli (aby nedošlo k přepsání). Proč zde taky není přičteno i j?

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169783

#14 Furynka
Jasně, opraveno.

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169781

Jo tak ten error to házelo, protože jsem špatně deklaroval ty pole (závorky)

Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169780

#11 Furynka
No popravdě se s tím patlám skoro celý den a už asi nic nevymyslím. Pěkně se v tom motám a to už sem měl řešit něco uplně jinýho, tak pokud by se ti chtělo, tak za funkční kód budu rád..

Momentálně mám toto (ovšem, když jsem to prohnal kompilátorem, tak mi to vyhodilo na všechny pole s indexem count chybu - subscripted value is neither array nor pointer nor vector)

char pom_1;
char pom_2;
char *follow;
follow = strtok(transfer_form, " ");
char temp [strlen(transfer_form)];
int count = 0;
int j;
for (j = 0; j < strlen(column_buffer); j++)
{
	while (follow != NULL)
	{
		strcpy(temp, follow);
		if (column_buffer[j] == '@' && line_buffer[j] == temp[0])
		{
			pom_1[count] = ':';
			pom_2[count] = ':';
			int n;
			for (n = 1; temp[n] != '\0'; n++)
			{
				pom_1[count + n] = temp[0];
				pom_2[count + n] = temp[n];
			}
			pom_1[count + n] = ':';
			pom_1[count + n + 1] = '\0';
		
			pom_2[count + n] = ':';
			pom_2[count + n + 1] = '\0';
		
			count = count + n + 1;
		}
		else
		{
			pom_1[count] = line_buffer[j];
			pom_2[count] = column_buffer[j];
			count++;
		}
		follow = strtok(NULL, " ");
	}
}
Sprinter
C / C++ › Problém s indexem pole
4. 1. 2013   #169778

#9 Furynka
Jestli to tedy chápu správně, musím nejdříve udělat for cyklus a do něj vnořenej while cyklus (co se toho vyhledávání týče)?

 

 

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