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