Kiss Donát Spectrum
0:40 Mint arról már szó volt, a programozók természettől adott tulajdonsága a kényelemszeretet – hogy finomak legyünk. Ez azt jelenti, hogy irtóznak a gépies, ismétlődő, úgy is mondhatnám, rutinszerű feladatok beprogramozásától. Ezért igyekeznek ezt különböző programozástechnikai módszerekkel, fogásokkal elkerülni. Erre már láttunk példát, a ciklusszervezést, és ma is egy hasonlóról lesz szó, mégpedig a szubrutinokról. Ehhez vegyük elő a már ismert lóerő–kilowatt átszámító programunkat. Emlékszünk rá, hogy ez a program kitűnően működött, csak a képernyő egy kicsit zsúfolt volt az eredményektől, ha egymás után mondjuk tíz átszámítást is kértünk. Ezért azt vettük a fejünkbe, hogy ezt a programot megjelenésében egy kicsit vonzóbbá, gusztusosabbá tesszük, mégpedig oly módon, hogy például a fejléc után üresen hagyunk három sort, majd minden átszámítás eredménye közé is három üres sort próbálunk beiktatni.
Pinkert László Commodore 64
4:49 Feltűnhetett az iménti példában, hogy a GOSUB és a RETURN utasítások hatása egyaránt ugrás. Azonban egyikük sem helyettesíthető egyszerű GOTO-val. Ugyanis a GOSUB utasítás végrehajtásakor a gép feljegyzi a következő utasítás sorszámát. Például a képen látható 35-ös utasítás végrehajtásakor 40-est jegyez föl a gép, ezek után ugrik a 200-as sorra. Végrehajtja egészen a 210-es sorig, itt RETURN utasítást talál, amelynél a gép előkeresi a feljegyzett sorszámot. 40-est fog találni, tehát a program folytatása a 40-es soron kezdődik. Ezek után a 65-ösnél ismét elteszi a következő sorszámot a gép, de ez itt 70-es lesz. Tehát a szubrutin végrehajtása után a RETURN-nél a 70-esre tér vissza.
Ebből az egyszerű magyarázatból is kitűnik, hogy a szubrutinok akárhányszor és a program bármely helyéről hívhatók. A RETURN utasítás mindig tudni fogja, hogy hol kell a programba visszatérni. Meg kell azonban jegyezni, hogy ha a RETURN utasítást úgy hajtja végre a gép, hogy előtte nem volt GOSUB, akkor nem talál a feljegyzések között semmit, tehát hibajelzést fog adni. A példán látható szerkezetben gondoskodni kell arról, hogy valahol a 200-as utasítás előtt vagy ugró, vagy STOP utasítással elkerüljük azt, hogy a program végrehajtsa a RETURN utasítást GOSUB utasítás nélkül.
Kiss Donát Spectrum
6:28 Most nézzük meg, hogyan tudjuk sokrétűbben felhasználni a szubrutinokat, vagyis olyan feladatok végrehajtására, amelyek ha nem is pontosan azonosak, de nagyon hasonló jellegűek. Például ha az előbb említett lóerő–kilowatt programban a fejléc után mondjuk öt üres sort szeretnénk hagyni, két átszámítás eredménye között azonban csak kettőt. Nos, azok, akik nem nézik a TV–BASIC adásait, valószínűleg ebben az esetben két szubrutint írnának, egy olyat, amelyik öt üres sort használ, egy olyat, amelyik kettőt. Jóérzésű programozók azonban – és remélhetőleg önök is – nem így állnának hozzá ehhez a feladathoz, hanem egy olyan szubrutint próbálnának írni – és írjuk ezt most meg közösen –, amely mind öt, mind három, sőt esetleg tetszőleges számú üres sor írására alkalmas. Hát ehhez egy picit át kell alakítani ezt a szubrutint. Mégpedig egy ciklust fogunk szervezni – és a 200-as sor evvel fog kezdődni –, ahol az N ciklusváltozó értéke 1-től I-ig megy. Vagyis az I változóban tárolt érték fogja megmondani, hogy hányszor kell majd végrehajtani a ciklusmagot, ami természetesen nem más, mint egyetlenegy PRINT, és ezt a ciklust is le kell zárjuk egy NEXT N-nel.
Most már nincs más hátra, mint a szubrutinhívás előtt ezt az I paramétert – ugyanis ezt nem másnak, mint paraméterátadásnak nevezzük –, be kell állítsuk a megfelelő értékre. Vagyis a két átszámítás közötti esetben ugye ez 2, és a fejléc kinyomtatása utáni szubrutinhívás esetén pedig ez az érték 5 lesz.
Dr. Kocsis András Commodore 64
8:34 A szubrutin a programnak egy zárt része, amelynek eleje és vége van. A szubrutin egy vagy több műveletet hajt végre. Azt láttuk már, hogy milyen előnyös a szubrutin alkalmazása olyan esetekben, amikor egy programon belül egy műveletet többször kell végrehajtani, és a szubrutinnal tudjuk helyettesíteni. Most nézzünk meg egy új alkalmazási lehetőséget. A szubrutinok nagyon előnyösen támogatják a moduláris programozást. Megtehetjük azt, hogy a program moduljait szubrutinként kódoljuk, és a program elejére a szubrutinokat hívó utasításokat helyezünk el. Ezek az utasítások együttesen egy új modult fognak alkotni, és nevezzük ezt vezérlőmodulnak, mivel ezek az utasítások vezérlik, irányítják a többi modulnak a végrehajtását. Nézzünk most meg erre egy példát. Bizonyára emlékeznek még arra a feladatra, amikor a napi középhőmérsékletet kellett kiírnunk, illetve a hőmérséklettel arányos csillagsorokat. Nézzük meg, hogy alakul ez a program akkor, hogyha a modulokat szubrutinok formájában kódoljuk.
A listán látható, hogy a 70-es, 80-as, 90-es, 100-as és 110-es sorok a program egyes moduljait hívják. A 80-as sor például a déli hőmérsékletet olvassa be és ellenőrzi. A 110. sor pedig a kiírásokat vezérli. A 120. sor írja ki a reggeli hőmérsékletet, és az utána következő két utasítás: a 130-as paraméterezi a szubrutint, tehát megmondja a reggeli hőmérsékletet, és a 140-es pedig végrehajtja magát a csillagsorkiírást. És ezt így folytathatjuk tovább.
Az ilyenformán kódolt program nem lesz rövidebb ugyan, viszont áttekinthetőbb lesz. Előnye ennek a megoldásnak az is, hogy a program egyes moduljai mint építőkövek más programokban is felhasználhatók.
Herneczki Katalin Commodore 64
10:38 A szubrutinokat tetszőleges helyre tehetjük a programba, csak arra kell vigyázni, hogy véletlenül rá ne fusson a vezérlés. Ha a szubrutin első sora előtt nincs GOTO vagy STOP utasítás, akkor a szubrutin hívás nélkül is végrehajtásra kerül, és bizony a hívatlan vendég a programozásban is komoly gondokat okozhat. Nézzük most meg a korábbi feladatunkat.
Ebben a programban a szubrutin első sora előtt GOTO utasítást találunk, tehát nincs probléma. De lehetne, hogyha ezt a sort elhagynánk. Gondoljuk csak végig. Ha kihagyjuk a 70-es sort, akkor az őt megelőző sor a GOSUB 210, azaz a szubrutinhívó utasítás, vagyis végtelen ciklusban egymás után hívnánk meg a szubrutint, mégpedig azt a szubrutint, amely üres sorokat ír egymás után. Hát ez bizony nem jó megoldás. (Ez hibás okoskodás, semmilyen végtelen ciklus nem állna elő. Amikor a 65. sorra jut a vezérlés, az meghívná a szubrutint, amelynek végrehajtása után visszakerülnénk a 65. sor utánra, vagyis a 90. sorra. Még egyszer végrehajtódna a szubrutin, kiírna további öt üres sort, majd elérne a RETURN-höz és megelőző GOSUB hiányában leállna hibaüzenettel; hiszen a korábbi szubrutinhívást már feldolgozta, az ahhoz tartozó visszatérési adatokat eldobta. – L. A. D.)
Azt említettem, hogy az előző programunkat nézzük meg. Nos, ez egy kicsit csalafinta dolog, mert ez nem pontosan ugyanaz a program. De mi az eltérés? Két GOSUB utasításunk van, de az egyik GOSUB 200, a másik pedig GOSUB 210. Nos, ez nem elírás, hanem azt szerettük volna bemutatni, hogy egy szubrutinnak több belépési pontja is lehet. Jelen esetben a 200-as, illetve a 210-es. Ha a GOSUB 200 kerül végrehajtásra, az azt jelenti, hogy kettő meg három, azaz összesen öt üres sort írunk ki. Ha pedig a GOSUB 210-et hajtjuk végre, akkor három üres sor kerül kiírásra.
Nos, ez egy egyszerű gyakorló feladat volt, viszont komoly jelentősége lehet a több belépési ponttal rendelkező szubrutinoknak bonyolultabb feladatok esetén.
Horváthné Majsa Katalin Primo
12:34 Akkor most következzék egy egyszerű, de annál tanulságosabb feladat. Próbáljuk meg lerajzolni a Kovács szomszédék balatoni nyaralóját.
Kiss Donát
27:44 Végezetül próbáljuk összefoglalni a mai adásban megismertetett szubrutinok előnyeit. Azt mondhatjuk általában, hogy amennyiben egy olyan program írásához készülünk, amelyben sűrűn előfordul azonos vagy azonos típusú feladat, így az ilyen programokat a szubrutinok használata rövidebbé és főleg áttekinthetőbbé teszi. További előnye a szubrutinok használatának az, hogy ezeket a szubrutinokat függetlenül is, önállóan is meg lehet írni, ki lehet próbálni. És később ezekből föl lehet építeni a bonyolultabb, nagyobb programokat.
Most pedig lássuk a házi feladatot. A házi feladat a következő. Készítsünk olyan programot, amely mondjuk a hét valamelyik napjának délelőtti elfoglaltságait megkérdezi tőlünk, és kirajzolja a képernyőn azokat óránkénti bontásban. Ez emlékeztet a szokásos asztali naptár kivitelre, vagyis nyolctól kilencig, kilenctől tízig, és így tovább, megkérdezi, hogy mi az elfoglaltságunk, és ezeket valamilyen elfogadható formátumban kirajzolja a képernyőre, mint egy naptár. Nem titkolt célunk, hogy evvel a feladattal arra inspiráljuk önöket, hogy minél több szubrutint használjanak fel, hiszen véleményünk szerint úgy lehet ezt praktikusan megírni, s minél rövidebben, hogyha minél több szubrutint írunk hozzá. Mi is megírtuk az első lépését ennek a programnak, és ezt bemutatjuk azért, hogy lássuk, mire gondoltunk.