Következő példánkkal egy vasútállomáson használható jegyárusító automata működését írjuk le. A korábbiakban már megállapítottuk, hogy a túlságosan nagy szabadság az algoritmusírásban felesleges bonyodalmakat okoz, célszerű lenne az algoritmusok leírására használatos nyelvünket egységesíteni, rögzíteni, s a leírás mögötti tartalomban megegyezni. Ezt majd a következő fejezetekben tesszük meg, de már ebben a példában is használjuk ezen – általunk javasolt – szabványos nyelvet.
Elképzeljük a megoldást: az automatán – általános szokás szerint – látszanak azok az állomások, amelyekre jegyet képes adni. Olvasható az is, hogy mennyibe kerülnek az egyes jegyek
Kezdjük ismét a kellékekkel! Szükség lesz:
Az algoritmus legfelső szintjét nevezzük programnak. A megoldás tehát első közelítésben:
Program: [visszajáró, bedobott, állomás: nem negatív egészek
jegy : (távolság, ár), s ezek pozitív egészek ]
Várd az állomást [állomás:=állomássorszám]
Számold meg a bedobott pénzt [bedobott:=bedobott pénz]
Számold ki a visszajárót [visszajáró:=visszajáró pénz]
Ha visszajáró<0 akkor [kevés a bedobott pénz]
Add vissza a bedobott pénzt [Ki : bedobott pénz]
különben
Adj vissza [Ki : visszajáró]
Add ki a jegyet [jegy:=(távolság, ár)]
Elágazás vége
Program vége.
Elágazásoknak algoritmusleíró nyelvünkben nemcsak az elejét, hanem a végét is jelezni fogjuk, kivéve, ha e nélkül is egyértelmű. A bekezdések mindig utalnak a struktúrára, azaz utasítások együvé tartozó csoportját jelzik. Bekezdés vége a struktúra végét is jelöli.
1. A visszajáró pénzről juthat eszünkbe, hogy egységesíteni lehetne a pénz visszaadást, ha az Adj vissza tevékenység mindig a visszajáróban találja a neki megfelelő mennyiséget. Így az elágazás akkor-ága (azaz az akkor kulcs-szóval bevezetett struktúra) a következőképpen módosul:
visszajáró:=bedobott
Adj vissza [Ki: visszajáró]
2. Ennél igazibb megoldás, ha – a már korábban körvonalazott – paraméterezett eljárással oldjuk meg a visszaadást; az alábbi módon:
Adj vissza(pénz):
Ki: pénz
Eljárás vége.
Jegyezzük meg, hogy a résztevékenységeket algoritmizáló programrészeket eljárásoknak nevezzük! Az eljárás mindig azzal a névvel kezdődik, amellyel korábban hivatkoztunk rá. Vagyis erre utalunk a programunk fent tisztázott szintjén két helyen is:
Ha visszajáró<0 akkor
Add vissza a bedobott pénzt ←Adj vissza(bedobott)
különben
Adj vissza ←Adj vissza(visszajáró)
Add ki a jegyet
Elágazás vége
Folytassuk a részletezést az egyes résztevékenységekkel! A Várd az állomást-ban megjelenik a felhasználóval való kommunikáció másik utasítása (a Ki: párja), a beolvasás.
Várd az állomást: [ max : ennyi állomás van;
táblázat(max,2) : ( (1.táv, 1.ár), (2.táv, 2. ár), ... ) ]
Írj tájékoztatót [ki : állomás-táblázat]
Be: állomás [1≤állomás≤max]
Eljárás vége.
Mint minden, ami fix, rögzített, ami eleve kiírattatott az automata dobozára, úgy az algoritmusbeli táblázat is eleve megvan, s nem fog a használat által változni. Az ilyen adatféleséget korábban konstansnak neveztük. Itt persze az eddig megszokott triviális konstansoktól (5, 10, ..., 3.1415, ...) több szempontból is eltérő valamivel találkozunk. Első újdonság: általunk adott neve van (táblázat), második: bonyolult szerkezetű. Egy fontos fogalompárral érdemes megismerkednünk ezzel kapcsolatban: adataink lehetnek struktúrálatlanok (mint a max, vagy a bedobott stb.), s lehet szerkezetük (amilyen a táblázat).
A pénz számlálására alapesetben elég egy beolvasó utasítást írni.
Számláld meg a bedobott pénzt:
Be: bedobott
Eljárás vége.
Mivel az a megoldás nagyon elüt a valóságtól, ezért ezt a későbbiekben részletesebbel, egy reálisabbal helyettesítjük:
Számláld meg a bedobott pénzt:
[ pénz : pozitív egész értékű segédváltozó ]
bedobott:=0
Ciklus amíg van még pénz
Be: pénz [megengedett érme]
bedobott:=bedobott+pénz
Ciklus vége
Eljárás vége.
Hogy mi a megengedett, attól először – legalábbis a kódolásnál – célszerű eltekinteni. Kiemelendő az eljárásban a Van még pénz függvényszerű beépítése, amelynek a kérdésre adott válasz logikai értékét kell előállítania. (Ennek a tevékenységnek – ti. összegzés – visszatérő voltáról esik még szó: sorozatszámítás tétel első előbukkanásának tekinthető.)
Számold ki a visszajárót:
visszajáró:=visszajáró-táblázat(állomás,2)
Eljárás vége.
A pénz visszaadása első esetben szintén egyetlen kiírásból állhat.
Adj vissza:
Ki: visszajáró
Eljárás vége.
Ezt az eljárást átalakíthatjuk olyanná, amely megmondja, hogy melyik pénzérméből mennyit kell visszaadni.
Adj vissza:
[ db : pozitív egész
érmeszám : megengedett érmék száma
érme(érmeszám): megengedett érmék növekvő értékű sorozata]
db:=érmeszám
Ciklus amíg visszajáró>0
Ciklus amíg visszajáró<érme(db)
db:=db-1
Ciklus vége
Ki: érme(db)
visszajáró:=visszajáró-érme(db)
Ciklus vége
Eljárás vége.
A pénzvisszaadáshoz nem az egyetlen lehetséges elképzelést valósítottuk meg, hogy ti. a legkevesebb számú pénzben történjék. Ha a beolvasásnál ellenőriztük az érmék helyességét, akkor már abban az eljárásban kellett az érme vektort deklarálnunk. (És íme egy újabb visszaköszönő algoritmusfajta prototípusa: a kiválasztás tétel első előfordulása.)
Add ki a jegyet:
jegy:=táblázat(állomás,) [a táblázat egy teljes sora]
Ki: jegy
Eljárás vége.
Tanulságként hívhatjuk föl a figyelmet arra, hogy bonyolult szerkezetű adatok egészére (jegy), vagy annak még nem feltétlenül elemi részére (táblázat egy sorára) is lehet (illetve így lehet) hivatkozni.
Van még pénz:
[ van : szöveg segédváltozó ]
Be: van [van= "i" vagy "n"]
Van még pénz:=(van="i")
Függvény vége.
A függvény-eljárásnak egyetlen érdekessége van: hogyan kell a függvény értékének megadásáról gondoskodni.
Az Írj tájékoztatót eljárás tisztázását, mint algoritmikusan nem problematikust, a kódolásra hagyjuk (azaz csak a konkrét programozási nyelven megfogalmazandónak vesszük).
![]() ![]() |
![]() |
![]() |
A tananyag az ELTESCORM keretrendszerrel készült