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.