Professional Documents
Culture Documents
hu
Programozás
Kiegészítő jegyzet
2001
Programozás
Tartalomjegyzék
Programozás elmélet ............................................................................................................................................... 4
1. A programkészítés lépései .............................................................................................................................. 4
1.1. A feladat megfogalmazása ...................................................................................................................... 4
1.2. A feladat modellezése ............................................................................................................................. 4
1.3. Az algoritmus meghatározása ................................................................................................................. 5
1.4. A szükséges hardver és szoftver környezet megállapítása ...................................................................... 5
1.5. Az algoritmus kódolása........................................................................................................................... 5
1.6. A program tesztelése, hibakeresése, javítása .......................................................................................... 5
1.7. A hatékonyság növelése, optimalizálás ................................................................................................... 6
1.8. A dokumentációk elkészítése .................................................................................................................. 6
1.8.1. Felhasználói dokumentáció .................................................................................................................. 6
1.8.2. Fejlesztői dokumentáció ...................................................................................................................... 6
1.9. A működő program karbantartása, felügyelete ....................................................................................... 6
2. Az adatszerkezetek ......................................................................................................................................... 6
2.1. Elemi adattípusok ................................................................................................................................... 6
2.2 Összetett adattípusok ............................................................................................................................... 7
3. Műveletek a számítógépen (programozási eszközök) ..................................................................................... 8
3.1. Értékadás ................................................................................................................................................ 8
3.2. Adatbevitel és adatkiírás ......................................................................................................................... 8
3.3. Elágazások, feltételes programvégrehajtás ............................................................................................. 8
3.4. Ciklusszervezés ....................................................................................................................................... 8
3.5. Függvények ............................................................................................................................................. 9
3.6. Eljárások ................................................................................................................................................. 9
4. Algoritmus leíró eszközök .............................................................................................................................. 9
4.1. Folyamatábra .......................................................................................................................................... 9
4.2. Mondatszerű leírás ................................................................................................................................ 10
4.3. Struktrogram ......................................................................................................................................... 11
5. Alapvető algoritmus típusok (programozási tételek) .................................................................................... 11
5.1. Összegzés .............................................................................................................................................. 11
5.2. Eldöntés ................................................................................................................................................ 11
5.3. Kiválasztás ............................................................................................................................................ 12
5.4. Keresés.................................................................................................................................................. 12
5.5. Megszámlálás........................................................................................................................................ 12
5.6. Maximum- ill. minimum kiválasztás ..................................................................................................... 13
5.7. Kiválogatás ........................................................................................................................................... 13
5.8. Rendezés ............................................................................................................................................... 13
5.9. Szétválogatás ........................................................................................................................................ 14
5.10. Metszetképzés ..................................................................................................................................... 14
5.11. Egyesítés ............................................................................................................................................. 15
5.12. Összefuttatás ....................................................................................................................................... 15
6. Programozási módszerek .............................................................................................................................. 16
6.1. A "majd lesz valahogy" elv .................................................................................................................. 16
6.2. Moduláris programozás ........................................................................................................................ 16
6.3. Struktúrált programozás ........................................................................................................................ 16
6.4. Objektum - Orientált Programozás -> OOP .......................................................................................... 16
6.5. Eseményvezérelt programozás .............................................................................................................. 16
6.6. Vizuális programozás............................................................................................................................ 17
Programozás Pascal nyelven ................................................................................................................................. 17
1. Kialakulása ................................................................................................................................................... 17
2. Pascal implementációk ................................................................................................................................. 17
3. Programkészítés TP6.0 segítségével ............................................................................................................. 17
3.1. Parancssoros fordítóval – TPC.EXE ..................................................................................................... 17
3.2. A TP6 saját fejlesztői környezetét használva (IDE).............................................................................. 17
4. A Pascal forrás program felépítése (szintaktikája)........................................................................................ 19
5. Unitok és használatuk ................................................................................................................................... 21
Programozás
Programozás
Programozás elmélet
1. A programkészítés lépései
Egyszerű esetben lehet úgy is programot írni, hogy egy-két mondatos feladat megfogalmazás után azonnal a számítógép
elé ülünk, majd a feladatnak megfelelően begépeljük a szükséges utasításokat. Jobb esetben elindítjuk a programot, és
ha hibát találunk, javítunk, majd valamilyen formában tároljuk.
Ez mindaddig megy is, amíg egyszerűbb feladatról van szó, és csak saját magunknak dolgozunk, de ha bonyolult,
összetett feladatról van szó, akkor egy idő után megakadunk. Ha a program végre futni is fog és abban esetleg
valamilyen változtatásra van szükség, akkor viszont vége, nincs tovább, újra kell írni.
Ebben a részben olyan ismereteket fogunk tanulni, amelyek segítenek az ilyen buktatók kikerülésén és hatékonyan
segítik a számítógépes munkánkat.
A feladat megfogalmazása a megoldás első lépése, amelynek során egyértelműen rögzíteni kell (lehetőleg írásban) az
elérendő célt a lehetséges pontossággal, a figyelembe vehető feltételekkel, különböző korlátok megadásával. Itt lehet
elkövetni az első hibákat. Ha ugyanis a megfogalmazás nem világos, nem egyértelmű, akkor lehet, hogy a kész program
nem egészen úgy és azt tudja, amit a feladat kitűzője gondolt.
Feladat: Írassuk ki azon tanulók nevét, akik 4-esnél jobb tanulmányi eredményt értek el!
Felmerülő kérdések:
− Hol tároljuk a neveket és a tanulmányi eredményeket, a program elején kell beolvasni, vagy esetleg
állományban, vagy valahol máshol tároljuk?
− Maximum hány tanuló lehet?
− Hova kell kiírni (képernyő, nyomtató) és hogyan írjuk ki, egymás mellé, egymás alá, egy oldalra egyet, vagy
többet?
− Rendezett-e a névsor a tanulmányi eredmény szerint, vagy sem?
Ezeket a kérdéseket mindenképpen tisztázni kell, hogy a programot el tudjuk készíteni.
Annak ellenére, hogy a számítógép felhasználásával megoldott feladatok nagy része nem matematikai problémaként
fogalmazódik meg, az eredmény előállításához legtöbbször matematikai és logikai eljárások sorozatos alkalmazására
van szükség. A megfogalmazott feladatokhoz ezért általában matematikai modellt kell keresni.
Ezek a modellek - mint az egyéb modellek - a valóság többé-kevésbé hű másai, esetünkben matematikai eszközökkel
megvalósított másolatok.
Pl. a feladat: egy adott osztály tanulmányi eredményének meghatározása egy adott tantárgyból.
A tanár így látja a megoldást:
− vesszük az első tanuló eredményét majd hozzáadjuk a 2. tanulóét majd így tovább az utolsó tanulóig
− majd ezt az összeget osztjuk az osztály létszámával.
A matematikus:
− tekintsük az eredményeket egy N-elemű számsorozatnak ekkor a tanulmányi eredmény:
Programozás
∑ ai
TE = i =1
N
Tehát a megoldás matematikai megfogalmazása, modellje egyetlen rövid képletbe sűríthető.
A modell alkotásának van egy olyan előnye is, hogy a különbözőnek látszó problémák ugyanazzal a módszerrel
megoldhatók. Így előfordulhat, hogy már meglévő eljárásokat használhatunk fel, nem kell újra munkát befektetni.
Az algoritmus meghatározása, a megoldási folyamatnak az eredmény előállításáig vezető logikai felépítése igen fontos
lépése a problémamegoldásnak.
Az algoritmusoknak feltétlenül rendelkezniük kell néhány alapvető tulajdonsággal. Ezek:
Általánosság
A megadott algoritmus nem csak a szóban forgó speciális feladat esetén vezessen a probléma megoldására, hanem a
hasonló jellegű feladatok széles körére szolgáltasson helyes eredményt.
Teljesség
A választott algoritmus a feladatkör minden lehetséges megoldását szolgáltassa. Ehhez az szükséges, hogy a bemenő
adatok minden szóba jöhető értékére (értelmezési tartomány) felkészült legyen az algoritmus. A teljesség és az
általánosság követelménye egymásnak ellentmondó ezért célszerű a két tulajdonságnak a megoldás szempontjából
optimális kielégítését kitűzni.
Végesség
Az eredmény véges számú lépésben elérhető legyen.
Egyértelműség
Azonos körülmények között (ugyanolyan bemenő adatokkal) az eljárást megismételve azonos eredményeket kapjunk.
Értelmezettség
Legyen pontosan körülhatárolt az a bemenő adathalmaz, amelyre az algoritmus megoldást szolgáltat.
Hardver környezet: meghatározza, hogy milyen típusú számítógép, minimálisan milyen részegységekből (pl. memória,
háttértár kapacitás) épüljön fel, esetleg milyen speciális kiegészítőkre van szükség a program futtatásához.
Szoftver környezet: az adott hardveren milyen egyéb programok futtatását igényli. A legfontosabb, hogy milyen
operációs rendszer (és milyen verziójú) szükséges a futtatáshoz.
Ez a fázis a programtermék elkészítése során talán a legtöbb figyelmet igényli. Ugyanis ha a programozó nem járja
végig az összes lehetséges végrehajtási utat, amit a programfutás során el lehet képzelni, akkor az esetleges hiba csak a
program használata során derül ki. Ez viszont adatvesztéshez, akár anyagi kárhoz is vezethet. Először meg kell
vizsgálni, hogy a program az elvárt funkcióknak eleget tesz-e. Ez a tesztelés folyamata.
Ha ennek során hibajelzést kapunk, akkor azt meg kell keresnünk. Ez a hibakeresés.
Ha megtaláltuk a hibát, akkor azt javítanunk kell, ez a hibajavítás.
Ezután ismételten meg kell győződnünk a program működésének helyességéről, s mindaddig folytatni az előbbiekben
Phare kísérleti program 5
Forrás: http://www.doksi.hu
Programozás
Kétféle dokumentáció létezik, egyik a felhasználó számára készül, míg a másik a programozónak.
Ez a felhasználó számára készül. Önálló, a kész programmal együtt átadandó szöveg, mely megad minden a program
használatához szükséges információt.
Tartalmazza:
− a feladat megfogalmazását
− a programnyelv meghatározását
− a futtatáshoz szükséges géptípust, konfigurációt - hardver feltételek
− a program installálását, betöltését, indítását
− a program használatát, kezelését
− az esetleges hibajelzéseket és annak javítási lehetőségeit
− egy tipikus futtatás teljes leírását
− a program fejlesztési lehetőségét, annak feltételeit
A felhasználónak éreznie kell, hogy nem hagyták magára a mély vízben az új programmal az első számítógépén. Tudnia
kell, hogy ha gondja, problémája van, mindig van valaki, aki segít. Ezt túlzásba sem szabad vinni, mindig az igényekhez
kell alkalmazkodni.
2. Az adatszerkezetek
Az adattípus megadá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 a rögzítését jelenti.
Az adattípusok kétfélek lehetnek: elemiek amelyeknek felhasználói szempontból nincs belső szerkezetük, valamint
összetettek, amelyek elemiekből épülnek fel, ezek az adatszerkezetek.
Egész számok: Legtöbbször két byte-on ábrázolják, kettes komplenens kódban. Így az értékkészlet a -32768 és 32767
közötti számok halmaza.
Valós számok: A számítógépben kettes vagy tízes számrendszerben is ábrázolhatók a racionális számok. Megadásuk
egy 0 és 1 közötti számmal és hatványkitevővel történik (számok normál alakja).
Phare kísérleti program 6
Forrás: http://www.doksi.hu
Programozás
Az összetett adattípusokban az egyes adatelemek valamilyen sorrendi, szerkezeti összefüggésben állnak egymással.
Tömb
A tömb egy olyan sorozat, amelynek elemszáma rögzített és bármely elemére egy indexszel (sorszámmal)
hivatkozhatunk. Általában a tömb elemei azonos típusúak.
Szöveg
A szövegtípus hasonlít a tömbhöz. Elemei csak karakterek lehetnek, viszont az elemek száma (a szöveg hossza)
változhat. A szövegekkel műveleteket is lehet végezni (pl. hozzáfűzés, részképzés).
A verem
Gyakran használt adatszerkezet, amelyet általában nekünk kell megvalósítani, ha szükségünk van rá. A verem adatok
sorozatát tartalmazza, de csak speciális műveleteket engedünk meg vele kapcsolatban:
− PUSH(x) - egy x értéket a verem tetejére (a sorozat végére) helyez.
− POP(x) - a verem tetején (a sorozat végén) lévő értéket az x változóba teszi, majd a veremből eltávolítja
A verem szerkezete LIFO (Last In First Out) típusú, ami azt jelenti, hogy az elsőnek betett elemet dolgozhatjuk fel
először.
A sor
A sor olyan sorozat, amelynek az egyik végére lehet tenni az új elemeket, a másik végéről pedig el lehet venni őket. Ez a
FIFO (First In First Out) típusú szerkezet, mely azt jelenti, hogy az elsőnek betett elemet dolgozhatjuk fel először.
A lista
A lista olyan szerkezet, mely megmondja, hogy egy adott elemet logikailag melyik követ.
Egy adat mellé egy vagy több mutatóértéket helyezhetünk el, amely mutatók a logikailag következő vagy előző elemet
határozzák meg.
Mindig van egy első elem ez a listafej és egy utolsó 1. Elem 2. Elem 3. Elem 4. Elem 0
elem, amelyet valamilyen formában megkülönböztetünk
a listában előforduló elemektől. Ez lehet a 0 vagy a NIL
illetve a NULL is. 1. Elem 2. Elem 0 3. Elem 4. Elem
Ezen a példán jól látszik a lista előnye. A sorrend
megváltoztatásához az elemeket nem kell mozgatni, csak
a mutatókat kell átírni.
A halmaz
A halmaz olyan sorozat, ahol az elemeknek nincs definiálva a sorrendje, nincs értelme a következő elemet kérni.
Használhatjuk viszont a halmazműveleteket: egyesítés, metszet, halmazkülönbség.
A gráf
A gráf olyan adatszerkezet, amely csúcsokból (adatelemek), valamint azokat összekötő élekből (kapcsolatok) áll.
67km Hatvan 52km
Budapest 84km
Újszász
73km 17km
Cegléd 27km Szolnok
23km
Kecskemét
Bináris fa
Egy speciális gráf, amelynél minden csúcs két éllel rendelkezik és van egy kitüntetett csúcsa a
gyökér. Ezt a szerkezetet faszerkezetnek is nevezik.
Phare kísérleti program 7
Forrás: http://www.doksi.hu
Programozás
A rekord
Lényege, hogy az összetett változónak (rekord) adunk egy közös nevet, s az egyes, rendszerint különböző típusú
mezőinek szintén. Így lehetővé válik a rekord elemeinek önálló, külön kezelése és a részek együttes feldolgozása is.
pl. személynyilvántartás
− teljes személy: adat
− neve: adat.név
− születési éve: adat.születés.idő.év
Adatállományok
Ezek az adatszerkezetek a háttértárakhoz kapcsolódnak, olyan rekordsorozatok, amelyek különbözőképpen szervezettek.
Direkt állomány:
Bármelyik rekordja bármikor elérhető, módosítható. Az egyes rekordokat általában sorszámmal tudjuk azonosítani. Az
ilyen állományba írhatunk, olvashatunk, illetve az állomány végére új rekordokat vehetünk fel.
Indirekt állomány:
Az indirekt állományok azt a lehetőséget biztosítják, hogy a rekordokat nem sorszámmal, hanem jellemző adatukkal
azonosíthatjuk, pontosabban a rekordokat valamelyik mezője (kulcsmező) alapján rendezetten kezelhetjük.
Ekkor az állományhoz tartozik egy táblázat, az indextábla, amely a kívánt adatot, valamint egy rekordra mutató értéket
(rekordszám) tartalmaz.
3.1. Értékadás
Ezeknek az utasításoknak a segítségével a program és a külvilág közötti adatcserére nyílik lehetőségünk. A bevitel
általában a billentyűzetről vagy háttértárolóról történik. A kivitel általában a monitor, a nyomtató vagy a háttértároló
segítségével valósul meg.
Az egyes programrészek végrehajtása egy logikai feltételtől függ. Ha a logikai feltétel igaz, akkor az egyik utasítás vagy
utasítássorozat kerül végrehajtásra, ha nem, akkor a másik utasítás vagy utasítássorozatok hajtódnak végre.
pl.:
Ha feltétel akkor utasítások1
különben utasítások2
Elágazás vége
3.4. Ciklusszervezés
Akkor alkalmazzuk, ha egyes utasításokat többször egymás után végre szeretnénk hajtatni. Több lehetőség is van:
Phare kísérleti program 8
Forrás: http://www.doksi.hu
Programozás
3.5. Függvények
A függvények fő sajátossága, hogy nevük egy értéket képvisel. Típusuk pontosan meghatározott. A függvényekre nevük
és paramétereik leírásával hivatkozhatunk. Pl.:
SIN(x) függvény az x szám szinuszát jelenti.
3.6. Eljárások
Az eljárások annyiban különböznek a függvényektől, hogy nem értéket, hanem valamilyen tevékenységet képviselnek.
Ezekre is nevükkel és paramétereikkel hivatkozhatunk.
Célja: a megoldás menetének géptől független, szemléletes, a logikai gondolatmenetet, a szerkezeti egységeket
világosan tükröző leírása.
4.1. Folyamatábra
Szimbólumok és jelentéseik:
Programozás
Ki
n - elágazás, a feladat végrehajtás a rombuszba írt feltétel alapján egyik vagy másik irányban
i folytatódik, a kér kimenet: Igaz (i), vagy Nem (n)
pl: Ciklusszervezés
Start A folyamatábrákban nyilakkal jelöljük a haladás irányát. Folyamatábra készítése, csak egyszerűbb
algoritmusok esetén javasolt, mivel egy bonyolultabb szerkezeten nehéz követnünk a lépéseket.
I:=1
Ki: I
I:=I+1
n
I=10?
i
Stop
4.2. Mondatszerű leírás
Az algoritmus egymást követő lépéseit mondatokkal vagy mondatszerű szerkezetek egymásutánjával próbáljuk leírni.
Két fajtája van.
Mondatok
Egyszerűbb esetben a mondatok sorozata írja le a feladatok megoldását. Ezeket sorszámmal látjuk el, hogy később
hivatkozni tudjunk rajuk. Pl.:
Feladat: olvassunk be N db természetes számot, és határozzuk meg ezek összegét.
Algoritmus:
1. N beolvasása
2. Ha N<=0 vagy N nem egész szám, akkor 1
3. S:=0
4. Ciklus I=1-töl N-ig : A beolvasása : S:=S+A : Ciklus vége
5. S kiírása
Mondatszerű szerkezetek
Szemléletesebb az, amikor mondatok helyett csak ún. mondatszerű szerkezetek egymásutánjával írjuk le a feladat
megoldását. Ha ezeket a mondatszerű szerkezeteket definiáljuk, rögzítjük, akkor tulajdonképpen egy algoritmus leíró
nyelvet hozunk létre.
Egy példa algoritmus leíró nyelvre:
Értékadás: változó := kifejezés
Beolvasás: Be: változók felsorolása {az adatokkal szemben támasztott követelmények}
Kiírás: Ki: kifejezések felsorolása {a kiírás formájára vonatkozó követelmények}
Elágazások: Lásd Műveletek számítógépen
Ciklusszervezés: Lásd Műveletek számítógépen
Eljárások: eljárásnév (paraméterek)
:
: az eljárás utasításai
:
Eljárás vége
Egyéb jelölések:
Phare kísérleti program 10
Forrás: http://www.doksi.hu
Programozás
− Egy sorba több utasítást is írhatunk, de közéjük ";"-t vagy ":"-t kell tenni.
− Megjegyzések { } között.
− Alkalmazzunk bekezdéseket az egyes szerkezetek megkülönböztetésére.
4.3. Struktrogram
A struktogram elkészítése során az algoritmust egy téglalapba készítjük el, mely tartalmazza az utasítások szövegét.
Majd ehhez továbbiak illeszthetők.
2. utasítás
Feltétel Elágazás esetén a téglalapot három részre osztjuk. A felső részbe a feltétel
kerül. A végrehajtás azon az oldalon folytatódik, amelyik állítás teljesül.
Igaz Hamis
Ciklusmag
5.1. Összegzés
Általános feladat:
Adott egy N elemű számsorozat. Számoljuk ki az elemek összegét! A sorozatot egy N elemű A(N) tömbben tároljuk.
Algoritmus
Eljárás
S:=0 {Az elemek összegét tárolja}
Ciklus I=1-től N-ig
S:=S+A(I)
Ciklus vége
Eljárás vége.
5.2. Eldöntés
Általános feladat
Adott egy N elemű sorozat és egy, a sorozat elemein értelmezett T tulajdonság. Feladat annak eldöntése, hogy van-e a
sorozatban legalább egy T tulajdonsággal rendelkező elem.
Phare kísérleti program 11
Forrás: http://www.doksi.hu
Programozás
Algoritmus
Eljárás
i:=1
ciklus amíg i<=N és A( i ) nem T tulajdonságú
i:=i+1
Ciklus vége.
VAN := i<=N {VAN egy logikai változó, igaz értéke jelzi, hogy nem T
tulajdonságú elem}
Eljárás vége.
Alkalmazás
Volt-e egy adott tantárgyból bukás egy adott osztályban? Számsorozat: jegyek; T tul.: 1-es jegy
5.3. Kiválasztás
Általános feladat
Adott egy N elemű sorozat, egy, a sorozat elemein értelmezett T tulajdonság, valamint tudjuk, hogy a sorozatban van
legalább egy T tulajdonságú elem. A feladat ezen elem sorszámának meghatározása.
Algoritmus
Eljárás
I:=1
Ciklus amíg A(I) nem T tulajdonságú
I:=I+1
Ciklus vége
SORSZ:=I
Eljárás vége
Alkalmazás
Keressük meg, hogy NAGY PISTI hányadik a névsorban. { A( ) }
5.4. Keresés
Általános feladat
Adott egy N elemű sorozat és egy, a sorozatban értelmezett T tulajdonság.
Feladat: eldönteni, hogy van-e T tulajdonságú elem a sorozatban, és ha van, akkor adjuk meg a sorszámát is.
Algoritmus
A keresési feladatokra több algoritmus is ismert lineáris, logaritmikus. Mi most csak a legegyszerűbbet ismerjük meg a
lineárist.
Eljárás
I:=1
Ciklus amíg I< =N és A(I) nem T tulajdonságú
I := I+1
Ciklus vége
VAN := I< =N
Ha VAN, akkor SORSZ := I
Eljárás vége
Alkalmazás
Ismert egy osztály névsora { A( ) }. Adjunk meg egy NAGY vezetéknevűt!
5.5. Megszámlálás
Általános feladat
Adott egy N elemű sorozat és egy T tulajdonság. Számoljuk meg, hogy hány ilyen T tulajdonságú elem van a
sorozatban!
Programozás
Algoritmus
Eljárás
S := 0
Ciklus I=1-től N-ig
Ha A(I) T tulajdonságú, akkor S := S+1
Ciklus vége
Eljárás vége
Alkalmazás
Osztály névsora ismert. Adjuk meg a Nagy vezetéknevűek számát!
Általános feladat
Egy sorozat legnagyobb, ill. legkisebb elemének sorszámát kell megtalálni.
Algoritmus
Max. elem
INDEX := 1
Ciklus I=2-től N-ig
Ha A( INDEX)< A(I) akkor INDEX := I
Ciklus vége
MAX INDEX := INDEX
Eljárás vége
Alkalmazás
Ismert egy osztályban {N} a 60m-es futás időeredménye { A( ) }. Adjuk meg a leggyorsabb tanuló nevét { B( ) }!
5.7. Kiválogatás
Általános feladat
Egy N elemű sorozat összes T tulajdonsággal rendelkező elemét kell meghatározni. A kiválogatott elemeket gyűjtsük a
B( ) tömbbe!
Algoritmus
Eljárás
J := 0
Ciklus I=1-től N-ig
Ha A(I) T tulajdonságú, akkor J := J+1; B(J) := I
Ciklus vége
Eljárás vége
Alkalmazás
Ismert egy osztályban {N} a 60n-es futás időeredményei { A( ) }. Adjuk meg azon tanulók nevét, akik egy X időnél
jobb időt futottak { B( ) }!
5.8. Rendezés
Általános feladat
Adott egy rendezetlen sorozat. Feladat a sorozat adott tulajdonsága szerint növekvő vagy csökkenő sorrendben rendezett
sorozat előállítása.
Algoritmus
Igen sokféle rendezési algoritmus van. Az, hogy melyiket választjuk, függ a módszer tárigényétől, a végrehajtási időtől,
az eljárás során végrehajtott összehasonlítások, ill. mozgatások, cserék számától. A legegyszerűbb a közvetlen
kiválasztásos rendezés.
Eljárás
Ciklus I=1-től N-ig
Ciklus J=1-től N-ig
Phare kísérleti program 13
Forrás: http://www.doksi.hu
Programozás
Alkalmazás
Egy osztály tanulóinak névsorba rendezése.
5.9. Szétválogatás
Általános feladat
Adott egy sorozat, valamint egy kijelölt elem (pl. X=A(1). Cseréljük fel úgy a sorozat elemeit, hogy az X-nél kisebbek
X előtt legyenek, a nála nagyobbak pedig utána.
Algoritmus
Eljárás
X := A(1)
E := 1
U := N
ciklus amíg E<U
ciklus amíg E<U és A(U)>=X
U := U-1
ciklus vége
Ha E<U akkor
A(E) := A(U)
E := E+1
ciklus amíg E<U és A(E)<=X
E:=E+1
Ciklus vége
Ha E<U akkor
A(U) := A(E)
U := U-1
Elágazás vége
Elágazás vége
Ciklus vége
A(E):=X
Eljárás vége
Alkalmazás
Egy osztály tanulóiról tudjuk, hogy ki fiú és ki lány. Feladat olyan sorrend előállítása, ahol a lányok vannak elől, a fiúk
pedig a végén.
5.10. Metszetképzés
Általános feladat
Adott egy N és egy M elemű halmaz az A( ) és a B( ) tömbökben. Készítsük el a két halmaz metszetét a C( ) tömbbe.
Két halmaz metszetébe azok az elemek tartoznak, amelyek mindkettőben szerepelnek.
Algoritmus
Eljárás
CN:=D
ciklus I=1-től N-ig
J:=1
ciklus amíg J<=M és A(I)< >B(J)
J:=J+1
ciklus vége
Ha J<=M akkor
CN := CN+1
C(CN):=A(I)
Phare kísérleti program 14
Forrás: http://www.doksi.hu
Programozás
Elágazás vége
ciklus vége
Eljárás vége
Alkalmazás
Adott egy osztály névsora és adott azoknak a tanulóknak a névsora, akik az iskolában vannak gyakorlati oktatáson.
Feladat az adott osztályból azon tanulók nevének kiíratása, akik az iskolában vannak gyakorlaton.
5.11. Egyesítés
Általános feladat
Adott egy N és egy M halmaz az A( ) és a B( ) tömbben. Készítsük el a két halmaz egyesítését (unióját) a C( ) tömbben!
Az unióba azok az elemek tartoznak, amelyek legalább az egyikben szerepelnek!
Algoritmus
Eljárás
ciklus I=1-től N-ig
C(I):=A(I)
Ciklus vége
CN:=N
ciklus J:=1-től M-ig
I:=1
ciklus amíg I<=N és A(I)< >B(J)
I:=I+1
ciklus vége
Ha I>N akkor
CN:=CN+1
C(CN):=B(J)
Elágazás vége
ciklus vége
Eljárás vége
Alkalmazás
Adott két lista. Az egyikben szerepelnek azok a tanárok, akik az iskola dolgozói, vagyis innen kapják a fizetésüket. A
másik listában szerepelnek a külső óraadók. Feladat mindazon tanárok nevének kilistázása, akik az iskolában bármit
tanítanak.
5.12. Összefuttatás
Általános feladat
Adott két rendezett sorozat A(N) és B(M). Állítsunk elő belőlük egy sorozatot, hogy a rendezettség megmaradjon és az
eredeti sorozatok minden eleme szerepeljen benne. (Az unio speciális esete)
Algoritmus
Eljárás
I := 1
J := 1
K := 0
A( N+1 ) := +végtelen
B( M+1) := +végtelen
Ciklus amíg I<N+1 vagy J< M+1
K:=K+1
Ha A( I )<B(J) akkor
C( k) := A(J)
I := I+1
Elágazás vége
Ha A(I) > B( J) akkor
C(k) := B(J)
J:=J+1
Phare kísérleti program 15
Forrás: http://www.doksi.hu
Programozás
Elágazás vége
Ha A(I)=B(J) akkor
C(J) := A(J )
I := I+1
J := J+1
Elágazás vége
Ciklus vége
Eljárás vége
Alkalmazás
Az előző feladat névsorba rendezett listák esetén.
6. Programozási módszerek
A feladat ismertetése után, mindenféle előzetes gondolkodás nélkül leülünk a gép elé és nyomkodjuk a billentyűt.
Azután meg majd lesz valahogy.
Általában mindenki így kezdi. Ez a próbálkozások, kísérletezések időszaka. A lehetséges hibaüzenetek megismerésének
időszaka. Egy összetettebb feladat esetén túlnőhet rajtunk, ismeretlenné válik a program. Egy komolyabb javítás felér
egy öngyilkossági kísérlettel.
Lényege, hogy az adott feladat felbontható olyan részfeladatokra, amelyeket egymástól függetlenül is el lehet készíteni
és le lehet tesztelni. Ilyenkor csak arra kell figyelni, hogy az egyes rutinok milyen változókon, paramétereken keresztül
vannak kapcsolatban. Ezeket a változókat, paramétereket azután a munka megkezdése előtt pontosan meg kell határozni,
rögzíteni kell. Általában nagyobb méretű programok esetén alkalmazzák, így egyszerre több programozó tud dolgozni
ugyanazon a programrendszeren.
Lényege, hogy az adott feladatot először globálisan, teljes körűen kell definiálni. Vagyis egy modellt kell készíteni, ami
a legjobban lefedi a feladat összes jellemzőjét. Definiálni kell a bemeneti (input) és kimeneti (output) adatokat, és
azokat a műveleteket, melyeket a programnak a bemeneti adatokkal el kell végezni, hogy a megfelelő kimeneti adatokat
kapjuk meg.
Ezek után a feladatokat lépésenként egyre jobban finomítani kell, míg el nem jutunk a program utasítások szintjére. Ez
bonyolultabb feladat esetén soklépéses folyamat, de célszerű következetesen végigvinni (mivel így biztos, hogy nem
fogunk összekeveredni a rutinok között). Jól definiált helyeken jól tesztelhető programhoz jutunk, és egyben a
dokumentáció is majdnem készen van.
Az OOP az eddigi módszerekkel ellentétben a valóság hű megközelítésén alapszik. Az OOP-ben, úgy mint a valós
világban is, a programozó tárgyakat (object - objektum) kezel. Minden tárgyat nemcsak alakja, elhelyezkedése
jellemez, hanem az is, hogyan viselkedik bizonyos körülmények között. Az OOP-ben ezt a két jellemzőt statikus és
dinamikus tulajdonságoknak nevezik.
Egy objektum deklarálásakor definiálni kell a szerkezetét és azokat a szubrutinokat is, melyek az objektum viselkedését
írják le. Az OOP előnye, hogy ezeket a tulajdonságokat így együtt lehet kezelni valamint, hogy egy objektum örökölhet
tulajdonságokat egy másik objektumtól.
Az eseményvezérelt programozás az egyik legújabb programozási technika. Filozófiája is teljesen eltér az eddigi
programozási technikáktól. Az előző technikák esetében mindig a programozó döntötte el, hogy milyen sorrendben
követik egymást az egyes feladatokhoz tartozó utasítások, eljárások. Az eseményvezérelt programozásnál a programozó
sohasem tudja előre, hogy milyen feladatot kell elvégezni a következő pillanatban, csak azt tudja, hogy milyen
események (event) történhetnek, és ezekhez az eseményekhez milyen feladatok tartoznak. Egy esemény lehet például
egy billentyű lenyomása vagy az egér elmozdítása is.
Phare kísérleti program 16
Forrás: http://www.doksi.hu
Programozás
A programok futási képernyőjét tervezzük meg tulajdonképpen úgy, hogy az eredmény azonnal látszik is. Ezek a
nyelvek felhasználják az OOP és az eseményvezérelt programozás adta lehetőségeket. Megszabadítanak minket sok
programozói munkától, mivel a futási képernyő előállítása automatikus. Pontosabban kész elemekből felépítjük a
képernyőt, és az a programfutás során ugyanúgy jelenik meg, ahogyan definiáltuk. Az egyes elemekhez itt is események
vannak hozzárendelve. Nekünk csak kiegészíteni kell a programot, hasonlóan az eseményvezérelt programozáshoz.
Mivel ezek a programnyelvek tulajdonképpen programrészeket állítanak elő automatikusan, szokták ezeket 4GL
nyelveknek is nevezni. A 4GL a 4. generációs nyelv rövidítése. Egyes rendszerek tényleg képesek arra, hogy
automatikusan forrásprogramot is előállítsanak.
2. Pascal implementációk
Több cég készített és ma is készít pascal fordító programokat. A Pascal nyelvet elsősorban DOS-os programok
készítésére tervezték, de már léteznek olyan megvalósítások is, amelyekkel Windows 3.x, Windows 9x operációs
rendszerek alatt futó programokat is készíthetünk.
A továbbiakban a Turbo Pascal 6.0 verziója lesz a kiindulópontunk. A Pascal nyelvvel kapcsolatban leírtak azonban
nemcsak erre a verzióra igazak, hanem minden Pascal implementációra is.
− először valamilyen szövegszerkesztővel elkészítjük a program forrását, ezt egy. PAS kiterjesztésű fájlba
mentjük (pl.: ELSO.PAS)
− majd a TPC.EXE segítségével elkészítjük a futtatható programot (.EXE-)
TPC ELSO.PAS
parancs hatására elkészül az ELSO.EXE futtatható program
Programozás
Az IDE indítása a TURBO begépelésével történhet. Ekkor elindul az IDE, egy menüvezérelt alkalmazás, amelynek
segítségével hatékonyabban készíthetők el programjaink. Az IDE előnyei:
− menüvezérelt rendszer
− szövegszerkesztőként is használható
− egyszerre több forrást is szerkeszthetünk
− azonnali futtatás lehetősége (nem kell kilépni az IDE felületből)
− azonnali fordítás lehetősége
− lépésenkénti (soronkénti) programvégrehajtás lehetősége
− a programban használt változók értékének folyamatos nyomkövetése a lépésenkénti végrehajtás során
− beépített segítség (HELP) rendszer
A menüvezérelt rendszer azt jelenti, hogy az egyes lehetőségek menü pontokból választható ki. Van egy főmenü, ami
az elindítás után rögtön látható (File Edit Search, stb). A főmenü egyes elemeit kiválasztva újabb menüpontok jelennek
meg, amelyekből akár megint újabb menüpontok jelenhetnek meg. A menü kezelése történhet billentyűzettel illetve az
egér segítségével is. Billentyűzetről az <ALT> + valamelyik másik billentyű lenyomásával juthatunk a főmenübe.
Minden menüpont egyik betűje ki van emelve, a File menüpontnál az F. Ha az <ALT>+<F> kombinációt nyomjuk le,
akkor a File menüt nyitottuk ki, ahogy a képen is látszik:
A beépített szövegszerkesztő a DOS EDIT programjához hasonló szolgáltatásokat nyújt, amelyeket csak akkor tudunk
használni, ha megnyitottunk egy forrás fájlt (File / Open), vagy új forrást akarunk készíteni (File / New):
− mozoghatunk a teljes szövegben (kurzor billentyűk)
− sor elejére ugorhatunk (<HOME>)
− sor végére ugorhatunk (<END>)
− egy képernyőnyit ugorhatunk felfelé (<PAGEUP> / <PGUP>)
− egy képernyőnyit ugorhatunk lefelé (<PAGEDOWN> / <PGDN>)
− törölhetünk egy karaktert (<DEL> vagy <BackSpace> / <>)
− törölhetünk egy teljes sort (<CTRL>+<Y>)
− szerkesztési üzemmódot válthatunk , beszúró vagy felülíró mód (<INS>)
− kijelölhetünk szövegrészeket, amelyekkel további műveletek végezhetők (<SHIFT> nyomva tartása mellett
kurzor billentyűk illetve a <PAGEUP>, <PAGEDOWN>)
− kijelölt szövegterület törlése (<SHIFT>+<DEL>)
− kijelölt szövegterület másolása egy átmeneti tárolóterületre, ahonnan visszamásolható (<CTRL>+<INS>)
− a tároló helyen lévő szöveg másolása a kurzor pozíciójába (<SHIFT>+<INS>)
− kijelölt szövegterület jobbra mozgatása (<CTRL>+<K> és <CTRL>+<I>)
− kijelölt szövegterület balra mozgatása (<CTRL>+<K> és <CTRL>+<U>)
A lehetőségek közül leginkább a segítség rendszert (HELP) emelném ki. Elindítása az F1 funkcióbillentyű
lenyomásával történik. Itt információk találhatók az IDE kezelésével kapcsolatban, valamint a Pascal nyelv
szintaktikájával és használatával kapcsolatban is. Ha valamilyen utasítás hirtelen nem jut eszünkbe, azt a Help-ben
megtalálhatjuk teljes leírásával egyetemben, valamint példaprogramokat is a használatához. Nagyon hasznos tud lenni.
Az eredeti HELP ugyan angol nyelvű, de elkészült a teljes magyarítása is.
Programozás
Akkor is segíthet, ha ismerem ugyan az utasítást, de nem tudom hogyan kell használni. Ekkor be kell írni az utasítást,
majd a kurzorral a beírt utasításra állni és lenyomni a <CTRL>+<F1> billentyű kombinációt. Ekkor az adott utasításhoz
tartozó segítség jelenik meg.
Az elkészült program futtatása a <CTRL>+<F9> kombináció segítségével vagy menüből a Run / Run menüponttal
történik. Kipróbálásához írjuk be első Pascal programunkat:
Begin
WriteLn(’Hello’);
End.
A program kiírja a képernyőre a Hello szöveget. Futtatás után nem láttunk semmi változást. Ahhoz, hogy a program
eredményét lássuk, le kell nyomni az <ALT>+<F5> kombinációt. Ekkor jelenik meg a futtatási képernyő. Ha most még
egy billentyűt lenyomunk, visszatérünk az IDE felületbe.
Ha .EXE állományt is szeretnénk látni a fordítás végén, akkor Compile menü Destination menüpontjában a Disk
szöveget kell látnunk. Ez a menüpont érdekesen működik, ha kiválasztjuk, akkor mintegy kapcsolóként hol Memory lesz
mellette, hol pedig Disk.
Ha csak .EXE állományt akarunk készíteni, akkor az <F9> billentyűt kell lenyomni, vagy a Compile / Make menüpontot
kiválasztani.
Az IDE felületből kilépni az <ALT>+<X> billentyű kombinációval vagy a File / Exit menüponttal lehet.
Ez egy általános felépítés, nem kell minden eleméhez ragaszkodni (ahogy az első programunknál is láttuk):
A programfej kötelezően a Program kulcsszóval kezdődik, amelyet a program neve (azonosítója) követ. Jó, ha
programnévként olyan nevet adunk, ami utal a program feladatára, és célszerű a programot ezen a néven is menteni
(hajlékony vagy merev-) lemezre. Mentéskor a program automatikusan .PAS kiterjesztést kap, ezt külön nem is kell
megadnunk. A fájlnév-adás kötöttségei egyébként ugyanazok, mint a DOS-ban (8 angol karakter stb.). A programfejben
kell megnevezni a uses kulcsszó után azokat a rendszerhez tartozó egységeket (unit-okat), amit a programírás
megkövetel. Az egységekről a későbbiekben még lesz szó, most csak annyit, hogy ezekben helyezkednek el - megfelelő
csoportosításban - a Turbo Pascal parancsai, utasításai. Ilyen unit-okat természetesen a programozó is készíthet, de ez
inkább csak a nagy méretű programok esetén indokolt.
A deklarációs részben azt adjuk meg, hogy milyen típusú változókkal fogunk dolgozni (type), az adott típusú
változóknak milyen nevet adunk (var), milyen állandókat (konstansokat) szerepeltetünk a programban (const), valamint
itt kell megadni a programban alkalmazott címkéket is (label). Mindezek a jellemzők globális jellegűek, ami azt jelenti,
hogy érvényességi tartományuk az egész program. Ebből az is következik, hogy ugyanezeknek megvannak a lokális
Phare kísérleti program 19
Forrás: http://www.doksi.hu
Programozás
A Pascal nyelvnek vannak bizonyos fenntartott szavai, amit a rendszer használ. A foglalt szavakat, vagy kulcsszavakat
a programozónak nem szabad használni a programban változók, konstansok, eljárások, vagy bármi más elnevezésére. A
foglalt szavakat foglalja össze a következő táblázat:
and asm array begin case const
constructor destructor div do downto else
end exports file for function goto
if implementation in inherited inline interface
label library mod nil not object
of or packed procedure program record
repeat set shl shr string then
to type unit until uses var
while with xor
Az azonosítók a program bizonyos elemeinek elnevezésére szolgálnak. Azonosítókat maga a Pascal is tartalmaz, pl. az
Integer, a ReadLn, vagy a Write. Vannak azonban olyan elemek, amiket nekünk kell elnevezni, pl. a programnak nevet
kell adni, az egyes változókat, konstansokat, eljárásokat is el kell keresztelni. Az azonosító ASCII karakterekből állhat
(kis- és nagybetűk, számjegyek). Vannak azonban bizonyos megszorítások:
− kis- és nagybetűket (ékezet nélkül!) tetszés szerint használhatunk
− számmal nem kezdődhet, de lehet benne
− kötőjel nem, de aláhúzásjel ( _ ) lehet benne
− szóköz, *, !, ? nem lehet
− azonos változó- vagy konstansnév nem szerepelhet kétszer (eltérő típus esetén sem)
− fenntartott szó nem lehet
− hossza nem meghatározott (de csak az első 63 karakter számít).
Az elmondottak értelmében jó nevek lehetnek a következők:
Hki, Hallgatok, Folyo_Ev, Bbe1, Bbe2, ALMA
Ezek azonban rosszak:
2Bbe, Hallgatók, Folyó Év, 222, Egy*Egy, Gyere!
Ahhoz, hogy a fordító tudja, hogy pl. a Hallgatok egy változónk azonosítója, a deklarációs részben közölni kell vele.
Saját változóink nevét a típusmegadás és a változók felsorolása helyén adhatjuk meg (a type és a var kulcsszavak után).
Az azonos típusú változókat vesszővel elválasztva lehet felsorolni.
Fontos!
A Pascal nyelv a kis- és nagybetűk között nem tesz különbséget.
Programozás
kihasználni. A képernyőn egyébként is maximálisan csak 80 karakter fér el (sőt a szövegszerkesztő ablak kerete miatt
még kevesebb). A program sorai pontosvesszővel vannak lezárva, de ez csak formai felépítés, az egyes sorok akár
egymás mellett is lehetnek. Ez azt jelenti, hogy a pontosvessző csak az egyes utasítások szétválasztására szolgál, nem
pedig a sorok lezárására.
A program adott helyein megjegyzéseket helyezhetünk el, ha indokolt. A megjegyzéseket kapcsos zárójelek közé
tesszük, de használhatjuk a (* és *) párokat is. Megjegyzés lehet például:
{Az adatbeolvasas kezdete} ,
(* Az n szerinti ciklus vege *) .
5. Unitok és használatuk
A unitok a Pascalban a moduláris programozás alapját képezik. Egy unitban definiálhatunk mindent, amit egy
programban is definiálhatunk (konstans, típus, változó, eljárás, funkció, stb). Amikor az adott unitban definiált eljárást
vagy konstanst akarom használni, akkor elég csak a unit nevével hivatkoznom a unitra, és minden abban a unitban
definiált eljárást, változót, konstanst használhatok anélkül, hogy újra definiálnom kéne.
Vagyis a program elején a Uses kulcsszó után fel kell sorolni azoknak a unitoknak a nevét, amelyekben definiált
eljárásokat vagy változókat használni akarok.
A Turbo Pascal több előre definiált unitot biztosít a programozáshoz. Ezek közül a legáltalánosabbak:
− SYSTEM, az összes program és unit automatikusan használja, így sohasem kell megadni
− CRT, képernyőkezeléssel kapcsolatos eljárásokat és változókat tartalmaz
− GRAPH, grafikus eljárások és változók gyűjteménye
− DOS, a DOS operációs rendszerrel kapcsolatos alacsony színtű eljárások gyűjteménye
Saját unitokat is készíthetünk, de ennek szintaktikája egy kicsit eltér a normál programok felépítésétől. Részletesebben
lásd a HELP-et.
6. Változók és használatuk
Egy változónak van neve, típusa és értéke. A deklarációs részben deklaráljuk a nevét és a típusát VAR kulcsszóval
bevezetve. A névvel tudunk hivatkozni a programon belül a változóra, a típus pedig meghatározza, hogy milyen típusú
értéket tárolhat a változó.
A változók nevüket onnan kapták, hogy a bennük tárolt érték változhat. A programon belül akárhányszor értéket lehet
adni egy változónak. Az értékadás a következő formában történhet:
valtozonev := érték;
A változó neve nem tartalmazhat ékezetes vagy speciális karaktereket, csak betűket, számokat és aláhúzás jelet: „_”.
A következő példa bemutatja a változók használatát:
Program Szampelda;
Var
Szam : Integer;
Begin
Szam := 12;
WriteLn(Szam);
End.
A program egyetlen Integer típusú változót használ, amelynek induláskor a 12 értéket adja. A WriteLn utasítás pedig
kiírja a képernyőre a Szam nevű változóban tárolt értéket, vagyis jelen esetben a 12-t.
Fontos!
A Pascal nyelvben minden változónak használatuk előtt értéket kell adni! Nincs
alapértékük a változóknak!
Programozás
Egész számok:
Valós számok:
Logikai érték
Karakter
Programozás
Var
Str_Tomb : Array [1..9] of String;
Byte_KetDim_Tomb : Array [1..5, 1..8] of Byte;
Begin
Str_Tomb[1] := ’Első elem’;
Str_Tomb[2] := ’Második elem’;
WriteLn(Str_Tomb[1]);
Byte_KetDim_Tomb[1,1] := 4;
Byte_KetDim_Tomb[1,2] := 5;
WriteLn(Byte_KetDim_Tomb[1,1] + Byte_KetDim_Tomb[1,2]);
End.
Az ilyen típust úgy adjuk meg, hogy valamennyi lehetséges értékét felsoroljuk. Az értékeket zárójelben, egymástól
vesszővel kell felsorolnunk. Az egyes értékeknek egyedieknek kell lenniük, valamint nem lehet szöveges típus.
Deklarálásuk:
Madarak = (fecske, golya, sas, bagoly);
Lanyok = (Anna, Jolan, Eva, Adrienn);
Napok = (Hetfo, Kedd, Szerda, Csutortok, Pentek, Szombat, Vasarnap);
Felhasználásuk:
A változó értéke a felsorolt elemek közül csak egy lehet:
Madarak := fecske;
Lanyok := Eva;
Napok := Szerda;
Ez az érték nem szöveg, nem is szám, ezért közvetlenül kiíratni sem lehet a WriteLn utasítással. A pascal az egyes
elemekhez tulajdonképpen sorszámokat (0, 1, 2, 3, ... ) rendel hozzá (nagyság szerint növekvő sorrendben – tehát
lényeges a sorrend), és a változó csak a sorszámot tárolja. Ezért is nevezik ezt a típust is sorszámozott típusnak. Ezen
kívül sorszámozott típusok még az egészek, a logikai, a char típus is, mivel ezek is véges számú rendezett elemek
halmazai.
Hasonló az előzőhöz, de itt egy intervallumot, pontosabban annak alsó és felső határát adjuk meg. Tulajdonképpen az
intervallum típus egy már létező, sorszámozott típus intervalluma. Példák:
Betuk : 'A'..'Z';
MunkaNapok : Hetfo..Pentek;
Az első példa a char típus, a második példa pedig az előző pontban ismertetett Napok sorszámozott típus intervalluma.
Az intervallum megadásánál megfigyelhetjük, hogy a Pascal az intervallumok jelölésére két pontot (..) használ.
A halmaz a matematikai halmaz pascal nyelvbeli megfelelője, némi megszorítással. A halmaz minden eleme azonos
típusú kell legyen, valamint egy halmaz elemeinek száma nem haladhatja meg a 256-ot.
Definíciójuk:
Karakterek : Set of Char;
Kisbetuk : Set of ’a’..’z’;
Nagybetuk : Set of ’A’..’Z’;
Szamjegyek : Set of ’0’..’9’;
KetjegyuSzamok : Set of 10..99;
A definiált halmazokon értelmezhetők a halmazműveletek, valamint az értékadás is:
Karakterek := [’a’..’e’];
Karakterek := [’c’, ’g’, ’j’, ’v’];
Karakterek := []; {üres halmaz}
A halmazműveletekről a 10. fejezetben lesz szó.
A rekord tulajdonképpen egy adatmező, amely különböző típusú változókból, mezőkből állhat, de egy egységként
Phare kísérleti program 23
Forrás: http://www.doksi.hu
Programozás
Felhasználásuk:
A programban egy ilyen rekord típusú változóra a következőképpen hivatkozhatunk:
Hallgato.TanKor := ’12F’;
WriteLn(Hallgato.TanKor);
A file azonos típusú komponensekből álló adatszerkezet, amely nagy mennyiségű adat tárolását teszi
lehetővé a háttértáron. A file komponensei lehetnek egyszerű és összetett típusok is.
Deklarálásuk:
AdatFile : File of Char;
TextFile : Text;
EzisFile : File;
A deklarálásnak megfelelően megkülönböztetünk:
− tipizált fájlt, melynek elemtípusa pontosan definiált
− szövegfájlt, melyet elsősorban szöveges állományok kezelésére használhatunk
− nem tipizált fájlt, alacsonyszintű (gyorsabb) fájlkezelés megvalósításához
A fájlokkal kapcsolatos műveletekkel egy külön fejezet foglalkozik.
Az elméletből tanult további adatszerkezetek is (verem, sor, lista, gráf, bináris fa) megvalósíthatók pascal nyelvben, de
ehhez a dinamikus memória kezeléssel, azon belül pedig a mutatók használatával kell tisztában lenni. Ezzel szintén egy
külön fejezet foglalkozik.
8. Konstansok és használatuk
A konstansok, mint nevük is mutatja, állandó értéket képviselnek. Definiálásukkor azonnal értéket is kapnak, amelyet a
továbbiakban nem lehet módosítani a programon belül. Alapvetően háromféle konstans típusról beszélhetünk:
− numerikus
− szöveges
− tipizált
A numerikus konstansok számokat tárolnak, a szövegesek pedig, szöveges adatokat, például:
AlsoHatar = 100;
FelsoHatar =200;
Hiba = ’Hiba történt a program végrehajtás során! A hiba: ’;
A tipizált konstansok tulajdonképpen inicializált (értéket kapott) változók, amelyek lehetnek egyszerűek és összetettek a
változóknak megfelelően. A tipizált konstansok értékeit ugyanúgy lehet módosítani, mint a változókét!
Deklarálásuk:
konstansnév : típusnév = érték;
Néhány példa, különböző típusú tipizált konstans megadásra:
Minimum : Integer = 0;
Phare kísérleti program 24
Forrás: http://www.doksi.hu
Programozás
Ha az előre definiált típusok között nem találunk igényeinknek megfelelőt, mi is készíthetünk újabb típusokat, amelyeket
azután változók, illetve konstansok deklaráláshoz is felhasználhatunk. A típusdefiníciónak két módja van:
− az új típus már létező típusokból való felépítése vagy
− a hozzárendelhető értékek felsorolása
Deklarálásuk a type kulcsszó után:
újtípusneve = típusdefiníció;
A konkrét példákon figyeljük meg a változódeklarálás és típusdeklarálás közötti különbséget:
Egesz = Integer;
Tomb = Array [1..100] of Byte;
Betu = Set of Char;
Ketjegyu = Set of 10..99;
Ido = record
Ev : 1000..2000;
Ho : (jan, febr, marc, apr, maj, jun, jul, aug, szept, okt, nov, dec);
Nap : 1..31;
Ora : 1..12;
Perc, Mp : 1..60;
End;
Evszak = (Tavasz, Nyar, Osz, Tel);
Szamjegy = ’0’..’9’;
Az előzőekben definiált típusok mindegyikét felhasználhatjuk változók és konstansok deklarálására:
Szam : Egesz;
A_Tomb, B_Tomb : Tomb;
Kisbetuk, Magybetuk : Betu;
SzulIdo, AktIdo : Ido;
Az így definiált változó azután ugyanúgy használható, mint az előző fejezetben definiált változók.
A változókkal műveleteket is végezhetünk, így kifejezéshez jutunk. Kifejezésnek nevezzük mindazt, aminek a
programban kiszámítható értéke van. A kifejezésben a következők szerepelhetnek:
− konstansok
− műveletek, más néven operátorok (matematikai (pl. +), logikai (pl. <))
− változók
− függvények (a pascal beépített függvényei illetve a felhasználó által készített)
− zárójelek (a műveletek sorrendjét módosíthatjuk segítségével)
− kifejezések
Ha a program futása közben kifejezéssel találkozik, kiszámítja az értékét, és azt használja, ezt nevezik kifejezés
kiértékelésnek. A kifejezések igen összetettek is lehetnek, így a kiértékelés során fontos szerepe van a precedenciának, a
kiértékelési sorrendnek. A szorzás magasabb prioritású precedenciával rendelkezik, mint az összeadás, ezért
kiértékeléskor először a szorzat kerül kiszámításra, és csak azután az összeg. Ezt a kiértékelési sorrendet
befolyásolhatjuk a zárójelek segítségével.
A kifejezéseknek is van típusa. A típus meghatározza, hogy valami milyen értékeket vehet fel, és milyen műveletek
végezhetők vele. A következőkben megvizsgáljuk, hogy az egyes típusokkal milyen műveletek végezhetők.
Az operandusok (amelyekkel műveletet kell végezni) és az eredmény is aritmetikai típusú. A használható operátorok:
Műv. Megnev. Példa Eredmény
+ Összeadás Write(12+36); 48 (egész)
- Kivonás Write(55-19); 36 (egész)
Programozás
Az operandusok (amelyekkel műveletet kell végezni) és az eredmény is logikai típusú. A használható operátorok:
Műv. Megnev. Példa Eredmény
and Aritmetikai és (bitenként) Write(True and False); False
Or Aritmetikai vagy Write(True or False); True
xor Aritmetikai kizáró vagy Write(True or False); True
not Bitek szerinti negáció Write(not True); False
Szöveg típusú (String) és karakteres típusú (Char) változóra egyaránt értelmezhető, az eredmény mindig szöveg típusú:
Műv. Megnev. Példa Eredmény
+ Összefűzés Write(’Alfa’ + ’Beta’); ’AlfaBeta’
Gyakorlatilag az összes típusra alkalmazhatók (kivéve a halmaz), de megkötés, hogy mindkét operandusnak azonos
típusúnak vagy legalább kompatíbilis típusúnak kell lennie.
11.1. Értékadás
Programozás
Kiírás
Eddig kétféle kiíró utasítással találkozhattunk, a WriteLn-el és a Write-al. A kettő között mindössze annyi a különbség,
hogy a WriteLn a kiírt adatok után új sort kezd, így a következő kiíró utasítás eredménye már a következő sor elején
kezdődik.
Beolvasás
A ReadLn(i) utasítás szolgál arra, hogy az i változóba a billentyűzetről értéket olvassunk be. Arra azonban mindig
figyelni kell, hogy a változó típusának megfelelő adatot írjunk be, különben hibaüzenetet kapunk.
Ha csak egy karaktert szeretnénk beolvasni a billentyűzetről, akkor használható még a ReadKey függvény is, mely a Crt
unitban van definiálva.
A billentyűzet lenyomásának érzékelésére pedig a KeyPressed függvény használható, mely szintén a Crt unitban van
definiálva.
Az utasítás vagy utasítás blokk csak adott feltétel teljesülése illetve nem teljesülése esetén hajtódik végre.
Formái:
If feltétel Then utasítás;
Programozás
tetszőleges mélységben folytatható. Ilyenkor arra kell vigyázni, hogy áttekinthető legyen a forrásprogram. Ebben az
esetben célszerű minden utasítást utasítás blokkban elhelyezni (Begin End).
11.4. Esetszétválasztás
Segítségével egy változó vagy kifejezés különböző értékéhez különböző utasítások rendelhetők hozzá.
Formái:
Case változó Of
érték1: utasítás1;
érték2: utasítás2;
….
értékn: utasításn;
End;
Case változó Of
érték1: utasítás1;
érték2: utasítás2;
….
értékn: utasításn;
Else utasítás;
End;
Itt is, mint mindenhol az utasítások helyén utasítás blokk is állhat (Begin End közé zárva). Ha a változó aktuális értéke
nem egyezik egyik felsorolt értékkel sem, akkor egyik utasítás sem kerül végrehajtásra. Ha van Else sor is, akkor az Else
utáni utasítás hajtódik végre.
A következő példa szövegesen írja ki egy változó értéket:
Write(’A változó értéke ’);
Case Ivalt Of
1: WriteLn(’egy’);
2: WriteLn(’kettő’);
3: WriteLn(’három’);
4: WriteLn(’négy’);
5: WriteLn(’öt’);
6: WriteLn(’hat’);
7: WriteLn(’hét’);
8: WriteLn(’nyolc’);
9: WriteLn(’kilenc’);
10: WriteLn(’tíz’);
Else WriteLn(’nagyobb, mint 10!’);
End;
11.5. Ciklusszervezés
A ciklusszervezés során adott programrész ismételt végrehajtása a cél. Ezt a Pascal nyelvben is többféleképpen
valósíthatjuk meg.
Elöltesztelő ciklus:
While feltétel Do utasítás;
Az utasítás vagy utasítások mindaddig végrehajtásra kerülnek, amíg a feltétel IGAZ. Ha a feltétel a végrehajtás
kezdeténél HAMIS, akkor az utasítás vagy utasítások egyszer sem kerülnek végrehajtásra. Az előző példa elöltesztelő
ciklussal:
I := 1;
While (I<=10) Do Begin
Phare kísérleti program 28
Forrás: http://www.doksi.hu
Programozás
WriteLn(I);
I := I+1;
End;
Hátultesztelő ciklus:
Repeat
utasítás1;
utasítás2;
….
utasításn;
Until feltétel;
Az utasítások mindaddig végrehajtásra kerülnek, amíg a feltétel HAMIS. Ebben az esetben nem szükséges a Begin End
használata, a Repeat Until szintén utasítás blokkot definiál. Az előző példa elöltesztelő ciklussal:
I := 1;
Repeat
WriteLn(I);
I := I+1;
Until (I>10);
11.6. Eljárások
Nagyobb feladatot célszerű lépésekre bontani. Továbbá, vannak olyan tevékenységek, melyeket a programban több
helyen is el kell végezni. Az ilyen rész-tevékenységeket külön egységbe foglalhatjuk, ezek neve alprogram (subrutin)
vagy eljárás (procedure). Az eljárásoknak azonosítójuk van, és a deklarációs részben adjuk meg őket a
következőképpen:
Procedure eljárásnév(paraméterlista);
az eljárás saját deklarációs része
Begin
az eljárás utasításai {más néven az eljárás törzse}
End;
Mint látható, a saját deklarációs rész miatt az eljárás valóban önálló programként viselkedhet. A saját deklarációs
részben nem szerepelhet a Program és a Uses utasítás.
Az eljárásokat a nevükkel indíthatjuk el a főprogramból vagy más eljárásokból (természetesen csak akkor, ha az eljárás
deklarációja megelőzte az eljárásra való hivatkozást). Ez az eljáráshívás. Így az eljárások pontosan úgy működnek, mint
a Pascal saját utasításai. Ha úgy tetszik, a Pascal utasításkészletét bővítettük, amikor egy azonosítóhoz hozzárendeltünk
egy tevékenységet.
Az eljárásokon belül definiálhatunk újabb eljárásokat is, de ezeket csak a fő eljáráson belül használhatjuk.
Az előbb láthattuk, hogy az eljárásoknak saját deklarációs részük is lehet. Így az is elképzelhető, hogy két különböző
típusú változó azonos nevet kap, az egyiket a főprogramban, a másikat az eljárásban deklaráljuk. Ezt a problémát a
Pascal nyelv a globális és lokális változók segítségével oldja meg.
A globális változók a főprogramban definiált változók. Ez azt jelenti, hogy a programban bárhol, bármelyik eljáráson
belül hozzáférhetünk az értékéhez, illetve módosíthatjuk az értékét.
A lokális változók az eljárásokon belül definiált változók. Ezek a változók csak az eljáráson belül használhatók, a
főprogram többi részében elérhetetlenek.
Abban az esetben, ha a főprogramban és az eljárásban is definiáltunk egy azonos nevű változót, akkor az eljáráson belül
a lokális változót tudjuk használni, az eljáráson kívül pedig csak a globális változót. Az eljárás belsejében deklarált
saját, avagy lokális változók kívülről, vagyis az eljárást hívó programból láthatatlanok: az eljárás hívásakor
keletkeznek, és az alprogram lefutása után megszűnnek. Ha a főprogramnak van azonos nevű változója, azt a Pascal az
eljárás működésének idejére elraktározza.
Programozás
Begin
GotoXY(x, y);
Write(c);
End;
A paraméterek az eljárásban lokális változókként viselkednek, azzal a különbséggel, hogy nem az eljáráson belül kapnak
értéket, hanem az eljárás hívásakor, kívülről.
Var
I : Integer;
Begin
For I := 1 To 10 Do KiirXY(10, I, ’*’);
End.
Például amikor az I értéke 3, az eljárás hívásakor az egyes paraméterek értéke: x=10, y=3, c='*' lesz. Vagyis,
eljáráshíváskor a hívó utasításban lévő értékeket veszik fel az eljárás paraméterei. Ez az érték szerinti
paraméterátadás.
Előfordul, hogy az eljárásnak változókat szeretnénk átadni, és ezekkel kell valamilyen műveletet végezni, tehát a hívó
program változóit kell változtatni. Ezt megoldhatjuk úgy is, hogy globális változókat használunk, melyeket tud kezelni
az eljárás, de akkor a program áttekinthetetlenebb lesz, mert az eljárás önállósága megszűnik. Erre a célra használható a
cím szerint paraméterátadás, más néven a változóparaméterek. Ekkor paraméterként nem értéket adunk át, hanem
változót, és ezt a paraméterlistában Var szóval jelöljük:
Procedure Csere(Var a,b : Integer);
Var
m : Integer;
Begin
m := a;
a := b;
b := m;
End;
Var
p, q : Integer;
Begin
p := 8;
q := 4;
Csere(p, q);
WriteLn(p, q);
End.
Ez a program a 4,8 számokat írja ki. Ha a var szócskát nem írtuk volna a paraméterlista elejére, a főprogram változóival
semmi nem történt volna, csak az eljárás lokális változóiban cseréltük volna fel az értékeket. A var szó hatására a
következő történik: eljáráshíváskor létrejön az eljárás lokális a és b változója, de ezek a változók ugyanarra a
memóriacímre mutatnak, mint a főprogram p és q változói. Tehát akármilyen műveleteket végzünk az a és b
változókkal, ugyanaz fog történi a főprogram p és q változóival. Így a Csere eljárást nem is lehet számokkal meghívni,
csak integer típusú változókkal.
Használhatunk változó- és közönséges paramétereket egyszerre is:
Procedure Valami(s : String; var c : Integer);
A deklarációnál s közönséges, c pedig változóparaméter. A Pascal több utasítása is használ változóparamétert, pl. az
Initgraph.
11.7. Függvények
A függvények pontosan úgy működnek, mint az eljárások, azzal a különbséggel, hogy visszatérési értéket is
szolgáltatnak. A visszatérési értéket a függvény törzsében a következő utasítással állíthatjuk be:
függvénynév := érték;
A függvény deklarálásakor jelezni kell a visszatérési érték típusát, mely csak elemi típus lehet.
Function függvényneve(paraméterlista) : típus;
A függvény ezeken kívül ugyanúgy működik, mint egy eljárás. Nem elegáns azonban, ha a függvény a visszatérési érték
kiszámításán kívül más tevékenységet is végez. Ilyen esetekben inkább használjunk eljárást, és a visszatérési értéket
változóparaméterrel adjuk vissza a hívó programnak.
A Pascalban megfelelő beállítás esetén a függvényeket eljárásként is meghívhatjuk: ekkor csak a függvény mellékhatása
Phare kísérleti program 30
Forrás: http://www.doksi.hu
Programozás
jelentkezik. Például a Readkey függvényt utasításként használva a program egy billentyű lenyomásáig várakozik.
Példa a függvények deklarációjára és alkalmazásukra:
Function Kob(a : Real) : Real;
Begin
Kob := a * a * a;
End;
Begin
WriteLn(Kob(4));
End;
12. Állománykezelés
Gyakran szükség lehet arra, hogy a memóriában lévő adatokat lemezre írjuk, vagy lemezen lévő adatokat olvassunk be.
A lemezen lévő adatok fájlokban helyezkednek el. Egy adatszerkezet működését a benne lévő adatok típusán kívül az is
meghatározza, hogy miképpen tudunk bele adatot írni, vagy belőle adatot olvasni. Noha egy fájl minden esetben byte-ok
sorozata, a fájlokat háromféle módon kezelhetjük:
− szöveges fájlként
− tipizált fájlként
− nem tipizált fájlként
Az azonosságok a különböző fájlkezelési módszerek esetén:
− az állományok kezeléséhez is szükség lesz egy változóra, amelyet ugyanúgy kell deklarálni, mint a
változókat
− a fájlok használata előtt a változót hozzá kell rendelni egy fizikai fájlhoz, ezt a hozzárendelést végzi az Assign
eljárás, pl.:
Assign(F, ’C:\PRG\ADAT.DAT’);
az F változóhoz az ADAT.DAT állományt rendeltük hozzá
− mielőtt olvasnánk vagy írnánk az állományba, meg kell nyitni
Reset(F) – megnyitjuk a fájl a további műveletekhez
ReWrite(F) – új fájlt hoz létre, illetve törli az előző ilyen nevű fájlt, majd megnyitja
Append(F) – továbbírásra nyitjuk meg (csak szöveges fájlok esetén alkalmazható)
− olvasás a fájlból – Read eljárás
− írás a fájlba – Write eljárás
− minden megnyitott fájlhoz fájlmutató van hozzárendelve, mely a következő fájl elemre mutat, és
automatikusan változik a Read, Write hatására, de mi is állíthajuk a Seek eljárás segítségével
− lekérdezhető a fájlmutató aktuális értéke a FilePos függvénnyel
− megtudhajuk, hogy a fájlmutató a fájl végén áll-e az Eof függvénnyel
− a munka végeztével az állományokat le kell zárni a Close eljárással
A szöveges állományok kifejezetten szövegek tárolására használhatók. A szövegek betűkből állnak és értelmezve van a
sor vége is. Gyakorlatilag a szövegfájl sorokból épül fel, a sor vége jel pedig az ENTER.
Szöveges fájlok esetén a Reset-el történő megnyitás csak olvasást tesz lehetővé. Nem alkalmazhatók a Seek, FilePos,
FileSize, Truncate eljárások.
Deklarálásakor a Text típusnevet kell használni. Szövegfájlból olvasni célszerűen a ReadLn, írni pedig a WriteLn
utasítással lehet úgy, hogy első paraméternek a fájlhoz hozzárendelt változót kell megadni.
A következő példaprogram megjeleníti az ALMA.TXT nevű szöveges fájl tartalmát a képernyőn:
Var
F : Text;
s : String;
Begin
Assign(F, ’ALMA.TXT’);
Reset(F);
While not Eof(F) Do Begin
ReadLn(F, s);
WriteLn(s);
End;
End.
Programozás
A tipizált állománykezelés lényege, hogy pontosan definiáljuk (tipizáljuk) az állományok felépítését. Már a változó
definíciójával meghatározzuk, hogy milyen alapelemekből állnak. Pl.:
F : File Of Byte; {az állományt bájtonként lehet olvasni és írni}
F : File Of Array [1..100] of Integer; {a fájl legkisebb kezelhető eleme egy 100 elemű Integer tömb}
A következő példa egy tipizált állomány feltöltését mutatja be:
Type
AdatRecTipus = Record
Nev : String[20];
Szul : Integer;
End;
Var
F : File of AdatRecTipus;
r : AdatRecTipus;
Begin
Assign(F, ’NYILV.DAT’);
Reset(F);
Repeat
Write(’Név: ’);
ReadLn(r.Nev);
If r.Nev <> ’*’ Then Begin
Write(’Született: ’);
ReadLn(r.Szul);
End;
Until r.Nev = ’*’;
Close(F);
End.
Ebben az esetben általában közömbös számunkra az állomány szerkezete, a hangsúly a gyors hozzáférésen van. Ebben
az esetben az állományokat blokkonként olvassuk és írjuk. A kezelendő record méret a Reset utasítás segítségével
állítható be.
Nem alkalmazhatók rájuk a Read és Write eljárások, helyettük a BlockRead és BlockWrite eljárásokat kell használnunk.
A következő példa egy egyszerű állománymásolást végez:
Program CopyFile;
Var
InFile, OutFile: File;
NumRead, NumWritten: Word;
buf: array[1..2048] of Char;
Begin
Assign(InFile, ParamStr(1));
Reset(InFile, 1);
Assign(OutFile, ParamStr(2));
Rewrite(OutFile, 1);
WriteLn('Másolok ', FileSize(InFile), ' bájtot...');
repeat
BlockRead(InFile, buf, SizeOf(buf), NumRead);
BlockWrite(OutFile, buf, NumRead, NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
Close(InFile);
Close(OutFile);
End.
A Pascal hiányosságának tűnik az a megkötés, hogy a változókat előre deklarálni kell. Így a program elején
Phare kísérleti program 32
Forrás: http://www.doksi.hu
Programozás
deklarálhatunk egy tömböt, és a program futása közben derül ki, hogy a szükséges adat (pl. egy fájlból beolvasott hosszú
számsorozat) nem fér bele. Ez mindig olyankor fordul elő, amikor nem ismerjük előre a feldolgozandó adat
mennyiségét. Ezen segít a Pascal azon lehetősége, hogy a program futása közben is foglalhatunk le memóriát
változóknak - ezek lesznek a dinamikus változók, szemben a program deklarációs részében előre megadott statikus
változókkal.
Dinamikus változók használatánál a programozónak az eddiginél többet kell foglalkozni a memóriakezeléssel, melyet
egyébként a Pascal automatikusan végez. A változó létrehozásakor le kell foglalni egy megfelelő méretű
memóriaterületet, és gondoskodni kell annak felszabadításáról, ha a változóra már nincs szükség. Ehhez tudni kell, hogy
a dinamikus változó hol helyezkedik el a memóriában, és mennyi helyet foglal le.
A mutató olyan változó, mely a memória adott helyére mutat. Két fajtáját különböztethetjük meg, a típusos mutatókat és
típus nélküli mutatókét. A mutatók segítségével lehet kezelni a dinamikus változókat. A mutatók speciális értéke a NIL,
ami azt jelzi, hogy a mutató éppen nem mutat sehová.
A tipizált mutatók lényege, hogy deklarációjuknál rögzítjük, hogy milyen típusú adatra fognak mutatni. A Pascal ezt
megjegyzi, és a helyfoglalás az ilyen típusú adatok részére egyszerűbb.
Deklarálásuk:
változóneve : ^típusnev;
Vagyis a változók deklarálásától annyiban különbözik, hogy a típusnév előtt a hatvány jelnek (^) kell szerepelnie, pl.:
I_Mut : ^Integer;
Az így definiált I_Mut nevű változó azonban nem Integer értéket tartalmazhat, hanem csak egy memória címet vagy a
NIL értéket. Megtehetjük azonban azt, hogy egy Integer típusú változó értékének címét adjuk meg értékül a mutatónak
az Addr függvény segítségével. Ezután az Integer változó ugyanúgy kezelhető a mutatón keresztül is, mint a normál
változó, de a ^ jelre ilyenkor is szükség van. Ezzel jelezzük, hogy a mutatott értékre van szükségünk és nem a mutató
változó értékére:
Var
I_Valt : Integer;
I_Mut : ^Integer;
Begin
I_Valt := 12;
I_Mut := Addr(I_Valt);
WriteLn(I_Valt, ’ ’, I_Mut^);
I_Mut^ := 35;
WriteLn(I_Mut^);
End.
Ha önálló helyet szeretnénk a memóriában egy Integer típusú változónak, azt a következőképpen tehetjük meg a mutatók
segítségével:
New(I_Mut);
Hatására a memóriában lefoglalásra kerül egy Integer változónak szükséges hely (feltéve, ha az I_Mut Integer típusú
mutató), majd az I_Mut értéke a lefoglalt terület kezdőcíme lesz. Innentől az I_Mut^ formával úgy kezelhető, mint egy
normál változó.
A különbség mindössze annyi, hogy program vagy eljárás vége előtt az előbb lefoglalt memóriaterületet fel is kell
szabadítani a Dispose eljárással:
Dispose(I_Mut);
Nézzünk egy példát dinamikus változó létrehozására:
Var
P : ^Integer;
Begin
New(p);
ReadLn(p^);
WriteLn(p^);
Dispose(p);
End.
A példában p^ egyszerű változóként viselkedett, melyet a program futása közben hoztunk létre. A következő példa
létrehoz 2, 150 elemű String-ből álló tömböt, így a pointerek használatával máris túlléptük a statikus memóriakezelés 64
Kbyte-os korlátját:
Type
Phare kísérleti program 33
Forrás: http://www.doksi.hu
Programozás
Deklarálásuk:
változóneve : Pointer;
Mint neve is mutatja, az így definiált mutatóról nem tudhatjuk, hogy milyen típusú adatra mutat. Pontosabban bármilyen
típusú adatra mutathat. Ebből következően a New és Dispose eljárás sem használható. Helyettük a GetMem és FreeMem
eljárást használhatjuk. Mindkettőnek még azt is meg kell mondani, hogy mekkora memória területet foglaljon le, illetve
szabadítson fel.
Minden mutató típusra igaz, hogy a memóriában a lefoglalásra felhasználható memóriaterület korlátozott. A szabad
memóriaterületet a MemAvail és MaxAvail függvények segítségével ellenőrizhetjük. A MemAvail az összes szabad
terület méretét adja vissza, míg a MaxAvail a legnagyobb szabad blokk nagyságát.