Diskuze: Vytvoření matice s předem neznámou velikostí
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Jestli to chápu dobře, tak z velikosti prvního řádku nějak dopočítáš velikost sloupce matice. Například proto, že ta matice je čtvercová?
Co se týče manuálního parsování čísel v C, je možné použít třeba Hornerovo schéma. Jde o to, že čísla jsou zapisována od nejvýznamnější číslice po tu nejméně významnou, takže pokud již máš část čísla převedenou, tak započítání další cifry znamená provést následující:
cislo = cislo*zaklad + cifra;
kde zaklad je základ číselné soustavy, ve které čísla na vstupu jsou zadávána. Pro tebe asi 10. Na počátku algoritmu (kdy nemáš rozparsováno žádné číslo) je třeba nastavit proměnnou cislo na 0.
Pokud to nechceš dělat ručně, zkus funkci strtoul (http://www.cplusplus.com/…lib/strtoul/). Funkce se pokusí zadaný řetězec zkonvertovat na číslo, přičemž pokud se to podaří, vrátí ti adresu znaku v řetězci, který se nachází těsně za zkonvertovaným číslem (parametr endptr). To ti dovolí postupně procházet ten řádek intů (hodnotu vrácenou v endptr považuješ za nový řetězec, se kterým budeš pracovat).
Neviem či som to správne pochopil, ale matica bude štvorcová a jej veľkosť závisí od počtu čísiel v riadku? Ak áno, vyskúšaj niečo takéto:
#include<stdio.h>
int main()
{
FILE*fr;
int i,c,pole[100];
int pocet = 1;
int index = 0;
fr = fopen("matica.txt","r");
fscanf(fr,"%d",&pole[index++]);
while((c = getc(fr))!= '\n'){
fscanf(fr,"%d",&pole[index++]);
pocet++;
}
printf("%d\n",pocet);
fclose(fr);
return 0;
}
Zo súboru matica.txt načítava čísla, až kým nepríde na koniec riadku. Čísla načítava do pomocného poľa(predpokladám, že riadok nebude obsahovať viac ako 100 čísel,môžeš pole ľubovolne zväčšiť) a zvyšuje premennú pocet o 1, čím zistíš, koľko čísiel riadok obsahoval. Potom už iba vytvoríš dvojrozmerné pole, napr. matica[pocet][pocet], prvý riadok naplníš číslami z pomocného poľa
Tu máš jedniduchý program na zistenie parametrov matice. Predpokladám maticu zloženú z celých čísiel.
#include<stdio.h>
int main()
{
FILE*fr;
int i, pocet_cisiel = 0, pocet_riadkov = 0;
char str[80];
fr = fopen("matica.txt","r");
if(fr == NULL) {
perror("Error opening file");
return(-1);
}
/** Zisti pocet celych cisiel v subore */
while ((fscanf(fr,"%d",&i) != EOF)) {
pocet_cisiel++;
}
fclose(fr);
fr = fopen("matica.txt","r");
if(fr == NULL) {
perror("Error opening file");
return(-1);
}
/** Zisti pocet riadkov v subore */
while (fgets(str, 80, fr) != NULL) {
pocet_riadkov++;
}
fclose(fr);
printf("Matica ma %d riadkov a %d stlpcov.\n",pocet_riadkov, pocet_cisiel / pocet_riadkov);
return 0;
}
Tu je matica.
Sorry, nedá sa vložiť obrázok, skúšal som formát, bmp, jpg a png.
25 6 58 6 12 12 5 6
5 4 8 9 89 2 5 3
25 6 58 6 12 12 5 6
5 4 8 9 89 2 5 3
25 6 58 6 12 12 5 6
5 4 8 9 89 2 5 3
25 6 58 6 12 12 5 6
5 4 8 9 89 2 5 3
25 6 58 6 12 12 5 6
5 4 8 9 89 2 5 3
Moc jsem nepochopil proč tam zavíráš ten soubor a na dalším řádku ho zase otvíráš. Proč ho rovnou nenecháš otevřený až do konce? Jestli chceš posunout kurzor na začátek, můžeš použít funkci fseek (https://msdn.microsoft.com/…5yw9bf3.aspx).
Díky, to ma nenapadlo. Proste som na tú možnosť zabudol.
Zobrazeno 8 zpráv z 8.