Funkce (programování)

Z Wikipedie, otevřené encyklopedie
Skočit na: Navigace, Hledání

Funkce v programování je část programu, kterou je možné opakovaně volat z různých míst kódu. Funkce může mít argumenty (též parametry) – údaje, které jí jsou předávány při volání – a návratovou hodnotu, kterou naopak vrací.

Na rozdíl od funkce v matematice nemusí výsledek funkce v programu záviset jen na jejích argumentech – v průběhu svého běhu může samostatně získávat data z paměti nebo jiných vstupů a provádět i výstupní operace, takže návratová hodnota zdaleka nemusí být jejím jediným výsledkem (viz vedlejší účinek) a funkce také nemusí mít žádné formální parametry (typ. funkce vracející hodnotu stisknuté klávesy). Často nemusí funkce vracet žádnou hodnotu, potom se taková funkce může nazývat procedurou.

Některé jazyky (Pascal, Fortran, Ada) odlišují funkce a funkcionální podprogramy (vracejí hodnoty) od podprogramů a procedur (nevracejí hodnoty). Jiné jazyky (C, Lisp) nerozlišují tyto termíny a pokládají je za synonyma. V objektově orientovaném programování se funkce náležející určité třídě nazývají metodami.

Motivace[editovat | editovat zdroj]

  • dekompozice složitých úkolů na jednotlivé prvky
  • odstranění duplicitního kódu v programu
  • umožňuje znovupoužití v jiných programech
  • rozvržení projektu mezi více programátorů nebo mezi více oddělení projektu
  • odčlenění detailů implementace od konkrétního uživatele funkce

Argumenty funkce[editovat | editovat zdroj]

  • formální argumenty (parametry) - udává jakého datového typu a počtu jsou jednotlivé argumenty funkce, některé programovací jazyky umožňují deklarovat funkce s proměnným počtem parametrů
  • skutečné argumenty (parametry) - jsou to skutečné argumenty (výrazy) uvedené při volání funkce

Předávání argumentů[editovat | editovat zdroj]

volání hodnotou (call by value)
volající provede vyhodnocení výrazu který je zadán jako argument funkce a výslednou hodnotu předá do volané funkce
volání odkazem (call by reference)
volající předá v argumentu funkce ukazatel nebo referenci na proměnou. Funkce může obsah této proměnné nejen číst, ale i modifikovat její obsah (viz vedlejší účinek). Často se pole jako argument funkce předává pomocí volání odkazem
volání jménem (call by name)
výraz v argumentu funkce se nevyhodnocuje a předá se do funkce tak jak je. Proto se ve funkci může tento argument vyhodnocovat vícekrát. Nejčastější použití je u symbolických maker

Ukázky v programovacích jazycích C a C++[editovat | editovat zdroj]

void funkce1(void) { /* nějaký kód */ }

Tato funkce nevrací hodnotu a je volána: funkce1();

int funkce2(void)
  { return 5; }

Tato funkce navrací hodnotu (číslo 5) a funkci můžeme zavolat jako část příkazu: x + funkce2()

char funkce3 (int cislo)
  { char rada[] = {'P','U','S','C','P','S','N'};
    return rada[cislo];
  }

Tato funkce konvertuje číslo mezi 0 a 6 na počáteční písmeno dne v týdnu. Ukázka: 0 → 'P', 1 → 'U', …, 6 → 'N'. Výsledek volání funkce může být přiřazen proměnné:

char pismeno_dne = funkce3(cislo);.

void funkce4 (int* ukazatel_na_promennou)
  { (*ukazatel_na_promennou)++; }

Tato funkce nevrací žádnou hodnotu, ale modifikuje proměnnou, jejíž adresa je zadána v parametru funkce. Funkci lze volat: funkce4(&promenna);.

int (*funkce5(double (*F)(long b), int (*f)(void* c))) (void * v);

Tento řádek deklaruje funkci funkce5 (bez těla, jedná se o predeklaraci), která vrací ukazatel na funkci vracející integer a mající parametr typu nespecifikovaný ukazatel a má dva parametry: první je ukazatel na funkci vracející double (reálné číslo s dvojitou přesností) s parametrem typu long („dlouhé“ celé číslo), druhý je opět ukazatel na funkci, a to stejného typu jako funkce vracená, tedy vracející integer a mající parametr typu nespecifikovaný ukazatel.

Podobné zápisy se v běžných programech vyskytují zřídka, protože bývají zpřehledněny pomocí typedef. Mohou se ale vyskytnout v chybové hlášce překladače nebo v automaticky generovaném zdrojovém kódu. Ekvivalentní definice pomocí typedef zní:

typedef double F1(long);
typedef int F2(void *);
F2 * funkce5(F1*,F2*);

Ukázka v PHP[editovat | editovat zdroj]

function funkce1($a,$b) {
  return($b['num']-$a['num']);
}

V beztypových programovacích jazycích jako PHP je zápis funkce jednodušší: neuvádí se typy argumentů, jen názvy. Funkce předpokládá, že oba její argumenty jsou asociativní pole obsahující prvek num a vrátí rozdíl těchto prvků. Podobné funkce se často používají jako callback pro řazení, tedy předají se jako argument řadící funkci a ta je opakovaně volá na dvojice prvků řazeného pole.

Rekurze[editovat | editovat zdroj]

Hlavní článek: Rekurze

Funkci nazveme rekurzivní pokud v jejím těle zavoláme tutéž funkci, tj. funkce volá sebe sama. Rekurze se v programování používá ke zjednodušení složitých algoritmů potřebné k vyřešení obtížných problémů. Při implementaci je třeba deklarovat ukončovací podmínku. Voláním chybně navržené rekurzivní funkce můžeme zapříčinit spuštění nekonečného cyklu. Rekurze se často v praxi používá např. při vyhledávání ve stromové struktuře, matematickém a fyzikálním modelování nebo počítačové grafice.

Přetížení funkce[editovat | editovat zdroj]

Hlavní článek: Přetížení funkce

Přetížení funkce (anglicky overloading) znamená deklarovat více funkcí pod stejným názvem lišících se ve struktuře seznamu parametrů (počet, datový typ). Při volání funkce překladač analyzuje parametry a podle toho určí odpovídající funkci. Přetížení se týká i návratové hodnoty, překladač analyzuje typ požadované návratové hodnoty na levé straně přiřazovacího operátoru = a podle toho vybere příslušnou funkci.

Odkazy[editovat | editovat zdroj]

Reference[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Subroutine na anglické Wikipedii.

Související články[editovat | editovat zdroj]