Kezdőoldal » Számítástechnika » Programozás » Valaki légyszíves eltudná...

Valaki légyszíves eltudná nekem magyarázni a struct-tól lépésről lépésre? Szövegből kikeresés program (C++)

Figyelt kérdés

#include <iostream>

#include <fstream>

using namespace std;


struct orszag

{

   string country;

   string region;

   int population;

   int area;

   float pop_density;

   float coastline;

};

int st_atoi( const char * str )

{

   int val = 0;

   while( *str ) {

       val = val*10 + (*str++ - '0');

   }

   return val;

}

int main()

{

   struct orszag orszagok[300];

   int rec_count;

   ifstream olvas;

   int hely, ehely;

   string sor;


   rec_count=0;

olvas.open("Countries.txt");

while (!olvas.eof())

{

   getline(olvas,sor);

   hely=sor.find("\t");

   orszagok[rec_count].country=sor.substr(0,hely);


   ehely=hely+1;

   hely=sor.find("\t",ehely);

   orszagok[rec_count].region=sor.substr(ehely,hely-ehely);


   ehely=hely+1;

   hely=sor.find("\t",ehely);

   orszagok[rec_count].population=st_atoi(sor.substr(ehely,hely-ehely).c_str());


   ehely=hely+1;

   hely=sor.find("\t",ehely);

   orszagok[rec_count].area=st_atoi(sor.substr(ehely,hely-ehely).c_str());


   cout << orszagok[rec_count].country<< "--" << orszagok[rec_count].region<<"--";

   cout << orszagok[rec_count].population<< "--" << orszagok[rec_count].area<<endl;

   rec_count++;

}

olvas.close();


int db, index;

db=0;

for(index=0;index<rec_count;index++)

   if(orszagok[index].region=="OCEANIA                            ")

      db++;

   cout << "Az OCEANIA regioban " << db << "orszag van " << endl;

   return 0;

}



2019. nov. 24. 18:53
 1/5 A kérdező kommentje:
Elég ha csak a parancsokat, amiket láttok leírjátok, hogy mire jó.
2019. nov. 24. 18:59
 2/5 anonim ***** válasza:
0%
Se parancsok nincsenek C++-ban, se egy struct-nak lépései.
2019. nov. 24. 19:01
Hasznos számodra ez a válasz?
 3/5 A kérdező kommentje:
Van egy jóindulatú ember, aki tudna segíteni?
2019. nov. 24. 22:16
 4/5 anonim ***** válasza:
79%

A struct-tal egy saját típust állítasz elő, aminek az elemeit a pont operátorral éred el.


st_atoi függvény: Ennek a paramétere egy tömböt vár. C++-ban paraméterátadáskor minden tömb implicit (= nem írod ki, mégis megtörténik) átalakul az első elemre mutató pointerre, ezért nem tömb típust írunk oda. Egy karaktertömb utolsó eleme általában mindig a null terminator, ami nem más mint a '\0'. Ennek értéke megegyezik a (char)0-val, egy int 0-val, és a NULL-al (C++ 11 előtt). C++-ban az a szabály, hogy a 0 false és minden ami nem false az true. Ezért van az, hogy a while( *str ) akkor "áll le", ha elértük a szöveg végét, tehát a '\0'-t.

A val = val*10 + (*str++ - '0'); kicsit trükkös. A 10-el való szorzásra azért van szükség, mert minden egyes új karakternél el kell tolni (pl: 133, jön a következő betű: "4" -> 133*10 = 1330 + 4 -> 1334).

(*str++ - '0') ez helyes zárójelezéssel: ( (*(str++)) - '0')). A tömbök elemei a memóriában folytonosan vannak tárolva, egymás után. Kezdetben ahogy írtam a paraméter az első elemre mutat. A ++ azt jelenti lesarkítva, hogy "ugorj a következőre". Ezt ismételgetve eljutunk majd a végéig (ahol a '\0' van). A * az str előtt átváltja a pointer-t a valós értékre, gyakorlatilag megadja az adatot, amire a pointer mutat. A '0' kivonásra a következő miatt van szükség: minden karakter egy szám, ha kivonsz egymásból kettőt, megkapod a távolságukat. Tehát például '9' - '0' = 9. Így konvertálod át a számokat (ugyanis az int i = '5' pl. 53 lenne, lsd. ascii tábla).


main: a programod belépési pontja.

struct orszag orszagok[300]: itt csinálsz egy tömböt, ami a memória stack területén jön létre. Fontos, hogy itt nem csak a tömb, hanem mind a 300 elem létrejön a memóriában. Mivel ez C++ kód, ide a struct kulcsszó nem kell.

ifstream olvas: ezzel megnyitsz egy "csatornát" egy fájlra, amit úgy kell elképzelni, mintha folyamatosan fogyna. Ha kiolvasod a felét, akkor a következő olvasás az előző végén fog folytatódni, így előbb-utóbb eléred a fájl végét.

olvas.open("Countries.txt"): megnyitod a csatornát.

while (!olvas.eof()): az olvas.eof() akkor true, ha elérted a fájl végét.

getline(olvas,sor): az olvas "csatornából" elkezdi átmásolgatni az adatokat a sor változóba addig, amíg el nem éri az első \n vagy \r\n (tehát sorvége karakter(eke)t). Magyarul kiolvastál egy sort a fájlból.

hely=sor.find("\t"): a find megmondja, hányadik helyen kezdődik az a szöveg, amit megadsz neki. A "\t" egy tabulátor karakter.

orszagok[rec_count].country=sor.substr(0,hely): a substr függvény fogja a szöveget (sor), és levág belőle részeket. Pontosabban amit meghagy, az az első paramétertől kezdődően annyi betű, amennyi a második paraméter. (példa: ha a sor értéke "szoveg" és hely=2, akkor a sor.substr(0,hely) nem más mint "sz").


Az algoritmust a main-ben nem részletezném, így is túl sokat írok, és van sok hiányosság / hiba a kódban.

Ami még érdekes lehet az a c_str(). Ezt egy std::string típuson használjuk, és visszaad egy C-stílusú karakterláncot, ami nem más mint a karakterekből álló tömb. Ez az, amit az elején említettem, hogy átalakul az első elemre mutató pointerre (const char*).


Remélem érthető volt amit leírtam.

2019. nov. 24. 22:56
Hasznos számodra ez a válasz?
 5/5 A kérdező kommentje:
Köszönöm szépen
2019. dec. 8. 11:49

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!