Témakörök: Rekord adattípus Egymásba ágyazott rekordok With utasítás Változó rekord Rekord konstans
1. A rekord adattípus Sokszor találkozunk olyan feladattal, melyben összetartozó adatokat, adatcsoportokat kell kezelni. Ilyen például a következő: Feladat: Készítsünk nyilvántartást az osztálypénzről! A következő adatokat kell nyilvántartani: ÖNév (max. 20 karakter) ÖBefizetett összeg (egész szám) ÖTartozás (egész szám)
A feladat megoldása... Vegyünk mintának egy táblázatot:
Név
Befizetett összeg
Tartozás
Nagy Lajos
350
200
Kis Aladár
100
400
Búza Virág
600
0
Megoldás tömbök segítségével... A tömbök segítségével azonos típusú adatokat tudunk tárolni. Mivel a feladatban ez nem valósul meg, az egyik megoldás lehet a párhuzamos tömbök használata. Három különböző tömböt vegyünk fel: Az egyikben a neveket, a másikban a befizetett összeget, a harmadikban a tartozást tároljuk. Osztály-Név: Tömb (1 . . 40) : szöveg[20] Osztály-Befizetés: Tömb(1 . . 40) : egész Osztály-Tartozás: Tömb(1 . . 40) : egész
Tárolás a memóriában... Ezek a tömbök a memó-riában egymás után helyezkednek el.
Nagy Lajos ...
Osztály-Név[40] 350
Egy adatcsoport mozga-tása ebben a konstruk-cióban csak adatonként lehetséges.
Osztály-Név[1]
Osztály-Befizetés[1]
... Osztály-Befizetés[40] 200
Osztály-Tartozás[1]
... Osztály-Tartozás[40]
Megoldás rekord segítségével... A másik megoldás a rekord használata. A rekord a különböző típusú, de összetartozó adatokat összefogja, azokat egy adatként kezeli. Az ilyen adatcsoportok a memóriában egymás után helyezkednek el, és az egész adatcsoportra egy névvel lehet hivatkozni. A rekord összetartozó adatait mezőknek nevezzük.
A rekord adattípus deklarációja Type 0 Ha vannak azonos típusú mezők, TRekord = Record akkor ezeket ,-vel választhatjuk el Mező1 : Típus1 ; egymástól. Mező2 : Típus2 ; 0 Több rekordtípusban szerepelhet ... ugyanaz a mezőnév, de egy MezőN : TípusN ; rekordon belül a mezőnévnek End; egyedinek kell lenni! Var Elem : TRekord; (Elem egy TRekord típusú változó) Tomb : Array[1 . . 100] of TRekord (Tomb egy rekordokból álló tömb)
Hivatkozás a rekord mezőire... A rekord mezőire a következőképpen hivatkozhatunk: Elem.Mező1, Elem.Mező2 . . . Tomb[1].Mező1, Tomb[1].Mező2, . . . Tomb[i].MezőN
A feladat megoldása: Az osztály nyilvántartása: Type Tag = Record Nev : String[20] ; Befizetes , Tartozas : Word ; End; Var Osztaly : Array[1 . . 40] of Tag
A tömb feltöltése: For I:=1 to 40 do Begin Write(’Kérem írja be a nevet:’); Readln(Osztaly[ I ].Nev); Write(’Kérem írja be a befizetett összeget:’); Readln(Osztaly[ I ].Befizetes); Write(’Kérem írja be a tartozás mértékét:’); Readln(Osztaly[ I ].Tartozas); End;
A tömb feltöltése más módon: A tömböt úgy is feltölthetjük, hogy mindig egy rekordba visszük be az értékeket, majd az adatcsoportot áttesszük a tömbbe: For I:=1 to 40 do Begin 0A Gyerek változó Readln(Gyerek.Nev); Tag típusú Readln(Gyerek.Befizetes); Readln(Gyerek.Tartozas); Osztaly[I]:=Gyerek End;
Az Osztály tömb elhelyezkedése a memóriában: Osztály[1]
Nagy Lajos
Név
350
Befizetés
200
Tartozás
Osztály[2]
Név Befizetés Tartozás
... Osztály[40]
Név Befizetés Tartozás
2. Egymásba ágyazott rekordok ªElőfordulhat, hogy a rekord mezője
szintén rekord típus. Ekkor egymásba ágyazott rekordról beszélünk. ªA rekordokat tetszőlegesen egymásba ágyazhatjuk. ªA túl sok egymásba ágyazástól azonban óvakodjunk, mert a program áttekinthetetlen lesz!
Egymásba ágyazott rekordok Type Tnev = String[20]; Tdatum = Record Ev : Word; Ho : 1 . . 12; Nap : 1 . . 31; End; Tszemely = Record Nev : Tnev; Szuldatum : Tdatum; Anya : Tnev; End; Var Szemely : Tszemely
Egymásba ágyazott rekordok Előfordulhat, hogy meg kell jegyezni az anya nevét és születési dátumát: Tszemely = Record Nev : Tnev; Szuldatum : Tdatum; Anya : Record Nev : Tnev; Szuldatum : Tdatum; End; End;
A deklarált adatok struktúrája: Szemely Nev
Szuldatum Ev
Ho
Anya Nap
Nev
Szuldatum
Ev Az elemi adatok a struktúra végein helyezkednek el. A Szemely változó összesen nyolc elemi adatból áll. Pl.: Szemely.Nev, Szemely.Szuldatum.Ev, Szemely.Anya.Szuldatum.Ev
Ho
Nap
3. With utasítás A rekord használata az előnyök mellett egy apró kellemetlenséggel is jár. A rekord mezőit állandóan minősíteni kell, ami az egyes utasításokat hosszúvá teheti, és sok gépeléssel jár. Ezt küszöböli ki a With utasítás, mely segítségével egy egész utasításcsoport minden adatát minősíthetjük: With Rekord-azonosító do Utasítás; Az utasítás általában összetett utasítás, amelyen belül elegendő csak a mezőneveket megadni.
With utasítás Egy példa a With utasítás használatára: For I:= 1 to 40 do 0 Vigyázzunk, nehogy a For elé vigyük a With utasítást, With Osztaly[ I ] do mert akkor az I értéke Begin definiálatlan lenne! Readln(Nev); Readln(Befizetes); Readln(Tartozas); End;
With utasítás A With utasításban több rekord is felsorolható. A következő két utasítás ekvivalens egymással: With R1, R2, ... , Rn do Utasítás vagy With R1 do With R2 do ... With Rn do Utasítás
With utasítás Egymásba ágyazott rekordok felsorolásakor lényeges azok sorrendje: Pl.: With Szemely, Anya, Szuldatum jó, de értelmetlen és hibás: With Szuldatum, Szemely, Anya
With utasítás Az utasításban felsorolt mezőnevekhez a fordító mindig visszafelé illeszti a rekordazonosítókat. Ha az illesztés nem sikerül, a következő azonosítót veszi figyelembe, ha az sem megfelelő a következőt, és így tovább... Pl: With Szemely, Anya, Szuldatum do Mivel a Szuldatum-hoz nem tudta begin illeszteni a Nev mezőt, ezért az Nev:=‘Kiss Virág’; Anya-t vette figyelembe. Ev:=1974; ...
4. Változó rekord Gyakran merül fel igényként, hogy a rekord többféle adatcsoportot tudjon tárolni a feltételnek megfelelően. A Pascal lehetőséget ad a változó rekord deklarálására. Ilyenkor a rekord első része mindig egy állandó rész, melyet a különböző változatok leírása követ. A rekord fizikai hosszát a leghosszabb változat határozza meg. A programból bármikor bármelyik változatra hivatkozhatunk, a helyes adattárolásra és hivatkozásra a programozónak kell figyelni.
4. Változó rekord A változó rekord szintaktikája: Type Trekord = Record Mezőlista Case Változó : Típus of Érték1 : ( Mezőlista1) ; Érték2 : ( Mezőlista2) ; ... End;
Állandó rész
Változó rész
Változó rekord Type Tfajta = ( Kor, Teglalap ); Tidom = Record szelektormező Terulet : Real; Case Fajta : Tfajta of Teglalap : ( Alap, Magassag : Real) ; Kor : ( Sugar : Real) ; End; Var Sikidom : Tidom; A szelektormező értékétől függ, ... hogy melyik lista van érvényben. Sikidom := Kor; Sikidom . Sugar := 4;
Változó rekord Az előbbi példában szereplő rekord fizikai hossza: Terulet : 6 byte Fajta: 1 byte Alap : 6 byte Magassag: 6 byte 12 byte Sugar : 6 byte Tehát a hossz: 6+1+6+12=19 byte
5. Konstans rekord A rekordot - ugyanúgy mint tömböt definiálhatjuk kezdőértékkel rendelkező rekordként. A rekord mezőinek úgy adunk kezdőértéket, hogy zárójelben felsoroljuk az egyes mezők azonosítóit, és kezdőértékeit. Az értékadásokat pontosvesszők választják el egymástól.
Konstans rekord Type Tszemely = Record Nev : string[20]; IQ : byte; End; Const Szemely : Tszemely = (Nev : ‘Kiss Éva’ ; IQ : 120)
Vége