Ezen cikkünkben a Pascal nyelv utasításait fogjuk megvizsgálni egy kicsit közelebbről.

Ezeket az utasításokat két nagy csoportra oszthatjuk: egyszerű és strukturált.

Nézzük először az egyszerű utasításokat. Ezek a következők: az értékadó utasítás, a goto utasítás és az eljáráshívás. Részletezzük ezeket egy kicsit:

Értékadás: Legalapvetőbb utasítás ez, hisz már beszéltünk a változókról, és ezeknek értékeket kell adni. Bár erről már volt szó, azért még egyszer leírom. Ez az utasítás két részből áll: jobb és bal oldalból, a kettőt a := jel választja el egymástól. A jobb oldalon természetesen csak változó állhat, a bal oldalon lehet konstans, változó vagy kifejezés. Pl.:x:=3.5; { konstans } `

y:=w; { változó }
z:=x*y+sqr(x); { kifejezés }

`

Goto: Ezt az utasítást általában nem használjuk! Bármennyire is szükség lenne rá, a Pascalban szinte mindig el lehet kerülni a goto utasítás használatát. Akkor szép egy strukturált program - egy Pascal program - felépítése, ha nem tartalmaz goto utasítást, amely a programot áttekinthetetlenné teszi.

Eljáráshívás: Ezzel foglalkoztunk a legutóbbi cikkben.

Ezek voltak az egyszerű utasítások. Térjünk át a strukturált utasításokhoz. A könnyebb megértés érdekében bemutatunk néhány folyamatábrát is. Ezekkel remélem segítséget nyújthatunk az utasítások szerkezetének teljes átlátásához. Felsorolás szintjén: a blokk utasítás, a feltételes utasítások (if, case), a ciklusok (for, while, repeat-until) és a with utasítás. Részletesebben:

Blokk: A begin és end kulcsszavak közötti utasítások sorozatát összetett utasításnak, blokknak nevezzük. Azon Pascal utasítások esetén, amelyek csak egy utasítást tudnak végrehajtani, fontos az egynél több utasítás összefogása egyetlen utasítássá a begin és end használatával.

A feltételes utasítások segítségével a programban lehetőség van bizonyos feltételek teljesülése esetén egy utasítás vagy egy programrészlet végrehajtására. Ezek az utasítások elágazásokat biztosítanak a programban. Ezen elágazásoknak két fajtája van: az if és a case.

Az if utasítás kétirányú, feltételes utasítást hajt végre. Általános formája: `if logikai kifejezés then utasítás1 else utasítás2;`
Az if után logikai változó vagy logikai kifejezés állhat, amelynek teljesülésétől függ, hogy melyik utasítás kerül végrehajtásra. Ha a feltétel igaz (true), akkor a then utáni utasítás1 fog végrehajtódni, ha a feltétel hamis (false), akkor az else utáni utasítás2 kerül végrehajtásra. Az if szerkezetet a ; zárja le, ezért az else elé nem szabad kirakni. Ha a then vagy az else után egynél több utasítást akarunk végrehajtatni, akkor azt a korábban ismertetett módon foglaljuk egy blokk utasításba a begin és az end segítségével.
Egy példa az if-then-else szerkezetre: `

if X<Y then Min:=X
else if X=Y then Min:=X
else Min:=Y;

`

Az utasítás folyamatábrája:

Az if utasításnak egy egyszerűbb formája is használható, ha egy utasítást csak egy feltételtől függően végre akarunk hajtani, vagy át akarunk ugrani. Ez esetben így fest:

if logikai kifelyezés then utasítás1;

Egy példa az if-then szerkezetre:

`if Old=New then begin`
`WriteLn('A régit írtad: ',Old);`
`Write('Írj be újat : ');`
`ReadLn(New);`
`end;`

A folyamatábra:

A case utasítással többirányú elágazást hozhatunk létre a programunkban. A case utasítás tartalmaz a case kulcsszó után álló szelektort, amelyet az of kulcsszó zár. Ezt követi egy vagy több ún. ca se konstans és a hozzá tartozó utasítások és végül nem kötelezően egy else ág. A case utasítást az end zárja.

Általános formája:

`case szelektor of`
`cimke_1: utasítás_1;`
`...`
`cimke_n: utasítás_n;`
`else utasítás_m;`
`end;`

A szelektor csak sorszámozott típusú lehet. Ezek a következők: integer, shortint, longint, byte, word, boolean, char. A case konstansok (címke) típusának meg kell egyeznie a szelektor típusával. Azon utasítás vagy utasítások kerülnek végrehajtásra, amelynek a címkéje megegyezik a szelektor értékével, ha nincs ilyen címke, az else utáni utasítás kerül végrehajtásra. Természetesen a több utasítást begin és end közé tesszük, vagyis egy blokkba foglaljuk.

Egy példa a case szerkezetre: ``

case Jegy of
1: WriteLn('Elégtelen');
2: WriteLn('Elégséges');
3: WriteLn('Közepes');
4: WriteLn('Jó');
5: WriteLn('Jeles');
else WriteLn('Ilyen jegy nincs!');
end;

Az utasítás folyamatábrája:

Ciklusok: A programban gyakran van szükség utasítások ismételt végrehajtására. Az ilyen feladatok megoldására szolgálnak a ciklusok. A Pascalban három féle ciklus található: a for, a while és a repeat-until.

A for ciklusutasítást akkor használjuk, ha pontosan ismerjük az ismétlések darabszámát. A for ciklust két féle képen lehet használni: növekvő vagy csökkenő ciklusként. A for ciklusutasítás csak egyetlen utasítás végrehajtására vonatkozik (ha több utasítás, akkor blokk).

A for utasítás alakja növekvő ciklus esetén: kezdőérték < végérték
`for ciklusváltozó:=kezdőérték to végérték do utasítás;`

A for utasítás alakja csökkenő ciklus esetén: kezdőérték > végérték
`for ciklusváltozó:=kezdőérték downto végérték do utasítás;`

Egy rövid példa a for használatára:

`for Szam:=1 to 20 do Osszeg:=Osszeg+Szam;`
A folyamatábra:

A while utasítás tartalmaz egy logikai kifejezést, amely vezérli az ismételt utasítások végrehajtását. Az utasítás általános formája:

while logikai kifejezés do utasítás;

Ennél a ciklusfajtánál a logikai kifejezés a ciklusmag végrehajtása előtt kerül kiértékelésre. Ha az hamis, akkor a ciklus egyszer sem kerül végrehajtásra. Ezért ezt a logikai kifejezést belépési feltételnek is hívjuk. Az egyetlen utasításból álló ciklusmag (ha több utasítás, akkor blokk) addig kerül végrehajtásra, amíg a logikai kifejezés igaz.

Példa a while ciklus használatára (más megoldás az előzőre):

`while Szam < 21 do begin`
`Osszeg:=Osszeg+Szam;`
`Szam:=Szam+1;`
`end;`

A folyamatábra:

A repeat-until ciklus hasonló a while ciklushoz. Az ismétlést itt is egy logikai kifejezés vezérli. A különbség az, hogy a repeat-until ciklus egyszer mindenképpen végrehajtódik, mert a feltétel (a logikai kifejezés) a ciklus végén kerül kiértékelésre. A ciklusmag addig hajtódik végre, amíg a logikai kifejezés hamis, és akkor fejeződik be, amikor a logikai kifejezés igazzá válik. Ebben az esetben a logikai kifejezést kilépési feltételnek hívjuk. Az utasítás általános formája:

`repeat ciklusmag; until logikai kifejezés;`

A ciklusmag több utasításból is állhat. Itt nincs szükség a begin-end kulcsszavak használatára, mert a repeat-until kulcsszavak helyettesítik azokat.
Még mindig ugyanaz a példa:

`repeat`
`Osszeg:=Osszeg+Szam;`
`Szam:=Szam+1;`
`until Szam=21;`

Az utasítás folyamatábrája:

A with utasítással egyszerűbben adhatunk rekordnak értéket, mivel a rekord mezőire, mint egyedül álló változókra hivatkozhatunk. Általános formája:

with rekord_változó do utasítás;

Annyival rövidebb egy rekord megadási módja, hogy a with után megadott rekord_változó nevét és a pontot a do után nem kell újra kiírni, hanem elegendő csak a mező neveit megadni.

Most pedig olyan dolgoról lesz szó, amit eddig azért nem írtunk le, mert részben a deklarációs részhez, részben pedig ide kapcsolódik. Ez pedig a következő lenne: a rekord (mint adattípus) és a case összekapcsolása. Ebből lesz a variálható rekord.

Variálható rekordnak nevezzük azt a rekordot, amelynek mezőadataihoz valamilyen tulajdonságtól függően más és más adatok tartoznak. Példaként nézzük meg, hogy egy könyvtárban a könyveket milyen adatok szerint tarthatjuk nyilván. A könyvnek van egy-két szerzője, van címe, van kiadója, van kiadási éve, van oldalszáma és van leltári száma. A könyv tulajdonságát határozza meg az a tény, hogy kikölcsönözhető-e. A könyv csak akkor kölcsönözhető, ha a raktárban van. Ebben az esetben az ottani helyét tartjuk nyilván. Ha a könyv nincs a raktárban, akkor valószínűleg ki van kölcsönözve. Ilyenkor a kikölcsönző személy adatait rendeljük a könyv adataihoz. Tehát a deklaráció:

`var`
`Konyv: record`
`Szerzok : String;`
`Cim : String[50];`
`Kiado : String[30];`
`Ev : Integer;`
`Oldalak : 1..1000;`
`Leltar : 1..10000;`
`case Kiveheto: Boolean of`
`True : (Hely: record`
`Emelet : 1..4;`
`Sor : 1..15;`
`Polc : 1..50;`
`end);`
`False : (Olvaso: record`
`Nev : String[30];`
`Lakcim : String[40];`
`Tel : String[15];`
`Lejar : String;`
`end);`
`end;`
`end;`

#### DomTom