Podprogram: Porovnání verzí

Smazaný obsah Přidaný obsah
PHP je netypovaný jazyk
Přepis článku
Řádek 1:
'''Podprogram''' ({{Vjazyce|en}} {{Cizojazyčně|en|''subroutine''}}) je v&nbsp;[[Informatika|informatice]] označení části [[Počítačový program|počítačového programu]], kterou je možné při [[programování]] volat z&nbsp;různých míst [[Zdrojový kód|zdrojového kódu]] (i opakovaně). Podprogram může být v některých [[Programovací jazyk|programovacích jazycích]] označován jako ''procedura'' nebo ''funkce'' v závislosti na tom, zda vrací hodnotu nebo ne. V objektovém programování je podprogram označován jako [[Metoda (objektově orientované programování)|metoda]], v paralelním programování pak [[koprogram]], jinde též jako volatelná unita, subprogram a podobně.<ref>{{cite web
{{Upravit|vágní, místy}}
|author= U.S. Election Assistance Commission
'''Podprogram''' ({{Vjazyce|en}} {{Cizojazyčně|en|''subroutine''}}) je v&nbsp;[[programování]] část [[program]]u, kterou je možné '''volat''', a&nbsp;to i&nbsp;opakovaně a&nbsp;z&nbsp;různých míst [[kód]]u. Podprogram může mít [[parametr]]y (také označované za „argumenty“ jako v&nbsp;matematice), tedy při volání zadávané vstupní hodnoty podprogramu, které udávají, s&nbsp;jakými hodnotami má pracovat, a&nbsp;může „vracet“ ''návratovou hodnotu'', kterou dává jako svůj výsledek, výstup takového volání. Tak jsou dva odlišné typy podprogramů:
|title= Definitions of Words with Special Meanings
* procedura – podprogram, který nevrací výslednou hodnotu a&nbsp;volá se jako [[příkaz]],
|work= [[Voluntary Voting System Guidelines]]
* funkce – podprogram, který vrací hodnotu a&nbsp;lze jej volat ve [[výraz]]u.
|year= 2007
|url= http://www.eac.gov/vvsg/glossary.aspx
|accessdate= 2013-01-14
|authorlink= Election Assistance Commission}}</ref>
 
== Charakteristika ==
Některé jazyky, jako ([[Pascal (programovací jazyk)|Pascal]], [[Fortran]], [[Ada (programovací jazyk)|Ada]]) striktně rozlišují tyto dva druhy podprogramů – funkce a&nbsp;procedury. Jiné jazyky ([[C (programovací jazyk)|C]], [[Lisp]]) takto striktně různé druhy podprogramů nerozlišují a&nbsp;používají buď jen jeden z&nbsp;uvedených názvů nebo je pokládají za synonyma. V&nbsp;[[Objektově orientované programování|objektově orientovaných jazycích]] se podprogramy náležející určité třídě zpravidla nazývají [[metoda|metody]]. V&nbsp;mnoha moderních programovacích jazycích se termín '''podprogram''' vůbec nepoužívá.
Podprogram je v [[programování]] velmi mocný nástroj,<ref name="knuth1">{{cite book |title= The Art of Computer Programming, Volume I: Fundamental Algorithms |author= Donald E. Knuth |authorlink= Donald Knuth |publisher= Addison-Wesley |isbn=0-201-89683-4}}</ref> a proto je syntaxe pro podporu podprogramů zavedena v mnoha [[Programovací jazyk|programovacích jazycích]]. 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.<ref name="structprog">{{cite book |author= O.-J. Dahl |author2=E. W. Dijkstra |author3=C. A. R. Hoare |title= Structured Programming |publisher= Academic Press |year= 1972 |ISBN= 0-12-200550-3}}</ref> Podprogramy jsou často sdružovány do [[Knihovna (programování)|knihoven]], které se zaměřují na určitou oblast (například práce s [[Počítačová grafika|grafikou]], zvukem, [[Kryptografie|š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. [[Metoda (objektově orientované programování)|metody]] jsou součástí [[Instance třídy|objektů]] nebo [[Třída (programování)|tříd]]).
 
Podprogram může mít [[Parametr funkce|parametr]]y (také označované za „argumenty“ jako v&nbsp;matematice), tedy při volání zadávané vstupní hodnoty podprogramu, které udávají, s&nbsp;jakými hodnotami má pracovat. Podprogram může vracet návratovou hodnotu.
Výsledek a&nbsp;chování programové funkce na rozdíl od [[funkce (matematika)|funkce]] v&nbsp;[[matematika|matematice]] se chová odlišně. To spočívá ve dvou projevech:
* nemusí záviset jen na jeho parametrech a&nbsp;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&nbsp;s&nbsp;jinými daty, z&nbsp;jiných zdrojů, než se zadávanými parametry a&nbsp;provádět s&nbsp;nimi [[vstup/výstup|vstupní 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á i&nbsp;[[vedlejší účinek]], může měnit i&nbsp;jiné hodnoty, než jen vrácené do výrazu, ve kterém byla funkce volána, například hodnoty ovlivňující vzhled zobrazení.
 
== Motivace ==
Řádek 14 ⟶ 17:
* rozklad složitých problémů na jednodušší, nebo v&nbsp;případě [[rekurze]] menší
* odstranění opakování kódu v&nbsp;programu, a&nbsp;díky parametrům jeho zobecnění
* umožňuje znovupoužití v&nbsp;jiných programech, obvykle formou [[modulModulární programování|modulů]]ů nebo [[knihovna (programování)|knihoven]]
* rozvržení projektu mezi více programátorů
* odstínění detailů implementace od konkrétního použití funkce
 
== Návratová hodnota ==
Některé jazyky, jako ([[Pascal (programovací jazyk)|Pascal]], [[Fortran]], [[Ada (programovací jazyk)|Ada]]) striktně rozlišují tyto dva druhy podprogramů – funkce a&nbsp;procedury. Jiné jazyky ([[C (programovací jazyk)|C]], [[Lisp]]) takto striktně různé druhy podprogramů nerozlišují a&nbsp;používají buď jen jeden z&nbsp;uvedených názvů nebo je pokládají za synonyma. V&nbsp;[[ObjektověPodle orientovanétoho programování|objektovělze orientovanýchrozlišit jazycích]]dvě sehlavní podprogramyskupiny náležející určité třídě zpravidla nazývají [[metoda|metody]]. V&nbsp;mnoha moderních programovacích jazycích se termín '''podprogram''' vůbec nepoužívá.podprogramů:
 
* procedura – podprogram, který nevrací výslednou hodnotu a&nbsp;volá se jako [[příkaz]],
* funkce – podprogram, který vrací hodnotu a&nbsp;lze jej volat ve [[výrazVýraz (programování)|výrazu]]u.
 
Výsledek a&nbsp;chování programové funkce na rozdíl od [[funkce (matematika)|funkce]] v&nbsp;[[matematika|matematice]] se chová odlišně. To spočívá ve dvou projevech:
 
* nemusí záviset jen na jeho parametrech a&nbsp;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&nbsp;s&nbsp;jinými daty, z&nbsp;jiných zdrojů, než se zadávanými parametry a&nbsp;provádět s&nbsp;nimi [[vstup/výstup|vstupní 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á i&nbsp;[[vedlejší účinek]], může měnit i&nbsp;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 ==
Řádek 34 ⟶ 48:
:volající provede vyhodnocení výrazu zadaného jako argument funkce a&nbsp;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 funkce [[Ukazatel (informatikaprogramování)|ukazatel]] nebo [[referenceReference (programování)|referenci]] na [[proměnná|proměnou]]; funkce může obsah této proměnné nejen číst, ale i&nbsp;modifikovat (viz [[vedlejší úč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
Řádek 44 ⟶ 58:
Většina programovacích jazyků má jenom část z&nbsp;uvedených metod volání parametrů (nejčastěji volání hodnotou plus jednu z&nbsp;metod volání odkazem, volání hodnotou a&nbsp;výsledkem a&nbsp;volání jménem). V&nbsp;definici funkce se uvádí, jaký způsob volání se má použít pro každý parametr. U&nbsp;některých typů lze vybrat jen některé metody, například [[pole (informatika)|pole]] se obvykle předává odkazem.
 
== Rekurzivní funkce ==
== Ukázky v&nbsp;programovacích jazycích [[C (programovací jazyk)|C]] a&nbsp;[[C++]] ==
{{Podrobně|Rekurzivní funkce (programování)}}
Funkci nazveme [[Rekurzivní funkce (programování)|rekurzivní]] pokud v&nbsp;jejím těle zavoláme tutéž funkci, tj. funkce volá sama sebe, je zacyklená. Rekurzivní funkce se v&nbsp;programování používá ke zjednodušení složitějších [[Algoritmus|algoritmů]]. Nesprávné užití rekurze může způsobit velkou spotřebu paměti a&nbsp;velkou spotřebu času procesoru. Příkladem použití rekurzivní funkce může být algoritmus výpočtu [[faktoriál]]u.
 
== Přetížení funkce ==
{{Podrobně|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&nbsp;podle toho určí odpovídající funkci. Přetížení se týká i&nbsp;návratové hodnoty, překladač analyzuje typ požadované návratové hodnoty na levé straně přiřazovacího operátoru '''=''' a&nbsp;podle toho vybere příslušnou funkci.
 
== Ukázky ==
=== Jazyk C a C++ ===
[[C (programovací jazyk)|Jazyk C]] všechny podprogramy nazývá funkce. Pro vyjádření, že funkce nevrací žádnou hodnotu a&nbsp;nemá žádné parametry se používá [[klíčové slovo]] <code>void</code>:
 
Řádek 80 ⟶ 103:
int (*funkce5(double (*F)(long b), int (*f)(void* c))) (void * v);
</source>
Tento řádek deklaruje funkci funkce5 (bez těla, jedná se o&nbsp;predeklaraci), která vrací [[Ukazatel (informatikaprogramování)|ukazatel]] na funkci vracející integer a&nbsp;mající parametr typu nespecifikovaný ukazatel a&nbsp;má dva parametry: první je ukazatel na funkci vracející double (reálné číslo s&nbsp;dvojitou přesností) s&nbsp;parametrem typu long („dlouhé“ celé číslo), druhý je opět ukazatel na funkci, a&nbsp;to stejného typu jako funkce vracená, tedy vracející integer a&nbsp;mající parametr typu nespecifikovaný ukazatel.
 
Podobné zápisy se v&nbsp;běžných programech vyskytují zřídka, protože bývají zpřehledněny pomocí <code>typedef</code>. Mohou se ale vyskytnout v&nbsp;chybové hlášce překladače nebo v&nbsp;automaticky generovaném zdrojovém kódu. Ekvivalentní definice pomocí <code>typedef</code> zní:
Řádek 89 ⟶ 112:
</source>
 
=== UkázkaJazyk v&nbsp;[[PHP]] ===
V&nbsp;netypovaných programovacích jazycích jako [[PHP]] je zápis funkce jednodušší: neuvádí se typy argumentů, jen názvy:
 
Řádek 99 ⟶ 122:
 
Funkce předpokládá, že oba její argumenty jsou [[asociativní pole]] obsahující prvek num a&nbsp;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&nbsp;ta je opakovaně volá na dvojice prvků řazeného pole.
 
== Rekurzivní funkce ==
{{Podrobně|Rekurzivní funkce (programování)}}
Funkci nazveme [[Rekurzivní funkce (programování)|rekurzivní]] pokud v&nbsp;jejím těle zavoláme tutéž funkci, tj. funkce volá sama sebe, je zacyklená. Rekurzivní funkce se v&nbsp;programování používá ke zjednodušení složitějších [[Algoritmus|algoritmů]]. Nesprávné užití rekurze může způsobit velkou spotřebu paměti a&nbsp;velkou spotřebu času procesoru. Příkladem použití rekurzivní funkce může být algoritmus výpočtu [[faktoriál]]u.
 
== Přetížení funkce ==
{{Podrobně|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&nbsp;podle toho určí odpovídající funkci. Přetížení se týká i&nbsp;návratové hodnoty, překladač analyzuje typ požadované návratové hodnoty na levé straně přiřazovacího operátoru '''=''' a&nbsp;podle toho vybere příslušnou funkci.
 
== Odkazy ==
Řádek 117 ⟶ 131:
=== Související články ===
* [[Lisp]]
 
{{Pahýl}}
 
[[Kategorie:Programovací konstrukce]]