Lekce 1.17
Deklarace a pou₧φvßnφ funkcφ


p°edchozφ lekce (1.16) obsah kurzu nßsledujφcφ lekce (1.18)

V p°edchozφ lekci jsme si ukßzali, jak si nadefinovat vlastnφ p°φkaz ve form∞ procedury. Mnohdy by ale bylo v²hodnΘ, pokud by jsme mohli volat proceduru jako souΦßst v²razu tak, aby nßm vrßtila procedura v²sledek, se kter²m byste ve v²razu dßle pracovali. N∞co takovΘho je sice mo₧nΘ, pou₧φvajφ se k tomu ale funkce.

Funkce je definovanß Φßst programu, kterß je volanß z v²razu a provßdφ urΦitΘ v²poΦty, p°φpadn∞ akce. P°i ukonΦenφ funkce nßm vracφ po₧adovan² v²sledek, se kter²m se ve v²razu, odkud byla funkce volßna dßle pracuje. Uve∩me si proto p°φklad deklarace a pou₧itφ funkce v programu, kter² nßm provßdφ v²poΦet mocniny zadan²m exponentem (53 = 5 x 5 x 5, v²sledek je 125).


Unit Funkce;
interface
implementation

Function umocni(x, y : Integer): Integer;
var  k, v : Integer;
begin
   v := x;          {p°evezmeme zßklad}
   For k := 1 to y do
       v := v*x;    {nßsobφme opakovan∞ zßkladem}
   result := v;     {p°edßme v²sledku funkce}
end;

begin
   ConsoleShow;
   ConsoleClear;
   Writeln(umocni(2,9));  {vypφÜe hodnotu 1024}
   Writeln(umocni(3,3));  {vypφÜe hodnotu   81}
   Writeln(umocni(5,2));  {vypφÜe hodnotu  125}
end;
end.
Funkce se od procedury liÜφ sv²m zahßjenφm a ukonΦenφm, kdy je v²poΦet funkce uveden klφΦov²m slovem Function. V deklaraci funkce lze navφc na rozdφl od procedury uvΘst za seznamem p°ebφran²ch parametr∙ i typ v²sledku, kter² funkce vracφ. PoΦet deklarovan²ch prom∞nn²ch v procedu°e musφ 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 je mo₧nΘ uvΘst 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.

VÜimn∞te si, ₧e pokud uvedeme v deklaraci funkce prom∞nnΘ pro p°evzetφ parametr∙, jsou tyto prom∞nnΘ automaticky deklarovßny s uveden²m typem. Navφc je mo₧nΘ ve funkci deklarovat vlastnφ novΘ prom∞nnΘ, kterΘ mohou b²t pou₧ity pouze ve funkci, ve kterΘ byly deklarovßny.

DalÜφ prom∞nnß, kterß je automaticky deklarovßna je prom∞nnß pro p°edßnφ v²sledku. Naz²vß se v₧dy Result a je typu dle deklarace funkce. Do prom∞nnΘ ulo₧φme v²slednou hodnotu funkce, kterou chceme p°edat volanΘmu programu. Nap°φklad:


Result := v²raz;
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Θ. V²Üe uvedenou funkci je proto mo₧nΘ takΘ zadat nßsledujφcφm zp∙sobem:

Function umocni(x, y);
var  k, v;
begin
   v := x;          {p°evezmeme zßklad}
   For k := 1 to y do
       v := v*x;    {nßsobφme opakovan∞ zßkladem}
   result := v;     {p°edßme v²sledku funkce}
end;
P°i programovßnφ funkcφ si musφte dßt pozor na to, abyste v rßmci funkce nepo₧adovali provedenφ stejnΘ funkce. Takov²m funkcφm se °φkß rekurzivnφ volßnφ. Vyu₧φvajφ se nap°φklad p°i v²poΦtu faktorißlu nebo znßm²ch hanojsk²ch v∞₧φ. Rekurze nejsou v systΘmu KLONDAIK umo₧n∞ny.
p°edchozφ lekce (1.16) obsah kurzu nßsledujφcφ lekce (1.18)

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