Diskuze: Vytvoření matice s předem neznámou velikostí

C++ C a C++ Vytvoření matice s předem neznámou velikostí

Avatar
dominiknpvm
Člen
Avatar
dominiknpvm:

Ahoj,
snažím se vytvořit program, který bude na vstupu načítat prvky matice řádek po řádku. Matici pak vytiskne a spočte součet prvků nad hlavní diagonálou. To je zatím jednoduché. Problém je, že nevím předem, jak velká bude matice a zjistit to mám z prvního zadaného řádku.

Hodně jsem googlil a i zde jsem našel podobná vlákna, ale žádná neřešila tento problém. Asi potřebuji první řádek nějak na parsovat, aby mi vzniklo pole intů. Musím počítat i s dvoucifernými čísly, což to ještě komplikuje.

Byl bych vděčen, kdyby mě někdo trochu popostrčil. Je to pro mě celkem zásadní věc. Díky za každou odpověď.

 
Odpovědět 1.6.2015 13:23
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na dominiknpvm
Martin Dráb:

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).

Nahoru Odpovědět  +1 1.6.2015 13:48
2 + 2 = 5 for extremely large values of 2
Avatar
Jozef
Člen
Avatar
Jozef:

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][po­cet], prvý riadok naplníš číslami z pomocného poľa

Nahoru Odpovědět 1.6.2015 20:18
I'm not afraid to die on a treadmill
Avatar
Odpovídá na dominiknpvm
Libor Šimo (libcosenior):

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;
}
Nahoru Odpovědět 2.6.2015 8:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

Tu je matica.
Sorry, nedá sa vložiť obrázok, skúšal som formát, bmp, jpg a png. :-(

Editováno 2.6.2015 8:49
Nahoru Odpovědět 2.6.2015 8:46
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):

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

Nahoru Odpovědět 2.6.2015 8:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jakub Horák
Člen
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jakub Horák:

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).

 
Nahoru Odpovědět  +2 2.6.2015 15:37
Avatar
Odpovídá na Jakub Horák
Libor Šimo (libcosenior):

Díky, to ma nenapadlo. Proste som na tú možnosť zabudol.

Nahoru Odpovědět 4.6.2015 13:47
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.