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