Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 13. 04. 2010 17:17

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

pole ukazatelů na strukturu

Už fakt nevím, jak tento problém vyřešit. Snad mi někdo ochotný pomůže a celou problematiku vyřešíme. Nemyslím si, že je to (extrémně) složité. Fakt jen opravdu zájemci, kteří budou psát - zdrojový kód. Nechci nějaké (chytré) řečičky o tom...

Mám tedy soubor knizky.txt:

Code:

Bozena Nemcova;Bara;1961;
Karel Capek;Bila Nemoc;1966;
Shakespeare;Romeo a Julie;1658;

Mám strukturu:

Code:

typedef struct Kniha
{
    char   jmeno[20];        
    char   autor[20];                
    int    rokVydani;
} tKniha;

A mám nějaké pole ukazatelů, ukazující právě na tuto strukturu:

Code:

Kniha * knihy[20];

Potřeboval bych metodu (funkci), která mi vrátí (nebo vypíše) následující:

Code:

knihy[0]->autor = "Bozena Nemcova";
knihy[0]->jmeno = "Bara";
knihy[0]->rokVydani = 1961;
knihy[1]->autor = "Karel Capek";
knihy[1]->jmeno = "Bila Nemoc";
knihy[1]->rokVydani = 1966;
knihy[2]->autor = "Shakespeare";
knihy[2]->jmeno = "Romeo a Julie";
knihy[2]->rokVydani = 1658;

Prostě (vůbec) netuším, jak to dostat do toho pole. Jak vytvořit tu funkci. Mockrát děkuju za cenné rady.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

  • (téma jako vyřešené označil(a) byk7)

#2 13. 04. 2010 17:57

septolet
Příspěvky: 334
Reputace:   
 

Re: pole ukazatelů na strukturu

Tady http://forum.matweb.cz/viewtopic.php?id=16778 si dostal poměrně konkrétní odpověď + odkazy, kde si můžeš najít funkce pro práci s řetězci, které se ti při této úloze budou hodit. Kde je tedy problém? Co konkrétně není jasné? Pořád totiž píšeš, že něco nechápeš, ale já nevím co - co která funkce dělá jsem už zmiňoval v minulém vlákně + si dostal odkaz, kde se případně dozvíš víc, slovní řešení problému si už také dostal, malý náznak v podobě kódu si už také dostal. Takže tedy čekáš, že to někdo celé napíše za tebe? Proč nepokračuješ v původním vlákně a zakládáš nové na stejné téma?

Offline

 

#3 13. 04. 2010 17:59

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: pole ukazatelů na strukturu

↑ septolet: Nepotřebuji to napsat celé. Potřebuji napsat jenom tu funkci. ;)


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#4 14. 04. 2010 02:07

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: pole ukazatelů na strukturu

Tak jsem sesmolil něco takového, ale mám pár drobností:

Code:

void vemData(Kniha * kniha[20]) {
  
  FILE *fh;
  int c;
  int pozice = 1;  // kolikátý znak
  int knihaS = 0;  // kolikátá kniha (řádek)
  int polozka = 0; // jaká položka (autor, jméno knihy nebo rok)
  int znaky[50];   // pomocné pole pro ukládání
  
  if (( fh = fopen("knizky.txt", "r")) != NULL ) {
  
  do {
      c = fgetc(fh);
      
      // znaky[pozice] = c;
      printf("%c", c);
            
      if (c == ';') {
          if (polozka == 0) { /* strcpy(kniha[knihaS]->autor, znaky); printf("1"); */ };
          if (polozka == 1) { /* strcpy(kniha[knihaS]->jmeno, znaky); printf("2"); */ };
          if (polozka == 2) { /* kniha[knihaS]->rokVydani = znaky;    printf("3"); */ };
          polozka++;
      }
      pozice++;
      if (c == '\n') { printf("počet řádků: %d", knihaS); knihaS++; polozka = 0; };
      
  }   while (c != EOF);
  
  fclose (fh);
  }
}

1. Když tu proměnnou c hodím do toho pomocného pole znaky, tak když to sputím, tak mi to vyhodí vyjímku, že skáču někam do nesprávné (nepovolené) paměti.
2. Chtěl bych pomoci s tím doděláním, co mám v komentářích (viz. 3 if s položkama).
3. Pokaždé, když to projede podmínkou, tak bych potřeboval pole znaky nějak vyprázdnit, aby mi to tam neházelo věci, které nechci.
4. No a poslední věc je na tu podmínku s těma řádkama. Hodí mi to vždycky jenom (0, 1). V souboru mám ale 3 řádky, ne 2.


Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

#5 14. 04. 2010 07:58 — Editoval septolet (14. 04. 2010 07:58)

septolet
Příspěvky: 334
Reputace:   
 

Re: pole ukazatelů na strukturu

1) Nikde nevidím, že nuluješ proměnnou pozice.
2) Chce to změnit string na int, existuje na to funkce.
3) Tak to pole projdi (nemusíš celé) na na jednotlivé pozice ulož znak '\0' + samozřejmě vynulovat proměnnou pozice (viz. bod 1)
4) Poslední řádek není ukončen znakem '\n'.

Offline

 

#6 14. 04. 2010 14:13

RePRO
Místo: Jihlava
Příspěvky: 363
Škola: AI VŠPJ (09-12, Bc.)
Pozice: programátor
Reputace:   11 
Web
 

Re: pole ukazatelů na strukturu

Tak konečně hotovo, ještě doladit pár změn a ošetření, a bude to ready.

Code:

void vemData(Kniha * kniha[20]) {
  
  FILE *fh;
  int c;
  int pozice = 0;  // kolikátý znak
  int knihaS = 0;  // kolikátá kniha (řádek)
  int polozka = 0; // jaká položka (autor, jméno knihy nebo rok)
  char znaky[50];   // pomocné pole pro ukládání
  int rokVyroby;

  if (( fh = fopen("knizky.txt", "r")) != NULL ) {
  
  kniha[knihaS] = iniKnih("", "", 0);
  memset(znaky, '\0', 50*sizeof(char));
  do {
      znaky[pozice++] = fgetc(fh);
     
      if (znaky[pozice-1] == ';') {
          znaky[pozice-1] = '\0';
          if (polozka == 0) { strcpy(kniha[knihaS]->autor, znaky);  };
          if (polozka == 1) { strcpy(kniha[knihaS]->jmeno, znaky);  };
          if (polozka == 2) { rokVyroby = atoi(znaky); kniha[knihaS]->rokVydani = rokVyroby;   };
          polozka++;
          pozice = 0;
          memset(znaky, '\0', 50*sizeof(char));
      }
      if (polozka == 3) { polozka = 0; kniha[++knihaS] = iniKnih("", "", 0); }
      //if (znaky[pozice-1] == '\n')
      
  }   while (znaky[pozice-1] != EOF);
  
  fclose (fh);
  }
}

Srdcem trochu-programátor, duší rádoby-matematik a povoláním analytik-vývojář.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson