Lekce 1.16
Deklarace a používání podprogramů


předchozí lekce (1.15) obsah kurzu následující lekce (1.17)

Doposud jsme v našich programech používali pouze příkazy zabudované v systému. Nyní si ale předvedeme, jak si můžeme naprogramovat vlastní příkazy. Určitě jste se již setkali s tím, že pokud byste seskupili několik řádků programu, které se v uvedené sestavě v programu několikrát opakují do jednoho, byl by program přehlednější a kratší. Na to můžete použít procedury, kterým se také někdy říká podprogramy.

Podprogramy jsou volány z hlavního programu, vykonají příkazy zadané ve svém těle a po jejím ukončení předají vykonávání programu zpět do hlavního programu. Podprogramy jsou v programu označeny klíčovým slovem Sub, za kterým následuje jméno podprogramu s případným uvedením předávaných parametrů. Konec podprogramu je vyznačen příkazem End Sub. Každý podprogram musí být pojmenován. V programu se přitom nesmí vyskytovat více podprogramů se stejným jménem. Není také možné uvádět jména, která jsou použita systémem. Následuje příklad programu, ve kterém je použit podprogram:


Sub Nadpis
    Writeln("*************************")
    Writeln("* počítá systém BONANZA *")
    Writeln("*************************")
End Sub

Sub Main()
    ConsoleShow
    ConsoleClear
    a = 20
    b = 10
    Call nadpis
    Writeln("součet :"+IntToStr(a+b))
    Call nadpis
    Writeln("rozdíl :"+IntToStr(a-b))
    Call nadpis
    Writeln("násobek:"+IntToStr(a*b))
End Sub
V programu jsme definovali podprogram se jménem Nadpis, který vždy mezi výpočty vypíše tři řádky nadpisu. V hlavní proceduře Main již potom stačí zadat volání procedury Nadpis. Systém při každém volání procedury vypíše tři řádky nadpisu. Tím jsme ušetřili místo a program je také přehlednější.

Jistě budete souhlasit s tím, že možnost používání podprogramů je zajímavá vlastnost systému, že by ale byla ještě zajímavější, pokud by dokázal podprogram pracovat s různými vstupními hodnotami. To je také možné, musíme však ve volání podprogramu i v jeho deklaraci uvést seznam parametrů a upravit příkazy uvnitř podprogramu tak, aby dokázal s proměnnými parametry pracovat. Pokud byste například potřebovali nakreslit do grafického výstupního okna na zadanou pozici čtverec s délkou hrany 20 bodů, mohli byste použít následující příklad:


'procedura pro kresleni čtverce
Sub Ctverec(x, y)
   ImageRectangle x, y, x+20, y+20
End Sub

'hlavní program
Sub Main()
    ImageShow
    ImageInit 100,100
    ImageBrushColor(clYellow)
    ImageRectangle 5, 5, 95, 95
    ImageBrushColor(clRed)

    For k = 10 to 70
       If (k=10) or (k=40) or (k=70) then
          Call Ctverec(10, k)
          Call Ctverec(40, k)
          Call Ctverec(70, k)
       End If
    Next
End Sub
Podprogram Ctverec je volán se dvěmi parametry uvedenými v závorce, oddělenými čárkou. Podprogram má ve své definici deklarovány proměnné x a y, které se dále v proceduře používají. Do uvedených proměnných se převedou hodnoty zadané ve volání podprogramu. Podprogram potom se zadanými hodnotami pracuje. Tak je umožněno předávat podprogramu ke zpracování vstupní hodnoty.

Pokud má podprogram pracovat s předávanými parametry, je nutné v deklaraci podprogramu uvést za jejím jménem v závorce seznam použitých proměnných. Počet deklarovaných proměnných v podprogramu musí přitom vždy odpovídat počtu předávaných parametrů ve volání podprogramu. Parametry jsou od sebe odděleny čárkou.

Zkuste nyní upravit podprogram Ctverec i její volání tak, abyste mohli zadávat ve volání podprogramu i délku strany čtverce. Musíte proto přidat do volání podprogramu další parametr. Stejně tak budete muset přidat parametr do deklarace podprogramu. Parametr potom použijete pro zadání délky hrany čtverce.

Při programování podprogramů si musíte dát pozor na to, abyste v rámci podprogramu nepožadovali provedení stejného podprogramu. Takovým procedurám se říká rekurzivní volání. Rekurze nejsou v jazyce BONANZA umožněny.

Pomocí deklarace podprogramů dosáhnete toho, že si můžete definovat své vlastní příkazy. Je přitom možné volanému podprogramu zadávat předávané parametry. Není ale možné, aby podprogram vracel zpět výsledek provedení podprogramu. To vám umožní až funkce, které budou probrány v následující lekci.


předchozí lekce (1.15) obsah kurzu následující lekce (1.17)

OZOGAN, 1 Máje 97, 460 01 Liberec
tel.,fax: (048) 52 28 338, e-mail: info@ozogan.cz