Podprogram: Porovnání verzí
Smazaný obsah Přidaný obsah
PHP je netypovaný jazyk značka: editace z Vizuálního editoru |
Přepis článku |
||
Řádek 1:
'''Podprogram''' ({{Vjazyce|en}} {{Cizojazyčně|en|''subroutine''}}) je v [[Informatika|informatice]] označení části [[Počítačový program|počítačového programu]], kterou je možné při [[programování]] volat z 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
|author= U.S. Election Assistance Commission
|title= Definitions of Words with Special Meanings
* procedura – podprogram, který nevrací výslednou hodnotu a volá se jako [[příkaz]],▼
|work= [[Voluntary Voting System Guidelines]]
* funkce – podprogram, který vrací hodnotu a 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 procedury. Jiné jazyky ([[C (programovací jazyk)|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. V [[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 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 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.
Výsledek a chování programové funkce na rozdíl od [[funkce (matematika)|funkce]] v [[matematika|matematice]] se 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 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 [[vedlejší úč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í.▼
== Motivace ==
Řádek 14 ⟶ 17:
* rozklad složitých problémů na jednodušší, nebo v případě [[rekurze]] menší
* 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 formou [[
* 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í
▲* funkce – podprogram, který vrací hodnotu a lze jej volat ve [[
▲Výsledek a chování programové funkce na rozdíl od [[funkce (matematika)|funkce]] v [[matematika|matematice]] se 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 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 [[vedlejší úč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 ==
Řádek 34 ⟶ 48:
: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 funkce [[Ukazatel (
;'''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 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 (informatika)|pole]] se obvykle předává odkazem.
== Rekurzivní funkce ==▼
{{Podrobně|Rekurzivní funkce (programování)}}▼
Funkci nazveme [[Rekurzivní funkce (programování)|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 [[Algoritmus|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á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 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á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 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 predeklaraci), která vrací [[Ukazatel (
Podobné zápisy se v běžných programech vyskytují zřídka, protože bývají zpřehledněny pomocí <code>typedef</code>. Mohou se ale vyskytnout v chybové hlášce překladače nebo v automaticky generovaném zdrojovém kódu. Ekvivalentní definice pomocí <code>typedef</code> zní:
Řádek 89 ⟶ 112:
</source>
===
V 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 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.
▲== Rekurzivní funkce ==
▲{{Podrobně|Rekurzivní funkce (programování)}}
▲Funkci nazveme [[Rekurzivní funkce (programování)|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 [[Algoritmus|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á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 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 ==
Řádek 117 ⟶ 131:
=== Související články ===
* [[Lisp]]
[[Kategorie:Programovací konstrukce]]
|