Podprogram: Porovnání verzí

Smazaný obsah Přidaný obsah
Hartrik (diskuse | příspěvky)
m odebrána Kategorie:Programování; přidána Kategorie:Programovací konstrukce za použití HotCat
Opravy textu
Řádek 1:
'''FunkcePodprogram''' ({{Vjazyce|en}} {{Cizojazyčně|en|''subroutine''}}) je v [[programování]] je část programu, kterou je možné opakovaně volat opakovaně z různých míst kódu. Funkce můžeMůže mít ''argumentyparametry'', (téžkteré [[parametrudávají, funkce|parametry]])s jakými údaje,hodnotami které pracovat, jsoua předáványmůže přivracet volání''návratovou hodnotu''. aPodprogram, návratovoukterý nevrací hodnotu, kterouse naopakvolá jako příkaz; podprogram, který vrací hodnotu, lze vyvolat ve výrazu.
 
Některé jazyky ([[Pascal (programovací jazyk)|Pascal]], [[Fortran]], [[Ada (programovací jazyk)|Ada]]) odlišujístriktně funkce a funkcionálnírozlišují podprogramy, které (vracejí hodnoty)hodnotu, a nazývají je '''funkce''', od podprogramů, které návratovou hodnotu nemají, a procedurkteré (nevracejínazývají hodnoty)'''procedury'''. Jiné jazyky ([[C (programovací jazyk)|C]], [[Lisp]]) nerozlišujítakto tytostriktně termínyrůzné druhy podprogramů nerozlišují a pokládajípoužívají buď jen jeden z uvedených názvů nebo je pokládají za synonyma. V [[Objektově orientované programování|objektově orientovanémorientovaných programováníjazycích]] se funkcepodprogramy náležející určité třídě zpravidla nazývají '''metodamimetody'''. V mnoha moderních programovacích jazycích se termín '''podprogram''' vůbec nepoužívá.
Na rozdíl od [[funkce (matematika)|funkce]] v [[matematika|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'''.
 
Výsledek podprogramu na rozdíl od [[funkce (matematika)|funkce]] v [[matematika|matematice]] nemusí záviset jen na jeho parametrech – podprogram při svém v provádění může pracovat i s jinými daty a provádět [[vstup/výstup|vstupní nebo výstupní operace]], takže návratová hodnota zdaleka nemusí být jeho jediným výsledkem (viz [[vedlejší účinek]]).
Některé jazyky ([[Pascal (programovací jazyk)|Pascal]], [[Fortran]], [[Ada (programovací jazyk)|Ada]]) odlišují funkce a funkcionální podprogramy (vracejí hodnoty) od podprogramů a procedur (nevracejí hodnoty). Jiné jazyky ([[C (programovací jazyk)|C]], [[Lisp]]) nerozlišují tyto termíny a pokládají je za synonyma. V [[Objektově orientované programování|objektově orientovaném programování]] se funkce náležející určité třídě nazývají '''metodami'''.
 
== Motivace ==
 
* dekompozice složitých úkolů na jednotlivé prvky
* rozklad složitých problémů na jednodušší
* odstranění duplicitníhoopakování 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íodstínění detailů implementace od konkrétního uživatele funkce
 
== ArgumentyParametry funkcepodpogramu ==
 
Podle toho, jestli se parametry vyskytují v definici nebo volání podprogramu, rozlišujeme:
* '''formální argumenty''' (parametry) - udává jakého [[datový typ|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
* '''formální parametry''' - jsou parametry použité v definici podprogramu; umožňují specifikovat, jakého [[datový typ|datového typu]] jsou jednotlivé parametry podprogramu, a jaké operace se s nimi uvnitř podprogramu provádějí
* '''formálnískutečné argumentyparametry''' (parametryargumenty) - udávájsou jakéhoto [[datovýparametry typ|datového(výrazy typu]]nebo aproměnné) počtupoužité jsouve jednotlivé argumentyvolání funkce,; některé programovací jazyky umožňují deklarovatdovolují funkce s proměnným počtem parametrů
 
=== Předávání argumentůparametrů ===
 
Podle vztahu formálního a skutečného parametru rozlišujeme různé metody předávání (neboli volání) parametrů:
 
=== Předávání argumentů ===
;'''volání hodnotou''' ('''call by value''')
:volající provede vyhodnocení výrazu který je zadánzadaného jako argument funkce a výslednou hodnotu předá dopříslušnému volanéformálnímu funkceparametru
;'''volání odkazem''' ('''call by reference''')
:volající předá v argumentu funkce [[Ukazatel (informatika)|ukazatel]] nebo [[reference|referenci]] na [[proměnná|proměnou]].; Funkcefunkce může obsah této proměnné nejen číst, ale i modifikovat její obsah (viz [[vedlejší účinek]]). Často se [[pole (informatika)|pole]] jako argument funkce předává pomocí volání odkazem
;'''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.; Protoproto se ve funkci může tento argument vyhodnocovat vícekrát.; Nejčastějšív kompilovaných jazycích jde o anachronismus; nejčastější použití je u symbolických [[makro (programování)|maker]]
 
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á metoda 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.
 
== Ukázky v programovacích jazycích [[C (programovací jazyk)|C]] a [[C++]] ==