Lekce 1.16
Deklarace a používání procedur


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.

Procedury jsou volány z hlavního programu, vykonají příkazy zadané ve svém těle procedury a po jejím ukončení předají vykonávání programu zpět do hlavního programu. Procedury jsou v programu označeny klíčovým slovem Procedure, za kterým následuje možná deklarace používaných proměnných a hlavně blok příkazů procedury vymezený klíčovými slovy begin a end. Každá procedura musí být pojmenována. V programu se přitom nesmí vyskytovat více procedur se stejným jménem. Následuje příklad jednoduché procedury:


Unit proc;
interface
implementation

var a, b : Integer;

Procedure nadpis;
begin
   Writeln('**************************');
   Writeln('* počítá systém KLONDAIK *');
   Writeln('**************************');
end;

begin
   ConsoleShow;
   ConsoleClear;
   a:= 20; b:=10;
   nadpis;
   Writeln('součet :'+IntToStr(a+b));
   nadpis;
   Writeln('rozdíl :'+IntToStr(a-b));
   nadpis;
   Writeln('násobek:'+IntToStr(a*b));
end;
end.
V programu jsme definovali proceduru se jménem nadpis, která vždy mezi výpočty vypíše tři řádky nadpisu. V hlavní proceduře 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í procedur je zajímavá vlastnost systému, že by ale byla ještě zajímavější, pokud by procedura dokázala pracovat s různými vstupními hodnotami. To je také možné, musíme však ve volání procedury i v její deklaraci uvést seznam parametrů a upravit příkazy uvnitř procedury tak, aby dokázaly 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:


Unit Ctverce;
interface
implementation

var k : Integer;

Procedure ctverec(x : Integer; y : Integer);
begin
   Rectangle(x, y, x+20, y+20);
end;

Begin
   ImageShow;
   ImageInit(100,100);
   ImageBrushColor(clYellow);
   Rectangle(5, 5, 95, 95);
   ImageBrushColor(clRed);
   For k:= 10 to 70 do
   begin
      if (k=10)or(k=40)or(k=70) then
      begin
         ctverec(10, k);
         ctverec(40, k);
         ctverec(70, k);
      end;
   end;
end;
end.
Procedura ctverec je volána se dvěmi parametry uvedenými v závorce, oddělenými čárkou. Procedura 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í procedury. Procedura potom se zadanými hodnotami pracuje. Tak je umožněno předávat proceduře ke zpracování vstupní hodnoty.

Pokud má procedura pracovat s předávanými parametry, je nutné v deklaraci procedury 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 proceduře musí přitom vždy odpovídat počtu předávaných parametrů ve volání procedury. V seznamu se uvádí jméno proměnné a za dvojtečkou její typ. Pokud používá procedura více parametrů, jsou parametry od sebe odděleny středníkem. Jestliže jsou parametry stejného typu, je možné uvést v deklaraci procedury jejich výčet oddělený čárkami, za posledním parametrem výčtu potom uvést jejich typ. Jsou proto možné následují dva způsoby zápisu:


Procedure tisk(x : Integer; y : Integer, s: String);
Procedure tisk(x,y : Integer; s: String);
Jak již bylo uvedeno dříve, je uvádění typu proměnné v deklaracích pouze doporučeno, není však bezpodmínečně vyžadováno. Proto je možné uvést v deklaraci procedury pouze seznam předávaných parametrů bez uvedení typu proměnné:

Procedure tisk(x, y, s);
Zkuste nyní upravit proceduru ctverec i její volání tak, abyste mohli zadávat ve volání procedury i délku strany čtverce. Musíte proto přidat do volání procedury další parametr. Stejně tak budete muset přidat parametr do deklarace procedury. Parametr potom použijete pro zadání délky hrany čtverce.

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

Pomocí deklarace procedur dosáhnete toho, že si můžete definovat své vlastní příkazy. Je přitom možné volané proceduře zadávat předávané parametry. Není ale možné, aby procedura vracela zpět výsledek provedení procedury. 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