1.2.14. Čo je to podprogram?
Pri programovaní potrebujeme často vykonávať nejakú činnosť viackrát. Ak je treba túto činnosť vykonávať nepravidelne, nemôžeme použiť príkaz cyklu. Aj s takýmto problémom si vieme poradiť, ak použijeme príkaz pre volanie podprogramu. Podprogram voláme príkazom GOSUB, ktorý má tvar:
GOSUG číslo riadku
Príkaz pre návrat z podprogramu má tvar:
RETURN
Podprogram je relatívne samostatná časť programu.
Pri odštartovaní programu s podprogramom pracuje počítač takto:
Hlavný program sa vykonáva postupne podľa pravidiel doteraz uvedených až po príkaz GOSUB. Na tomto mieste pokračuje vykonávanie programu na riadku uvedenom v príkaze GOSUB. Začne sa vykonávať podprogram (hovoríme, že voláme podprogram). Ak vo vykonávaní programu sa vráti do hlavného programu za príkaz GOSUB, ktorým sme podprogram volali. Po ukončení podprogramu pokračuje vykonávanie programu teda prvým príkazom za príkazom GOSUB. Počítač si vždy "pamätá", z ktorého miesta programu je podprogram volaný a po ukončení podprogramu sa na toto miesto vráti:
10 CLS
20 PRINT:PRINT"Ucast v zaujmovych kruzkoch":PRINT
30 GOSUB 200
40 PRINT"Modelarky";TAB(20);12
50 GOSUB 200
60
PRINT"Tanecny";TAB(20);21
70 GOSUB 200
80
PRINT"Vytvarny";TAB(20);15
90 GOSUB 200
100 STOP
200
PRINT:PRINT"-------------------------"
210 PRINT
220 RETURN
Tento program vypíše na obrazovku účasť v záujmových krúžkoch v škole. Činnosť programu je nasledovná:
Riadok 10-20 - mazanie obrazovky a výpis textu
Riadok 30 - volanie podprogramu na riadku 200; začne sa
vykonávať program od riadku 200 až po príkaz RETURN na riadku 220 (výpis čiary "---...---" na oddelenie textu).
Riadok 40 - výpis textu
Riadok 50 - volanie podprogramu, po jeho ukončení návrat za
príkaz GOSUB
Riadok 60 - výpis textu
Riadok 70 - volanie podprogramu
Riadok 80 - výpis textu
Riadok 90 - volanie podprogramu
Riadok 100- koniec hlavného programu
Riadok 200-220 - podprogram, jeho činnosť už bola popísaná
Podprogram sme využili celkom 4 krát na oddelení výpisu
Podprogram sme využili celkom 4 krát na oddelenie výpisu jednotlivých krúžkov od seba. Keby sme nemohli použiť volanie podprogramu, museli by sme namiesto príkazu GOSUB 200 vždy uvádzať celú postupnosť príkazov na riadkoch 200-210.
Na riadku 100 je použitý príkaz STOP na zastavenie programu. Keby sme riadok 100 vynechali, hlavný program vy pokračoval vykonávaním podprogramu bez použitia príkazu GOSUB. Ak by sa mal potom vykonávať príkaz RETURN, počítač ohlási chybu
7 RETURN without GOSUB, 220:1
lebo počítač sa snaží vrátiť na miesto volania podprogramu, ale nevie kam, lebo nebolo použité volanie podprogramu príkazom GOSUB.
Ďalšie vlastnosti podprogramu vysvetlíme po nasledujúcom príklade:
10 LET
x=6:LET y=4:LET s=0
20 GOSUB 100
30 LET x=7:LET y=3
40 GOSUB 100
50 LET x=12:LET y=3
60 GOSUB 100
70 GOTO 140
100 LET n=x*y
110 PRINT
x;"*";y;"=";n
120 LET s=s+1
130 RETURN
140 PRINT "Podprogram
bol volany ";s;" krat."
Na riadkoch 10, 30, 50 sa priradia hodnoty premenným x, y. Podprogram na riadkoch 100-130 vypočíta súčin zadaných hodnôt a vypíše výsledok.
Podprogram môže pracovať s tými premennými, s ktorými pracuje hlavný program, dokonca môže tieto hodnoty zmeniť (to je niekedy nevýhoda, ale nedá sa s tým nič robiť). V našom príklade sa mení v podprograme hodnota premennej s. Ak sa skončí podprogram, hlavný program môže pracovať s touto premennou, pričom hodnota premennej zostala nastavená z podprogramu. Na toto musíme dávať pozor. U nás premenná s predstavuje počítadlo, koľkokrát bol podprogram volaný.
Na riadku 70 treba použiť príkaz GOTO, aby sa nezačal vykonávať podprogram bez príkazu GOSUB.
Na uvedených príkladoch je vidieť, že podprogram môžeme volať viackrát z rôznych miest programu.
Každý podprogram by sa mal končiť príkazom RETURN. Ak má podprogram viac logických ukončení (vetvenie), doporučuje sa každú vetvu podprogramu zakončiť skokom na spoločný riadok s príkazom RETURN (kvôli prehľadnosti). Vo vnútri podprogramu môžeme použiť ďalší príkaz GOSUB pre volanie ďalšieho podprogramu. Takýto postup voláme vloženie podprogramov do seba. Vo vloženom podprograme môžeme použiť opäť príkaz GOSUB atď. Počet vložených podprogramov je obmedzený len veľkosťou voľnej pamäti pre zásobník.
Správne volanie podprogramov je ukázané na nasledujúcom obrázku:
Na riadkoch 40 a 60 sa volá podprogram 1.
V podprograme 1 sa volá na riadkoch 240 a 260 ďalší (vložený) podprogram 2.
Ak použijete viac podprogramov vložených do seba, príkazy GOSUB a RETURN sa môžu vyskytnúť v poradí GOSUB, GOSUB a RETURN, ale nie v postupnosti GOSUB, RETURN, RETURN.
Kvôli prehľadnosti sa umiestňujú podprogramy na koniec hlavného programu, i keď môžu byť umiestnené na ľubovoľnom mieste programu.
Na koniec si povedzme, že číslo riadku v príkaze GOTO a GOSUB môže byť zadané aritmetickým výrazom. Preto môžeme výstižným menom premennej označiť začiatok podprogramu a na toto meno sa potom odvolávať. Napr.
10 LET obsah=100: LET hlavicka=200: LET este=30
:
80 GOSUB hlavicka: GOSUB obsah: GOTO este