předchozí lekce (1.15) | obsah kurzu | následující lekce (1.17) |
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) |