Összetett adattípusok 8/b tétel Készítette: Kovács Nándor KONRACB.PTE
Adattípusok
A C++-ban leggyakrabban használt alaptípusok: Egész számok típusa: int, short int, long int Lebegopontos számok típusa: float, double, long double Logikai típus: bool Karakter típus: char Karakterlánc típus: string
Típuskonstrukciók A típuskonstrukciós eszközök lehetőséget biztosítanak arra, hogy az alap típusokból újakat hozzunk létre. Nyelvenként nagyon eltérő, hogy milyen eszközöket használhatunk. Általában besorolhatóak az alábbi csoportosításba: Iterált típus Unió típus Direktszorzat típus
Iterált típus Egy meglévő típus elemeiből szeretnénk halmazokat vagy sorozatokat készíteni. A programozási nyelvek általában több megoldást is kínálnak rá: Vektor (egydimenziós tömb) Többdimenziós tömb Halmaz Lista Hasítótábla Fájl
Iterált típus Vektor Sorszám (index) szerint akarunk hivatkozni az elemekre. Típusértékhalmaz eltérő a nyelvekben: C jellegű nyelvek: Elemszámot kell megadni. 0-tól indexelődik. Pascal jellegű nyelvek: Egy tetszőleges diszkrét típus, tetszőleges nem üres részhalmaza lehet az indexhalmaz.
Iterált típus Vektor Műveletek: Szelekció: Értékadás: V[i], amely viszont lehet balérték is, így rajta keresztül megváltoztatható a vektor. Értékadás: Általában ciklusban kell átadni az egyes értékeket. A Pascal jellegű nyelvek megengedik a vektorok közötti értékadást is.
A tömb típus A tömb típus a tömb absztrakt adatszerkezet megjelenése típus szinten. A tömb statikus és homogén összetett típus, vagyis tartományának elemei olyan értékcsoportok, amelyekben az elemek száma azonos, az elemek azonos típusúak. A tömböt, mint típust meghatározza: - dimenzióinak száma - indexkészletének típusa és tartománya - elemeinek a típusa
Iterált típus Egyes nyelvek (pl. a C) nem ismerik a többdimenziós tömböket. Ezek a nyelvek a többdimenziós tömböket úgy képzelik el, mint olyan egydimenziós tömbök, amelyek elemei egydimenzi-ós tömbök. C jellegű nyelvek: Vektorok vektora int t[42][42] Pascal jellegű nyelvek: Valódi többdimenziós tömbök.
Iterált típus Nyelvi specialitások C és C++: A mutatók és tömbök szoros kapcsoltban vannak egymással. A vektor tulajdonképpen az első elemre mutató mutatóval érhető el, és így is tárolódik. Tetszőleges méretű tömböket adhatunk át az alprogramoknak, mivel tulajdonképpen csak egy mutatót fogunk átadni. A vektor nem ismeri a saját méretét, így azt nekünk kell kezelni.
Iterált típus Halmaz Viszonylag ritkán támogatott típuskonstrukció. Ha egy nyelv támogatja is, akkor szigorú megkötésekkel él az elemtípussal szemben. Diszkrét típusok. Maximált elemszámmal. Pl.: hónapok nevei C-ben: enum Months{ January, February, March, April, May, June, July, August, September, October, November, December };
Címfüggvény Tömbök ábrázolása Általában sorfolytonosan történik. Címfüggvény segítségével tudjuk megmondani egy adott elem tényleges helyét a memóriában. pl.: C nyelven pl. egy tömb címe megegyezik a 0-s indexű elem címével. Int tömb esetén a elemenként egy int-nyit (4 byte) kell hozzáadni a pointer értékéhez.
Unió típus A struktúrához hasonlóan különböző típusú adatok tárolására alkalmas, de egy adott időpillanatban csak egy fajta adata lehet. Akkor használjuk, ha valamiről azonos és különböző típusú adatokat is szeretnénk tárolni. Pl. kerekített ár, pontos ár(fillérrel). A modern programozási nyelvekben kiválthatóak az öröklődéssel és a többalakúsággal.
Unió típus A nyelvek egy része ettől függetlenül biztosít lehetőséget az unió típusok használatára. Használatának helytakarékossági oka lehet, vagy valamilyen konverziós trükk. Deklarációja és használata formailag megegyezik a struktúrával.
Unió típus C nyelven typedef union { int forintos; float filleres; } egyenleg;
Unió típus Jellemzői C-ben A memóriában annyi helyet foglal, amennyit a nagyobbik komponens foglalna el. A szelektorok itt arra szolgálnak, hogy a memóriából a szelektornak megfelelően olvassunk ki. Azaz nem arra, hogy eldöntsük, milyen típusú adattal van dolgunk. Nem kapunk támogatást arra, hogy eldöntsük, tényleg a megfelelő típusú objektum van-e a memóriában. Ez futási hibákhoz, vagy értelmezhetetlen – és nehezen felderíthető – hibákhoz vezethet.
Direktszorzat típus Struktúra: A struktúra egy összetett adatszerkezet, ami arra szolgál, hogy különböző típusú, de valamilyen oknál fogva összetartozó adatokat egy egységként tudjuk kezelni. A struktúrán belül tetszőleges típusokat alkalmazhatunk (kivéve a void és a függvény típust), még struktúrákat is. Azaz bizonyos megszorításokkal egy struktúra lehet rekurzív is.
Direktszorzat típus Deklaráció: struct struktúra_azonosító { típus1 tag1; típus2 tag2; típusN tagN; }; Az adattagok deklarációja a C nyelv szokásos deklarációs szabályai érvényesek: struct struktúra_azonosító struktúra_változó;
Direktszorzat típus Mikor használjuk? Megkötés: Ha valamiről több – akár típusaiban eltérő – adatot akarunk tárolni. Minden egyes hasonló dologról ugyanazokat az adatokat szeretnénk tárolni. Megkötés: Minden dolog esetén az összes tárolandó adatnak rendelkezésre kell állnia.
Direktszorzat típus Direktszorzat ábrázolása Általában a komponensek megadásának sorrendjében tároljuk őket. Az adott komponens típusának megfelelő fizikai formában tároljuk.
Direktszorzat típus Deklaráció C nyelven: typedef struct account { int account_number; char *first_name; char *last_name; float balance; } account;
Direktszorzat típus Változó deklaráció: account szamla; Értékadás: szamla.first_name=„Kovács”; szamla.balance=10000000;