Přeskočit na obsah

Podprogram

Z Wikipedie, otevřené encyklopedie

Podprogram(anglickysubroutine) je vinformaticeoznačení částipočítačového programu,kterou je možné opakovaně použít („vyvolat “) v různých místechprogramu,i z podprogramů. Podprogram může mítparametry,které určují, s jakými daty má pracovat, a může vracet hodnotu použitelnou při jeho vyvolání zvýrazu.V některýchprogramovacích jazycíchse podprogramy rozlišují nafunkceaprocedurypodle 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í. Vobjektovém programováníse podprogramytřídnazý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ástrojemstrukturovaného programovánía umožňuje zavádět do programů vyšší míruabstrakce.

Charakteristika

[editovat|editovat zdroj]

Používání podprogramů je připrogramovánínatolik mocný nástroj,[2]že jej umožňuje naprostá většinaprogramovací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 doknihoven,které se zaměřují na určitou oblast (například práce sgrafikou,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.metodyjsou součástíobjektůnebotříd).

Podprogram může mítparametry(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.

Důvody pro členění programu na podprogramy jsou různé:

  • rozklad složitých problémů na jednodušší, nebo v případěrekurzemenší
  • odstranění opakování kódu v programu, a díky parametrům jeho zobecnění
  • umožňuje znovupoužití v jiných programech, obvykle formoumodulůneboknihoven
  • rozvržení projektu mezi více programátorů
  • odstínění detailů implementace od konkrétního použití funkce

Návratová hodnota

[editovat|editovat zdroj]
Na tuto kapitolu jepřesměrovánohesloNávratová hodnota.

Některé jazyky, jakoPascal,Fortran,Adastriktně 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ů:

  • procedura – podprogram, který nevrací výslednou hodnotu a volá se jako příkaz,
  • funkce – podprogram, který vrací hodnotu a lze jej volat vevýrazu.

Výsledek a chování programové funkce na rozdíl odfunkcevmatematicese chová odlišně. To spočívá ve dvou projevech:

  • nemusí záviset jen na jeho parametrech a při volání se stejnými parametry může podprogram vracet jiné návratové hodnoty. Důvodem je, že při svém provádění může pracovat i s jinými daty, z jiných zdrojů, než se zadávanými parametry a provádět s nimivstupní nebo výstupní operace;nejběžnějším příkladem takových vstupů jsou změřené hodnoty nebo čas počítače
  • obdobně návratová hodnota zdaleka nemusí být jeho jediným výsledkem, ale má ivedlejší účinek,může měnit i jiné hodnoty, než jen vrácené do výrazu, ve kterém byla funkce volána, například hodnoty ovlivňující vzhled zobrazení.

Parametry podprogramu

[editovat|editovat zdroj]
Podrobnější informace naleznete v článkuParametr funkce.Na tuto kapitolu jepřesměrovánohesloParametry podprogramu.

Podle toho, jestli se parametry vyskytují v definici nebo volání podprogramu, rozlišujeme:

  • formální parametry– jsou parametry použité v definici podprogramu; umožňují specifikovat, jakéhodatového typujsou jednotlivé parametry podprogramu, a jaké operace se s nimi uvnitř podprogramu provádějí
  • skutečné parametry(argumenty) – jsou to parametry (výrazy nebo proměnné) použité ve volání funkce; některé programovací jazyky dovolují funkce s proměnným počtem parametrů

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ů

[editovat|editovat zdroj]

Podle vztahu formálního a skutečného parametru rozlišujeme různé metody předávání (neboli volání) parametrů:

volání hodnotou (call by value)
volající provede vyhodnocení výrazu zadaného jako argument funkce a výslednou hodnotu předá příslušnému formálnímu parametru
volání odkazem (call by reference)
volající předá v argumentu funkceukazatelneboreferencinaproměnou;funkce může obsah této proměnné nejen číst, ale i modifikovat (vizvedlejší účinek)
volání výsledkem (call by result)
při vstupu do funkce má proměnná odpovídající formálnímu parametru nedefinovanou hodnotu; funkce ji může používat jako lokální proměnnou; při skončení funkce se její hodnota předá skutečnému parametru
volání hodnotou a výsledkem (call by value and result)
formální parametr se chová jako lokální proměnná, které se při vstupu do funkce předá hodnota argumentu funkce a při výstupu se předá hodnota zpátky; chování je velmi podobné jako u volání odkazem; rozdíl se projeví, pokud funkce s proměnnou, která se používá jako skutečný parametr, pracuje i přímo
volání jménem (call by name)
výraz v argumentu funkce se nevyhodnocuje a předá se do funkce tak jak je; ve funkci se může tento argument vyhodnocovat vícekrát; používá se vefunkcionálních jazycícha veskriptovacích jazycíchvyžívajících textové nahrazování; v kompilovaných jazycích jde o anachronismus; nejčastější použití je u symbolickýchmaker;

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říkladpolese obvykle předává odkazem.

Rekurzivní funkce

[editovat|editovat zdroj]
Podrobnější informace naleznete v článkuRekurzivní funkce (programování).

Funkci nazvemerekurzivní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šíchalgoritmů.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čtufaktoriálu.

Přetížení funkce

[editovat|editovat zdroj]
Podrobnější informace naleznete v článkuPřetížení funkce.

Přetížení funkce (anglickyoverloading) 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.

Jazyk C a C++

[editovat|editovat zdroj]

Jazyk Cvšechny podprogramy nazývá funkce. Pro vyjádření, že funkce nevrací žádnou hodnotu a nemá žádné parametry se používáklíčové slovovoid:

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

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

intfunkce2(void)
{return5;}

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

charfunkce3(intcislo)
{charrada[]={'P','U','S','C','P','S','N'};
returnrada[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);.

voidfunkce4(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)(longb),int(*f)(void*c)))(void*v);

Tento řádek deklaruje funkci funkce5 (bez těla, jedná se o predeklaraci), která vracíukazatelna 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ítypedefzní:

typedefdoubleF1(long);
typedefintF2(void*);
F2*funkce5(F1*,F2*);

V netypovaných programovacích jazycích jakoPHPje zápis funkce jednodušší: neuvádí se typy argumentů, jen názvy:

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

Funkce předpokládá, že oba její argumenty jsouasociativní poleobsahují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.

V tomto článku byl použitpřekladtextu z článkuSubroutinena anglické Wikipedii.

  1. U.S. Election Assistance Commission.Definitions of Words with Special Meanings[online]. 2007 [cit. 2013-01-14].Dostupné v archivupořízeném dne 2012-12-08.
  2. Donald E. Knuth.The Art of Computer Programming, Volume I: Fundamental Algorithms.[s.l.]: Addison-WesleyISBN0-201-89683-4.
  3. O.-J. Dahl; E. W. DIJKSTRA; C. A. R. HOARE.Structured Programming.[s.l.]: Academic Press, 1972.ISBN0-12-200550-3.

Související články

[editovat|editovat zdroj]

Externí odkazy

[editovat|editovat zdroj]
  • Slovníkové heslofunkceve Wikislovníku