Az adattípus fogalmát a következőképpen definiálhatjuk: az adattípus definiálása a típus értékkészletének, a rajta végzett műveleteknek, az értékek jelölésének és a tárban való ábrázolásának rögzítését jelenti. Az adattípusokat két részre osztjuk, elemiek: melyeknek a felhasználó szempontjából nincs belső szerkezetük, és összetettek: amelyek az előbb említett elemi adattípusokból épülnek fel. Az összetett adattípusokat hívjuk általában adatszerkezeteknek.
A kifejezések operandusokból (amelyeken műveleteket hajtanak végre) és operátorokból (műveletek) állnak. Az operandusok lehetnek számok, konstansok, változók, függvények, sőt kifejezések is, tehát az egyszerűbb kifejezésekből bonyolultabbakat építhetünk fel. Az operátorok műveletek, relációk és zárójelek lehetnek. Az operátor fogalma más jelentéssel bír a számítástechnikában, mint a matematikában. A matematikában operátoron műveleteket értünk, a számítástechnikában ezt a fogalmat általában tágabban értelmezzük, hisz a műveleteken kívül ide soroljuk a relációkat és a zárójeleket is:
1.műveletek: @, +, -, *, /, and, div, in, mod, not, or, xor
2.relációk : <, >, <=, >=, =, <>
3.zárójelek: ( ) általánosan használt, (precedenciánál)
[ ] pl.: tömb deklarálásnál,
{ } pl.: kommenteknél, (azaz magyarázó szövegeknél).
A különböző operátorok végrehajtási sorrendjét (prioritását) a precedencia szabályabalról jobbra történő kiértékelési szabály az érvényes. szabja meg, amely kimondja, hogy a nagyobb precedenciájú operátorok előbb lesznek végrehajtva a kifejezésben, mint a kisebb precedenciájúak. Azonos precedenciák esetén pedig a
A precedenciát felülbírálhatjuk zárójelekkel. A zárójel szabály pedig azt jelenti, hogy kifejezések kiértékelése a legbelső zárójelen belül kezdődik, majd lépésenként halad végig az egyre külsőbb zárójeleken.
1. Zárójelek ( )
2. Függvények
3. Egy operandusú operátorok: not, +, -(í Előjelek)
4. Multiplikatív operátorok: *, /, and, div, mod, shl, shr
5. Additív operátorrok: +, -, or, xor (Shift Left ì)
6. Relációk: in, <, >, <=, >=, =, <>
7. Balról jóbbra haladás szabálya
( NOT = az egyik legmagasabb precedencia, hisz az operandus minden bitjét negálja. )
Az adatokat azonosítókhoz rendelhetjük hozzá. Az azonosító egy gyűjtőnév, amely programnyelvektől függően a következők elnevezésére, azonosítására szolgálhat (pl.):
programnév
konstans, címke,
változó, típus,
eljárás, függvény,
rekordmező, objektummező,stb.
Szintaktikailag az azonosítókra a legfontosabb feltételek azok, hogy nem lehet bennük szóközt használni és a kezdő karakter az angol abc betűiből választható csak. Néhány programnyelv a hosszát fél byte‑ban (127bit) korlátozza.
A két legfontosabb azonosító a konstans és a változó. Különbségük pedig abban testesül meg, hogy a konstans egy programban akárhányszor is szerepeljen illetve függetlenül attól, hogy hányszor futtatjuk le a programot, mindig azzal az egy állandó értékkel rendelkezik, amit a deklarációban adtunk neki. A változó egy meghatározott értéktartományból - melyet a deklarációban az értéktartomány típusával rendeltünk hozzá - vehet fel értéket. Természetesen csak egyet, melyet a változó aktuális értékének nevezünk. Tehát egy változó egy programban (függetlenül attól, hogy hányszor szerepel, vagy hányszor futtatjuk le a programot) más-más értéket vehet fel.
1. Elemi adattípusok
1.1. Egész típus
Az egész számokra a programnyelvek sokféle műveletet értelmeznek. Vannak nyelvek, amelyek megkülönböztetik az egész számokon értelmezett műveleteket a valós számokon értelmezettektől. (pl.: az egész részű és a maradék részű osztás)
A Basic pedig például egy olyan nyelv, ahol az egész számok a valós számok között tárolódnak. A gépi kódban pedig az az eltérő, hogy nem értelmezett az egész számokra a 4 alapművelet közül a szorzás és az osztás. A szorzást, osztást nekünk kell megvalósítani ismételt összeadásokkal. A szám előtti '$' minden típusú egésznél hexadecimális, elmaradása esetén pedig tízes számrendszerbeli alakot jelent. Az egész számokat általában két byte-on ábrázolják, a negatív számok miatt kettes komplemens módban. Természetesen ez korlátokat szab. Például 2 egész szám összeadásakor az összeg könnyen az intervallumon (‑32768 ‑-‑ +32767) kívül eshet (túlcsordulhat). Ezért magas szintű programnyelveknél 4 vagy 8 byte-on is ábrázolhatók az egész számok.
pl.: A Turbo Pascalban hatféle standard típus létezik az egész számok tárolására. Értékkészletüket és memóriabeli helyfoglalásukat (méretüket) láthatjuk a következőkben:
típusnév értékkészlet méret (byte)
byte 0 .. 255 1
shortint -128 .. 127 1
integer -32768 .. 32767 2
word 0 .. 65535 2
longint -2147483648 .. 2147483647 4
comp -9.22*1018 .. 9.22*1018 8
( -9.22*1018 = - 263 és 9.22*1018 = 263 -1 , mely egyenlőségekből is látszik, hogy a comp típus mérete 64 {0+63} bit-es, azaz 8 byte-os. )
A méret ismeretében nagyon egyszerű megállapítani az értékkészletet.
( méret = n , értékkészlet = 0 .. 2n - 1 vagy -2n - 1 .. 2n - 1 - 1 )
A hat típus egymással kompatibilis, azaz minden aritmetikai művelet, amelyet egyiken elvégeztünk, alkalmazható bármely más egész típusra. Ügyelni kell arra, hogy ne lépjük túl az értékkészleteket, mert konstansoknál fordítási, műveletek végrehajtásakor, (‑ha az eredmények túllépik (túlcsordulás) az értékhatárokat-) futási hibát kapunk. Ez a problémakör fokozott figyelmet érdemel az egész típusok alkalmazásánál, mert a részeredmények túlcsordulásakor a rendszer nem jelez hibát, de ez végül is az eredmények meghamisításában jelentkezik. Még egy lényeges kérdésre érdemes rávilágítani. A számítógép a kettes számrendszer alapján működik és ennek megfelelően pl: a longint típus értelmezési tartománya a memóriában egy max. 32 jegyű bináris számnak felel meg [0..232 ‑1]. Az értékkészletet pedig (az integer típushoz hasonlóan) úgy alakították ki, hogy annak középpontja a nulla legyen.
1.2. Valós típus
A valós számoknak ábrázolásukból következően kétféle korlátja van. Az egyik egy nagyságrendi korlát a másik a pontossági korlát. A számítógépen ábrázolható valós számok 2-es vagy 10-es számrendszerben véges sok számjeggyel leírható racionális számok. Megadásuk egy 0 és 1 számmal és (2-es vagy 10-es) hatványkitevővel történik. Valós számok körében nagyon sok művelet létezik. A gépi kódban azonban gondot okoz a kezelésük, ill. BASIC-ban az értelmezőben lévő subrutinokat érdemes használni a valós számok kezelésére.
1.3. Karakter típus
Ha létezik valamelyik nyelvben ilyen típus, akkor általában 1 db ilyen változóban tetszőleges karaktert tárolhatunk. A karakterek kódolására legtöbbször az ASCII kódrendszert használjuk. Nagygépeken az EBCDIC is előfordul. Karakterekre az összehasonlítás, a kódmegadás, a következő, illetve az előző karakterképzési műveleteket szokták alkalmazni. Pl. a PASCAl-ban a karakter típus helyfoglalása egy byte, mivel értékkészlete: az ASCII-kód karakterkészlete. (ASCII = American Standard Code for Information Interchange). Mivel ez is sorszámozott típus, a karakterek (számok, kis- és nagybetűk, írás- és grafikus jelek) rendezett halmazt alkotnak. A kódkiosztás 0..255-ig terjed. Pl.: 'A' kódja: 65, a 'B' kódja: 66.
1.4. Logikai típus
A BASIC nyelvben logikai típus nincs, logikai műveletek viszont vannak (AND, OR, NOT), ezért meg kell oldani a logikai eredmények (értékek) tárolását. A hamis értéket általában 0-nak, az igaz értéket pedig 1-nek vagy (-1)-nek veszik. A logikai értékek ezután egész típusú változókban tárolhatók. A TURBO PASCAL-ban értelmezett a logikai típus, négy művelettel (NOT, AND, OR, XOR).
logikai típus értékei : logikai igaz : TRUE
logikai hamis : FALSE
A logikai értékekkel végezhető műveleteket igazságtáblázataikon keresztül értelmezhetjük. A programnyelvek a következő táblázat műveleteiből használnak néhányat vagy mindet.
| A | B | NOT A | A & B | A U B | A X B | A E B | A I B |
| 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
| 0 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
| 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
Logikai műveletek: not = negáció, (tagadás)
and = konjunkció (és )
or = diszjunkció, (vagy)
xor = antivalencia, (kizáró vagy, nem egyenlőség)
eqv = eqvivalencia, (egyenlőség)
imp = implikáció. (true, ha A <= B)
2. Összetett adattípusok
Az összetett adatok nem összefüggéstelen halmaza az adatelemeknek, hanem valamilyen sorrendi, szerkezeti összefüggés van közöttük. Háromféle összetételi módot ismerünk:
- az összetett adat azonos típusú elemek sokasága. Ezek lehetnek szöveg, tömb, mutató vektor : (verem, sor, lista), file-ok : (szekvenciális állomány, direkt állomány, indexelt állomány), és halmaz.
- az összetett adat különböző típusú részekből áll, mely részeket minden esetben egyenként kell megadni. (rekord)
- az összetett adat ebben az esetben is többféle típusú részből állhat, de a részekre bontás is többféleképpen történhet, a részeket természetesen itt is - mint minden esetben- egyenként kell megadni. (alternatív szerkezet)
Az összetett adattípusok többsége azonos típusú elemek valamilyen sorozata (szöveg, tömb, verem, sor, lista, szekvenciális állomány, direkt állomány, indexelt állomány), melyeket a velük végezhető műveletek alapján különböztetünk meg.
Ezek a műveletek a következők lehetnek:
- tetszőleges sorszámú elem értékének felhasználása vagy megváltoztatása,
- a sorozat első eleme értékének felhasználása vagy megváltoztatása,
- a sorozat utolsó eleme értékének felhasználása vagy megváltoztatása,
- a sorozat következő eleme értékének felhasználása vagy megváltoztatása,
- a sorozat elemszámának meghatározása,
- új elem felvétele a sorozat elejére,
- új elem felvétele a sorozat végére,
- új elem felvétele a sorozat két adott eleme közé,
- a sorozat első elemének kivétele a sorozatból,
- a sorozat utolsó elemének kivétele a sorozatból,
- a sorozat adott elemének kivétele a sorozatból,
- a sorozat ürességének a vizsgálata,
- a sorozat részsorozatának felhasználása vagy megváltoztatása.
Az adatszerkezetek elemeinek a tárbeli sorrendje és az adatelemek valódi sorrendje eltérő lehet. Az előbbit fizikai, az utóbbit logikai sorrendnek nevezzük. Az adatszerkezet ábrázolásánál arra kell törekednünk, hogy az elemekkel végzett műveletek során könnyen felhasználhatók legyenek a köztük fennálló szerkezeti összefüggések. Az adatszerkezeteket tehát úgy kell elhelyezni, hogy ne csak az adatelemeket, hanem a szerkezeti összefüggéseket is ábrázoljuk.
2.1. Szöveg típus
A szöveg típus tulajdonképpen karakterek egymáshoz fűzött láncolatát jelenti, ebben az értelemben hasonló a tömbhöz. Elemei csak karakterek lehetnek, viszont az elemek számát (a szöveg hosszát) több programozási nyelv nem tartja állandónak. A tömbökhöz viszonyítva a másik különbség, hogy egyszerre nem csak egy elemmel lehet dolgozni, hanem többel, akár az összessel is. Azaz a szöveg típusra létezik az egymás után írás művelete, illetve a részképzés. Ez utóbbit néha függvényekkel valósítják meg. Részképzés alatt természetesen az egész szövegből való részkiemelését értünk, amely történhet az első karaktertől, az utolsótól vagy egy meghatározott karaktertől számolva. A típust elemi típusnak is tekinthetjük, amikor a típushoz tartozó teljes adaton végzünk műveletet. Ennek megfelelően egyes programnyelvek lehetővé teszik, hogy a programozó a saját összetett adatait kezelő műveleteket is létrehozza, ettől kezdve ezek az összetett adatok eleminek tekinthetők. Amely programnyelvben szöveg típus létezik, ott gyakran nincs karaktertípus (mert a karakter azonos az egy karakterből álló szöveggel).
minta: típusdeklaráció (pszeudo)
Tipus str20 = string[20] ( maximált hossz)
Valtozo cim,uzenet : str20
- értékadás után -
cim = 'mozi előtt'
uzenet = 'Várj rám, Baby!!!'
2.2. Tömb típus
A tömb az egyik leggyakrabban használt összetett típus, amely azonos "elemibb" adatok sorozatából épül fel. A többi sorozat jellegű adatszerkezetektől a rajta végzett műveletek különböztetik meg. A tömb olyan sorozat melynek elemszáma rögzített és bármelyik elemére (a tömbben való elhelyezkedése szerint) a tömbváltozó nevével és indexeléssel hivatkozhatunk. Olyan alapvető szerkezet, hogy egy‑két "elvetemült" nyelvtől (LOGO, FORTH) eltekintve mindegyikben megtalálható. Programnyelvekben a tömb típus megadásakor általában szükséges deklarálni a memóriabeli helyfoglalását és az indexelési rendszerét. Ez utóbbi a kezdőcím tárolását jelenti, majd az index értékéből ki lehet számítani, hogy az adott tömbelem mennyivel található a kezdőcím mögött.
A tömböket dimenzióik alapján is megkülönböztetjük, így van:
egydimenziós tömb (oszlopvektor),
kétdimenziós tömb (mátrix),
n dimenziós tömb. (térbeli tömb)
egydimenziós tömb: valójában egy olyan oszlopvektor, melynek annyi sora van, ahány elemű a tömb, és természetesen egy oszlopa.
pl.:
Var A : array [1..4] of real;
kétdimenziós tömb : mátrix, melynek sorai és oszlopai vannak. pl.:
Var B : array [1..3,1..4] of integer;
i = sorindex , j = oszlopindex
A példában egy 12 elemű mátrixot mutattunk be, melynek 3 sora és 4 oszlopa van. A mátrix mellett a 3. sor 2. oszlopának elemét tüntettük fel. Itt jegyezzük meg, hogy a mátrixok összeadása és kivonása csak azonos sor és oszlop szám esetén lehetséges. A mátrixok szorzása már több elemi matematikai művelet egymás utáni használatát igényli, melyre itt most nem térünk ki.
háromdimenziós tömb: amelyben az elemek sorokban, oszlopokban vannak és az így alkotott rétegek egymás mellett, térben helyezkednek el. A háromdimenziós tömböt gyakran hívjuk térbeli tömbnek is. pl.:
Var C array [1..3,1..4,1..7] of byte;
A tömbnek 3 sora, 4 oszlopa, vastagságban (vagy mélységben) pedig 7 rétege van