gvp-local

Funkce a procedury

Pokud jsme při programování postaveni před příliš složitý úkol, cesta k jeho vyřešení vede přes rozdělení úkolu na několik úkolů dílčích a tedy jednodušších. Tato metoda se někdy označuje jako "metoda rozděl a panuj". K napsání programu rozděleného na několik částí máme v programovacích jazycích k dispozici funkce a procedury.

Funkce

Funkce je část programu, která končí určením nějaké hodnoty. Tato hodnota může být vcelku libovolného typu (např. integer, real, char, string, boolean). Běžně se používá termín, že funkce tuto hodnotu vrací. Výsledná hodnota často závisí na jedné nebo několika vstupních hodnotách - tyto vstupní hodnoty se nazývají parametry nebo argumenty. Některé funkce jsou v Pascalu už naprogramovány. Například ty, uvedené v následující tabulce.

funkce popis příklad použití
sin(x) vrací sinus svého parametru x y:=sin(x/180*pi)
do y bude přiřazena hodnota sin x (před výpočtem je x převedeno ze stupňů na radiány.
round(x) zaokrouhlí reálnou hodnotu x na celočíselnou i:=round(5.689)
do i bude přiřazeno číslo 6
abs(x) vrací absolutní hodnotu svého parametru x writeln(abs(a))
bude vytištěna absolutní hodnota proměnné a
sqrt(x) vrací druhou odmocninu parametru x while a<sqrt(y) do
cyklus bude probíhat dokud proměnná a bude menší než odmocnina z proměnné y
pi vrací hodnotu p = 3,141 592 653 589 793 238 5 writeln('obvod kruhu ',2*pi*r,' cm')
bude vytištěn obvod kruhu s poloměrem r cm. Tato funkce nemá žádné parametry.
UpCase(S) převede řetězec S na velká písmena writeln(UpCase('Praha'))
bude vytištěno PRAHA

Pokud mezi standardními funkcemi nenalezneme tu, kterou potřebujeme, můžeme si naprogramovat funkci vlastní - tzv. uživatelskou. Programování vlastní funkce začíná slovem function a má syntaxi:

function jmeno_funkce(seznam parametrů a jejich typů):typ_výsledku;
tělo funkce

Tělo funkce je vlastně takový malý program. Platí zde naprosto stejná pravidla jako pro velký program. Mohou zde být například deklarace proměnných (za slovem Var) a také zde musí být program pro určení hodnoty, kterou funkce bude vracet (mezi slovy begin a end musí být mimo jiné alespoň 1x uvedeno přiřazení jmeno_funkce:=výraz )

Funkce, která vrací průměr svých parametrů x, y je velmi jednoduchá. Všiměte si, že má dva parametry.

function prumer(x,y:real):real;
begin
  prumer:=(x+y)/2;
end;

Funkce, která vrací faktoriál svého parametru je o trochu složitější. Používá své vlastní tzv. lokální proměnné.

function faktorial(n:integer):double;
var i:integer;
    f:double;
begin
  f:=1;
  for i:=1 to n do f:=f*i;
  faktorial:=f;
end;

Velmi podobná je funkce pro výpočet mocniny xn. Má dva parametry různých typů.

function mocnina(x:real;n:integer):real;
var
  i:integer;
  m:real;
begin
  m:=1;
  for i:=1 to n do m:=m*x;
  mocnina:=m;
end;

Naprogramované funkce lze používat běžným způsobem. Ukažme si ho na příkladu funkce Faktorial naprogramované výše. Funkce má deklaraci: function faktorial(n:integer):double;

č. příkaz popis
1 writeln(faktorial(5)) Vytiskne se hodnota faktoriálu z pěti tj. 120
2 y:=faktorial(5) Hodnota faktoriálu z pěti tj. 120 bude přiřazena proměnné y. Proměnná y musí být typu double.
3 y:=faktorial(a) Do proměnné y bude přiřazena hodnota faktoriálu proměnné a. Proměnná a musí být typu integer.
4 y:=faktorial(n) Do proměnné y bude přiřazena hodnota faktoriálu proměnné n. Proměnná n musí být typu integer.
5 y:=faktorial(a+b) Do proměnné y bude přiřazena hodnota faktoriálu ze součtu a+b. Součet a+b musí být typu integer.

V souvislosti s fukcemi je dobré správně rozlišovat pojmy formální parametr a skutečný parametr.

Formální parametr je identifikátor pomocí kterého je funkce deklarována. V případě naší funkce
function faktorial(n:integer):double;
je formálním parametrem n.

Skutečný parametr (někdy též argument) funkce je ten parametr, se kterým je funkce použita (volána)

Při volání (použití funkce) je nejprve formální parametr nahrazen skutečným parametrem, poté je vykonáno tělo funkce a výsledná hodnota je vrácena na místo, kde byla funkce volána. Ilustrujme si to na příkladu funkce

function faktorial(n:integer):double;
var i:integer;
  f:double;
begin
  f:=1;
  for i:=1 to n do f:=f*i;
  faktorial:=f;
end;
Jestliže se budou provádět řádky
a:=2;b:=4;
y:=faktorial(a+b);

bude formální parametr n nahrazen skutečným parametrem a+b, tj. hodnotou 6 a provedou se řádky

begin
 f:=1;
 for i:=1 to a+b do f:=f*i;
 faktorial:=f;
end;
 
begin
  f:=1;
  for i:=1 to 6 do f:=f*i;
  faktorial:=f;
end;

Do proměnné y bude tedy přiřazena hodnota 6! tj. 720.

Zde si můžete stáhnout soubor se zdrojovými texty příkladů.