Ugrás a tartalomhoz Lépj a menübe

2.1. Adattípusok

Az adattípus fogalma és jellemzői, az adattípusok csoportosítása. Értéktípus és referenciatípus jellemzői.

Értéktípus és referenciatípus jellemzői

A típusokat két nagy csoportra oszthatjuk:

  • referencia (reference) típus család,
  • érték (value) típus család.

Az érték típuscsalád az egyszerűbben elképzelhető.

Tagjai:

  • az összes egész szám típus (int, byte, ...)
  • az összes tört szám típus (double, float)
  • karakter típus (char)
  • logikai típus (bool)

A referencia típuscsaládba sorolhatóak az alábbi típusok:

  • Random
  • tömbök (vektorok)
  • listák
  • rekordok
  • objektumosztályok

Akinek van egy kis OOP előismerete, azok számára információ: valójában az érték típuscsaládba tartozik minden típus, ami a C++ struct kulcsszavával előállított típus. A referencia típuscsaládba sorolhatóak a class kulcsszavával előállított típusok.

 

Adattípusok csoportosítása (egyszerű, összetett) és fontosabb műveletei

Az adattípus meghatározza a tárolásra használt memóriaterület (változó) bitjeinek darabszámát és értelmezését. Az adattípus hatással van az adatok feldolgozására is, hisz a C++ nyelv erősen típusos, így nagyon sok mindent ellenőriz a fordítóprogram.

Az adatoknak több jellemzője van, ezek közül a legfontosabbak az azonosító, hozzáférési jog, érték, hatáskör, élettartam, típus. Az adat típusát három tulajdonság határozza meg. Az adat értékhalmaza, a vele végezhető műveletek és a számítógépes ábrázolása. Az adattípusokat értékhalmazuk alapján két csoportba soroljuk.

Egyszerű (elemi) adattípusok

Az egyszerű adattípus szerkezetileg nem bontható tovább.

  • Egész (int)
  • Valós (reál) (float,double)
  • Logikai (bool)
  • Karakter (char)

Összetett adattípusok (Referencia típusok)

Az összetett adattípusnál az értékhalmaz mellett a szerkezet is lényeges, egyik-másik típus ábrázolása már magasabb szintet igényel, mert elég bonyolult.

  • Sorozat / vektor / egydimenziós tömb
  • Tömb / mátrix / többdimenziós tömb
  • Rekord / struktúra (struct)
  • Szöveg (karaktersorozat)
  • Sor (absztrakt típus)  
  • Verem (absztrakt típus)

 

A legfontosabb egyszerű adattípusok: egész, valós, logikai, karakter és felsorolt típusok jellemzői.

 

Elemi adattípusok

Olyan értékek, amelyek egy konkrét adatok jelentenek. Nem bonthatók fel kisebb

egységekre.

Egész

  • 1, 2, 56, 5666, stb.
  • Sorszámozott adattípusok. Lehetnek:
    • Előjel nélküli: Negatív számokat nem tárolhatunk velük.
      • 1 byte-on tárolhatóak, amelyek értékkészlete: 0-255
      • 2 byte-os: 0 - 216
      • 4 byte-os: 0 - 232
      • Stb.
    • Előjeles: Lehetnek negatív számok is. Az első bit az előjelnek van fenntartva.
    • 1 byte-os: -128, -127, …, 0, …, 126, 127 (-27-27-1)
    • 2 byte-os:
    • Stb.

Valós

  • Törtszámok:
    • Tizedes tört: pl. 234,5
    • Lebegőpontos alak: 2,345*102

Karakter

  • A programozási nyelv által használt karakter kódtáblából egy karaktert jelölnek ki. (számok, abc karakterei, vezérlő karakterek, egyéb)
  • Karakter kódtábla: Minden programozási nyelv mögött van egy olyan táblázat, amelyben felsorolják a használható karaktereket. Ebben a karakterekhez egy sorszám van rendelve. Pl. a Pascal az ASCII kódtáblát használja, a Java az UNICODE-ot.

Felsorolt, logikai, intervallum

  • Felsorolt: Értékek sorozata, amely mögött sorszámozás van. Pl.: HÉTFŐ, KEDD, stb. a hét napjai.
  • Logikai: A logikai igen-nem, igaz-hamis eltárolására alkalmas.
  • Intervallum: Valamely sorszámozott típus egy résztartománya. Pl.: 3, 4, 5, 6 az egész
  • számok tartományából.
  •  

 

Az egyes adattípusokhoz tartozó műveletek (OOP nyelvek esetén jellemzők és metódusok) bemutatása.

 

Az objektum-orientált programozás (OOP)

  • Az emberi gondolkodáshoz közelebb álló programozási szemléletmód.
  •  – Alapelve: az adatok és a hozzájuk kapcsolódó tevékenységek egységbe zárása (encapsulation).
  • – A program építőkövei az osztályok (class), amelyek definíciója tartalmazza
    • az adattagok,
    • illetve a hozzájuk kapcsolódó tevékenységek, metódusok leírását.
  • – Egy program megtervezése az osztályok és a közöttük lévő kapcsolatok, azaz az objektumhierarchia kialakítását jelenti.
  • – Az OOP további elvei
    • Öröklődés (inheritance):
      • az osztályok egy részét már meglévő osztályok továbbfejlesztésével hozzuk létre, úgy, hogy további adattagokkal, illetve metódusokkal bővítjük.
    • Adatelrejtés:
      • az adattagok a külvilág számára a lehető legnagyobb mértékben rejtve vannak, növelve a biztonságos programozást (private hozzáférés)
    • Többalakúság (polimorfizmus)
      • A származtatott osztályokban lehetnek ugyanolyan elnevezésű, de más tevékenységű metódusok, mint az ős osztályban => áttekinthető kód, nem kell az elnevezéseket variálnunk.
    • Újrafelhasználhatóság
      • Az OOP személetű programozás nagymértékben támogatja az elkészült osztályok újrafelhasználhatóságát.
      • Jó tervezés és megfelelő dokumentáltság esetén az egyszer elkészített osztályok más programokba is változtatás nélkül, esetleg továbbfejlesztve beépíthetők.
      • Lehetőség van önálló csomagok, komponensek, keretrendszerek kialakítására.
  • Metódus
  • Egy metódus végrehajtása csak abban az esetben valósul meg, ha azt megadjuk a forráskódban, vagyis meghívjuk a metódust. A metódus meghívásakor végrehajtódnak a metódusban definiált utasítások, majd a program vezérlése visszatér arra a helyre, ahonnan a metódust meghívtuk és a következő utasítással folytatódik a program végrehajtása.
  • A metódusoknak lehetnek paraméterei és lehet visszatérési értéke.
  • A programozási nyelvek futtató környezete ( runtime environment ) számos metódust biztosít, amelyet közvetlenül felhasználhat a programozó.

 

A legfontosabb összetett adattípusok (karakterlánc, tömb (vektor és mátrix) és struktúra (rekord)) jellemzőinek bemutatása.

Kifejezések adattípusai, készítésének szabályai.

 

Összetett, strukturált adattípusok

Az értékeket fel tudjuk bontani kisebb, önmagában is kezelhető (értelmezhető) részekre.

Karakterlánc, string, sztring

Olyan adattípus, amely karakterek sorozatait tartalmazza. Ezzel az adattípussal rendelkező

programozási eszközök (pl. változók) karakterek sorozatát „szöveget” tartalmazhatnak.

(Pl.: „alma”, „körte”, „narancs”, stb.)

A formális string tetszés szerinti (de véges) hosszúságú, a megvalósított nyelvekben ez a

hossz gyakran mesterségesen maximalizált. Általánosságban, két fajtája létezik a string

adattípusnak:

  • fix hosszúságú stringek, amikor függetlenül attól, hogy a string elemeinek száma eléri-e a maximumot, mindig ugyanakkora memóriaterületet foglalnak le a tárolásához,
  • változó hosszúságú stringek, ahol a string hossza nem fix, és csak az aktuális hossza szerinti helyet foglal el memóriában.

A legtöbb string megvalósítás nagyon hasonlít egy változó hosszúságú tömb

megvalósításához, ahol az elemek tárolása karakter kódok segítségével történik. A fő

különbség az, hogy a string esetében logikailag csak bizonyos kódolású karakterek tárolása

megengedett. Tulajdonképen ez történik, ha UTF-8 kódolást használnak, ekkor egy karakter

egy és négy byte közötti helyet foglal el. Ebben az esetben például a string hossza különbözik

a tömb hosszától.

Hossz:

  • A sztring hossza megállapítható úgy, hogy a karakterek végén egy speciális jelet adunk meg. Például a NULL karaktert a C-szerű nyelvekben.
  • Illetve direkt megadjuk a karakterek számát. Például Pascalban a karakterlánc elején egy Byte tárolja a karakter hosszát. Ezért nem lehet 255 karakternél nagyobb.

Megvalósítások különböző

C nyelv:

Deklaráció / értékadás:

char *nev;

*nev = „ALMA”;

Karakterlánc Műveletek:

  • hossz megállapítása: Vagy eltároljuk az aktuális hosszat, vagy számolunk a \0 karakterig.
    • Pascal nyelv: nev[0], illetve length(nev) hivatkozás megadja a karakterlánc aktuális hosszát.
    • C nyelv: strlen(nev) megszámolja a karaktereket a ’\0’ jelig.
    • Java nyelv: str.length() metódus visszaadja a szöveg hosszát.
  • összefűzés (konkatenáció): két vagy több karakterlánc egymás után fűzése.
  • karakter, részlánc beszúrása, törlése, cseréje: A beszúrás karaktert vagy részláncot adott pozíciótól kezdve beilleszt úgy, hogy a hátralévő karaktereket feljebb tolja. A törlés adott karaktert vagy karakterláncot távolít el úgy, hogy a fentebb lévő  karaktereket, ha vannak, rámásolja. A csere eljárás adott indextől kezdve, adott indexig lecserél karaktereket egy megadott részláncra.
  • karakter, részlánc keresése: Adott karaktert vagy részláncot keresünk a sztring elejétől, vagy megadott indextől kezdve. A visszaadott érték a megtalált szöveg első karakterének helye.

Tömb

Azonos típusú elemeket tartalmaz. (Ebben az értelemben majdnem olyan, mint a karakterlánc, de az elemek nem csak karakterek lehetnek.) Az egyes elemek lehetnek: számok, karakterek, karakterláncok, logikai értékek, teljes tömbök, rekordok és objektumok is. Az elemek sorszámozva vannak, és elérésük ezekkel a sorszámokkal történik. Ezeket a sorszámokat indexeknek nevezzük.

Pl.: Fővárosok (Budapest, Prága, London, Pozsony, stb.).

Tömb indexelése

Az egydimenziós tömb minden egyes eleméhez egy egyértelmű indexérték tartozik, amely meghatározza az elem tömbön belüli helyét. Az index típusának sorszámozhatónak kell lennie. Az indextartomány két határérték közötti, és az indexek egyesével növekszenek.

Indexelések például:

  • A matematikában az index általában egész típusú, és az alsó határ 1.
  • A Javában az index egész típusú, és az alsó határ minden esetben 0.

Egydimenziós tömb

Az egydimenziós tömb minden egyes eleméhez egy egyértelmű indexérték tartozik, amely meghatározza az elem tömbön belüli helyét. Az index típusának sorszámozhatónak kell lennie. Az indextartomány két határérték közötti, és az indexek egyesével növekszenek.

Két-, illetve többdimenziós tömb

A tömb elemei elvileg bármilyen típusúak, így tömbök is lehetnek. Ha egydimenziós tömböket mint elemeket egy tömbbe foglalunk, rögtön kétdimenziós tömböt kapunk. A háromdimenziós tömb úgy keletkezik, hogy tömbbe foglaljuk a kétdimenziós tömböket. Az egymásba ágyazásnak elvileg nincs határa – a tömb dimenzióinak száma elvileg korlátlan.

Vektor

A vektor egy konténer objektum; egy „változtatható méretű tömb”, amely rendelkezik karbantartási és keresési funkciókkal.

Általános jellemzők:

  • A vektor mérete az elemek hozzáadásával automatikusan bővül. A vektor méretének fizikailag csak az index int típusa és a memóriaméret szab határt. A vektor ugyan egy fix méretű tömbben tárolja az elemeket (elementData), de ez a tömb szükség esetén automatikusan lecserélődik. Bővüléskor a rendszer létrehoz egy új, nagyobb tömböt, melybe átmásolja a régi vektor elemeit. A tömb mérete a vektor kapacitása: capacity(), a tömbben tárolt aktuális elemek száma pedig a vektor mérete: size(). Létrehozáskor megadható a vektor kezdeti kapacitása: initialCapacity. Ha a kapacitást nem adjuk meg, akkor annak értéke 10. Megadható továbbá a növekedés mértéke: capacityIncrement, ennyivel fog a tömb kapacitása automatikusan megnőni, amikor a tömb betelik. Ha nem adjuk meg ezt az értéket, akkor a vektor a kétszeresére bővül. A kapacitás és a bővülés mértékének megadásakor figyelembe kell venni, hogy a gyakori bővítés feltétlenül a hatékonyság rovására megy, a túl nagy kapacitás megadása viszont indokolatlan memóriafoglalással járhat.
  • A vektor elemei indexelhetők. Az index egy 0 és size()-1 közötti érték. Az i. elemet a get(i) függvény adja meg. Hibás index megadásakor ArrayIndexOutOf BoundsException kivétel keletkezik.

Rekord adattípus

Olyan adatszerkezet, amely több különböző típusú elemből állhat, és ezeket az adatokat valamilyen okból egy egységként akarjuk használni. Hasonló a tömbhöz, abban a tekintetben, hogy több részből áll. Viszont a rekord megengedi, hogy az egyes részek különböző típusúak legyenek. A típust a programozó hozza létre, amelyhez nevet rendel, ezért deklarálni szükséges.

Ilyen például egy emberhez tartozó néhány adat.

Pl.: Személy(Név, Születési év, Nem, Súly, Fizetés)

C nyelvi megvalósítás

Példa:

struct szemely{

 char * nev;

 int szulEv;

 char nem;

 float suly;

 int fizetes;

}