PodprogramPodprogram (anglicky subroutine) je v informatice označení části počítačového programu, kterou je možné opakovaně použít („vyvolat“) v různých místech programu, i z podprogramů. Podprogram může mít parametry, které určují, s jakými daty má pracovat, a může vracet hodnotu použitelnou při jeho vyvolání z výrazu. V některých programovacích jazycích se podprogramy rozlišují na funkce a procedury podle toho, zda vrací hodnotu nebo ne, v mnoha jazycích se pro podprogramy používá jeden z těchto termínů bez rozlišování, zda nějakou hodnotu vracejí. V objektovém programování se podprogramy tříd nazývají metody, v paralelním programování se používají koprogramy, jinde též jako volatelné unity, subprogramy a podobně.[1] Používání procedur je důležitým nástrojem strukturovaného programování a umožňuje zavádět do programů vyšší míru abstrakce. CharakteristikaPoužívání podprogramů je při programování natolik mocný nástroj,[2] že jej umožňuje naprostá většina programovacích jazyků. Používání podprogramů může vést ke snížení nákladů na údržbu rozsáhlých projektů a zároveň zvyšovat jejich kvalitu a spolehlivost.[3] Podprogramy jsou často sdružovány do knihoven, které se zaměřují na určitou oblast (například práce s grafikou, zvukem, šifrování a podobně). Knihovny usnadňují sdílení a prodej kódu. Objektově orientované programování přidružilo podprogramy k datům (tj. metody jsou součástí objektů nebo tříd). Podprogram může mít parametry (také označované za „argumenty“ jako v matematice), tedy při volání zadávané vstupní hodnoty podprogramu, které udávají, s jakými hodnotami má pracovat. Podprogram může vracet návratovou hodnotu. MotivaceDůvody pro členění programu na podprogramy jsou různé:
Návratová hodnotaNa tuto kapitolu je přesměrováno heslo Návratová hodnota.
Některé jazyky, jako Pascal, Fortran, Ada striktně rozlišují dva druhy podprogramů – funkce a procedury. Jiné jazyky (C, Lisp) takto striktně různé druhy podprogramů nerozlišují a používají buď jen jeden z uvedených názvů nebo je pokládají za synonyma. Podle toho lze rozlišit dvě hlavní skupiny podprogramů:
Výsledek a chování programové funkce na rozdíl od funkce v matematice se chová odlišně. To spočívá ve dvou projevech:
Parametry podprogramu Podrobnější informace naleznete v článku Parametr funkce. Na tuto kapitolu je přesměrováno heslo Parametry podprogramu.
Podle toho, jestli se parametry vyskytují v definici nebo volání podprogramu, rozlišujeme:
Skutečné parametry se zpracují (viz dále) a přiřadí nebo navážou na formální parametry, se kterými pracuje tělo podprogramu. Předávání parametrůPodle vztahu formálního a skutečného parametru rozlišujeme různé metody předávání (neboli volání) parametrů:
Většina programovacích jazyků má jenom část z uvedených metod volání parametrů (nejčastěji volání hodnotou plus jednu z metod volání odkazem, volání hodnotou a výsledkem a volání jménem). V definici funkce se uvádí, jaký způsob volání se má použít pro každý parametr. U některých typů lze vybrat jen některé metody, například pole se obvykle předává odkazem. Rekurzivní funkce Podrobnější informace naleznete v článku Rekurzivní funkce (programování).
Funkci nazveme rekurzivní pokud v jejím těle zavoláme tutéž funkci, tj. funkce volá sama sebe, je zacyklená. Rekurzivní funkce se v programování používá ke zjednodušení složitějších algoritmů. Nesprávné užití rekurze může způsobit velkou spotřebu paměti a velkou spotřebu času procesoru. Příkladem použití rekurzivní funkce může být algoritmus výpočtu faktoriálu. Přetížení funkce Podrobnější informace naleznete v článku 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. UkázkyJazyk C a C++Jazyk C všechny podprogramy nazývá funkce. Pro vyjádření, že funkce nevrací žádnou hodnotu a nemá žádné parametry se používá klíčové slovo void funkce1(void) { /* nějaký kód */ }
Tato funkce nevrací hodnotu a je volána: int funkce2(void)
{ return 5; }
Tato funkce navrací hodnotu (číslo 5) a funkci můžeme zavolat jako část příkazu: 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é:
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:
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 double F1(long);
typedef int F2(void *);
F2 * funkce5(F1*,F2*);
Jazyk PHPV netypovaných programovacích jazycích jako PHP je zápis funkce jednodušší: neuvádí se typy argumentů, jen názvy: function funkce1($a,$b) {
return($b['num']-$a['num']);
}
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. OdkazyReferenceV tomto článku byl použit překlad textu z článku Subroutine na anglické Wikipedii.
Související článkyExterní odkazy
|