TFeri.hu

A C++ nyelv alapjai 7. rész PDF Nyomtatás E-mail
  
Tartalomjegyzék
A C++ nyelv alapjai 7. rész
File-műveletek
Minden oldal

13. fejezet: Adatstruktúrák

File-műveletek


Sok más programozási nyelvhez hasonlóan itt is létre lehet hozni különféle önálló adatstruktúrát, így nem vagyunk lekorlátozva pár alapvető elemre és típusra. Gyakorlatban az adatstruktúra az egyes típusú elemek azonos nevű csoportja. Ezek az egyes adatelemek (vagy tagok) különféle típusúak és eltérő hosszúak lehetnek.
Szintaxisuk a következő:
struct struktúra_név {
típus_1 tag_neve_1;
típus_2 tag_neve_2;
típus_3 tag_neve_3;
.
.
} objektum_neve;


A legfontosabb egy adatszerkezet létrehozásakor, hogy ez egy új típus lesz. Amint egy adatszerkezetet deklaráltunk a struct segítségével, a program minden további részében lehet használni, akár a régi (megszokott) típusokat. Például egy kis zöldség-üzlet adatbázisában elképzelhető a következő:
struct termek {
int suly;
float ar;
} ;
termek alma;
termek banan, dinnye;


Persze ezt sem kell két külön lépésben megoldanunk, mivel bátran lehet egyszerre is összehozni. Például:
struct termek {
int suly;
float ar;
} alma, banan, dinnye;


Fontos belátni, hogy a rövidítés után ugyanott állunk, ahol az eredeti kódokkal álltunk volna! Lássuk mindezt egy gyakorlati példában - teljes kóddal:

---------------------------------------------
// Adat-struktúrák
#include <iostream>
#include <cstdlib>
using namespace std;

struct termek
{
string nev;
int suly;
float ar;
} ;

void kiir(termek mit)
{
cout <<"\nTermek neve: " <<mit.nev;
cout <<"\nSu'lya:      " <<mit.suly;
cout <<"\nA'ra:        " <<mit.ar;
}

int main ()
{
termek alma;
termek banan, dinnye;
system("cls");
alma.nev="Alma";
alma.suly=20;
alma.ar=147;
banan.nev="Bana'n";
banan.suly=14;
banan.ar=350;  
dinnye.nev="Dinnye";
dinnye.suly=4;
dinnye.ar=99.9;
kiir(alma);
kiir(banan);
kiir(dinnye);
return 0;
}
---------------------------------------------


Vegyük észre, hogy a "termek" nevű adatstruktúrát előre kellett létrehozni, majd rögtön utána egy külső eljárásban már könnyedén lehet is rá hivatkozni. A fenti elvvel létre tudunk hozni beágyazott adatstruktúrákat is.

Kicsit fontosabb lesz a továbbiakban, hogy a C++ megengedi létező adattípusokon alapuló saját adatstruktúrák létrehozását is. Erre a typedef szolgál, például:
typedef létező_típus új_típus_név ;
Itt a létező típust már előre el kell készíteni (vagy eleve adottat kell alkalmazni), így létre lehet hozni az új adattípust. Lássunk erre példákat!
typedef char C;            // A C char típusú lesz
typedef unsigned int WORD;    // A WORD előjel nélküli egész
typedef char * pChar;        // A pChar egy char típusú mutató
typedef char field [50];     // Ez pedig egy 50 darabos tömb


Mint látható, a typedef nem képes alapvetően új típusokat definiálni, csak a meglévőkhöz rendelhetünk velük azonosan használható szinonimákat.

Az unió egy más téma. A "union" ugyanis megengedi, hogy a memória egy adott részéhez más és más adattípusokat rendeljünk hozzá. Az adatok deklarációja és használata hasonló az eddig megismertekhez, de a funkció teljesen más! Lássunk egyből egy gyakorlati példát:
union mytypes_t {
char c;
int i;
float f;
} mytypes;


Ez a deklaráció három elemet hoz létre:
mytypes.c
mytypes.i
mytyes.f

Mindegyik különféle adattípusú. Ám mind a három ugyanarra a memóriahelyre mutat, így ha az egyiket módosítjuk, akkor az összes többi is egyből módosul.

A C++ újabb csavart adott bele az uniókba, ugyanis lehetőség van névtelen (anonymous) uniók létrehozására. Ha az uniót név nélkül deklaráljuk, akkor az unió anonymous lesz és képesek leszünk az egyes tagokat közvetlenül a nevükön elérni. Például nézzük meg a következő két deklarációt:
Hagyományos módon deklarált unió:
struct {
char cim[50];
char szerzo[50];
union {
float dollar;
int yen;
} ar;
} konyv;


Új típusú (anonim módon) deklarált unió:
struct {
char cim[50];
char szerzo[50];
union {
float dollar;
int yen;
};
} konyv;


Az egyetlen különbség az ár nevének megadásában van. Itt a lényeges különbséget a hozzáférés módja adja. A hagyományos módon deklarált uniónál a hozzáférés a következő: konyv.ar.dollar, illetve konyv.ar.yen. Ám az új, anonim módnál ez egyszerűsödik: konyv.dollar, illetve konyv.yen.

Felsorolási típus (enum):
Ez a lehetőség új adattípusokat hoz létre, ami nincs korlátozva az értékek alaptípusaira. Lássuk a következő példát:
enum szinek {black, blue, green, cyan, red, purple, yellow, white};

Figyeljük meg, hogy a deklaráció semmilyen alaptípust nem tartalmaz. Nagyjából azt kell mondanunk, hogy a semmiből hoztunk létre egy teljesen új adattípust. Ezen új típus lehetséges értékeit tartalmazza a zárójel. Gyakorlati használata például a következő:
szinek nadrag;
nadrag = blue;
if (nadrag == green) nadrag = red;

Szeretném megjegyezni, hogy ilyen esetben a szinek típus legelső eleme (black) nem az 1-es számú lesz, hanem a 0-ás!

A felsorolási adattípus kompatibilis a számozott változókkal (felsorolható egészekkel), így az egyes elemekhez könnyedén hozzárendelhetünk egész számokat. Lássunk erre is egy gyakorlati példát:
enum honapok { januar=1, februar, marcius, aprilis, majus, junius, julius, augusztus, szeptember, oktober, november, december} ev;

Ebben az esetben az "ev" változónak 12 lehetséges értéke lesz, melyek követik egymást. Ilyen deklaráció esetén a vektorokkal ellentétben az első érték (januar) 1 lesz, nem pedig 0.

 



 
Ulti Clocks content

Hirdetés