Užitočnosť týchto pojmov sa prejaví, ak si chceme zapamätať určitý súbor príkazov. Najprv si ho zadefinujeme a potom ho môžeme vykonávať pomocou názvu procedúry alebo funkcie. Väčší program sa dá takto rozdeliť na menšie časti.
Procedúry sme už používali a zistili sme, že to nie je nič ťažké. Napríklad aj známy writeln je procedúrou.
writeln('ano');
Poďme si však vytvoriť svoju vlastnú. Procedúra sa deklaruje ešte pred blokom begin - end. (s bodkou). Vykonávame ju napísaním jej názvu (nezabudnime na bodkočiarku).
program nazov_programu;
{deklaracia procedury}
procedure moja_procedura;
begin
prikazy_procedury;
end;
{samotny program}
begin
moja_procedura;
end.
Naša sa bude volať meno a jej úlohou sa stane zistiť a vypísať vaše meno. Uznávam, že to nie je vôbec praktický príklad, ale poslúži nám.
program mena;
var
text_mena: string;
// deklaracia procedury
procedure meno;
begin
writeln('Zadajte meno.');
readln(text_mena);
writeln('Volate sa ',text_mena,'.');
end;
// samotny program
begin
meno;
writeln('Skusime to este raz.');
meno;
end.
Procedúry môžu mať aj tzv. parametre. Sú to premenné, ktoré musíme funkcii dodať pri každom jej vykonávaní a vždy môžu byť iné. Píšeme ich do zátvorky za názov procedúry. Ak je parametrov viac, pri deklarácii ich oddeľujeme bodkočiarkami, pri vykonávaní čiarkami (poznáte z writeln).
Teraz náš príklad zmeníme, aby bez zisťovania vypísal dve rôzne mená.
program mena2; // deklaracia procedury procedure meno (poradie: integer; text_mena: string); begin writeln(poradie,'. meno je ',text_mena,'.'); end; // samotny program begin meno(1,'Jano'); meno(2,'Peto'); end.
Funkcia sa od procedúry líši tým, že okrem vykonania sady príkazov vráti nejakú hodnotu. Deklaruje sa kľúčovým slovom function. Hodnotu, ktorá sa má vrátiť, určuje špeciálna premenná Result. Aby ste ju mohli vo Free Pascale používať bez jej manuálnej deklarácie, treba zapnúť kompatibilitu s Delphi. Kliknite na menu Options / Compiler a zaškrtnite políčko Delphi compatibility (ak už nie je zaškrtnuté).
Existuje aj iný spôsob - deklarovať premennú Result bežným spôsobom v časti var. Teraz sa ale pozrime na príklad (kompatibilita je už zapnutá).
program mocniny; // deklaracia funkcie function mocnina (zaklad, exponent: integer): integer; var c, vysledok: integer; begin vysledok := 1; for c := 1 to exponent do vysledok := vysledok * zaklad; Result := vysledok; end; // samotny program begin writeln(mocnina(10,2)); readln; end.
Všimnite si, že časť var sa môže nachádzať priamo v deklarácii funkcie. Tieto premenné budú prístupné len pre aktuálnu funkciu a po jej ukončení zaniknú.
Nakoniec ešte spomeniem tretí spôsob vrátenia hodnoty, asi jediný použiteľný v starom Turbo Pascale. Jednoducho priradíme výsledok premennej, ktorej názov je zhodný s názvom funkcie.
function Funkcia; begin Funkcia := 10; end;
Nasledujúci text nie je pre úplných začiatočníkov, ale aj tí si ho môžu prečítať.
Rekurzívna funkcia je taká, ktorá volá samú seba. Samozrejme, že nie vždy - vtedy by nastal nekonečný cyklus. Takto nejako môže vyzerať rekurzívna funkcia:
function rekurzia(...): ...; begin if ... then Result := ... rekurzia(...) else Result := ...; end;
Výpočet faktoriálu je asi najznámejší príklad na rekurzívne funkcie. Skúste miesto bodiek v predchádzajúcom texte doplniť časti kódu. Výsledkom má byť funkcia na výpočet faktoriálu čísla zadaného ako jej parameter. Číslo získame od užívateľa - z klávesnice.
Ak ste zabudli, čo je faktoriál, stručne vám to pripomeniem: napr. pre číslo 4 ho vypočítame ako 4*3*2*1.
Ešte jedna (veľmi dôležitá) pomôcka: Pre faktoriál (zapisuje sa výkričníkom) platí:
n! = n*(n-1)!
Ak ste na riešenie neprišli, nezúfajte, je tu: faktor.pas.
Počítať faktoriál týmto spôsobom nie je veľmi efektívne, ale je to výborná ukážka rekurzívnych funkcií. Musím vás tiež upozorniť, že faktoriál veľmi rýchlo rastie a najväčšie číslo, ktoré môžete dosadiť za parameter, je v našom prípade 12.