Počítače a programování 1 5.přednáška
Obsah přednášky Dekompozice algoritmu – podprogramy Podprogramy – funkce, procedury Podprogramy v jazyku Java – metody Statické metody Parametry formální a skutečné Aktivace podprogramů Rekurzivní metody Metody s více parametry, metody přetížené
Podprogramy - procedury a funkce Základní pojmy Podprogram pojmenovaná část algoritmu reprezentující určitý logický celek. Obecně podprogramy dvojího druhu: Procedury podprogramy, hlavním výsledkem je provedení nějaké činnosti. Funkce podprogramy, hlavním výsledkem je získání určité hodnoty.
Podprogramy – procedury a funkce Volání (aktivace) procedury příkaz procedury. Volání funkce zápis funkce. Deklarace procedury (funkce) část textu programu, která definuje činnost provedenou při volání procedury (funkce). Standardní neboli předdefinované, knihovní) procedury (funkce) (matematické funkce či algoritmy běžných operací týkající se vstupu a výstupu programu, ovládání periferií)
Aktivace podprogramů Aktivace procedury příkaz procedury Aktivace funkce se provádí ve výrazu zápis funkce Funkce vždy představuje hodnotu!
Parametry Činnost programu lze ovlivnit parametry Parametrem může být výraz: hodnotou ovlivňuje činnost podprogramu (počáteční hodnota), prostor pro zápis výsledné hodnoty (tvořen pouze zápisem proměnné).
Parametry skutečné a formální Parametry uvedené při volání podprogramu skutečné. Parametry uvedené v deklaraci podprogramu formální. Pořadí, počet a typ skutečných parametrů musí přesně odpovídat pořadí a typu formálních parametrů.
Metody Podprogram– v objektově orientovaném programování (OOP) je nahrazen pojmem metoda – způsob „jak čeho dosáhnout“ (poznámka: často užívaný termín funkce není v tomto případě přesný, jdná se více o syntaktický rozdíl, nikoli sémantický) Program zapsaný v jazyce Java – vždy obsahuje minimálně jednu metodu (funkci – podprogram), který se musí jmenovat main() Zpracování programu začíná voláním metody main() a končí opuštěním této metody
Metody Elementární a nezbytné části metody: Základní podoba definice: Název Argumenty Typ návratové hodnoty Tělo metody Základní podoba definice: typNávratovéHodnoty názevMetody (/* seznam argumentů*/) { /* tělo metody*/ }
Metody Název metody a seznam argumentů metodu jednoznačně určují Návratový typ je typ návratové hodnoty, která je získána zavoláním metody Seznam argumentů ( v podstatě parametrů podprogramu) určuje typy a názvy jednotlivých položek, jejichž prostřednictvím jsou metodě předávány určité informace Název metody a seznam argumentů metodu jednoznačně určují
Metody Metody v Javě: Metody třídy (statické metody) Metody instance Poznámka: na rozdíl od jazyků typu Pascal nemohou být metody vnořovány (tj. jedna metoda nemůže ve svém těle obsahovat deklaraci další metody).
Metody Cíl metody – provedení jedné, jasně definované činnosti Délka kódu metody – ne delší než 20 řádek Název metody – výstižný, krátký V celém programu jednotná konvence zápisu identifikátorů, především u metod
Deklarace metody Hlavička metody – jméno, typ návratové hodnoty, popř. typy a jména jejích formálních parametrů Tělo metody – (program) – je uzavřeno do složených závorek { }, může obsahovat příkazy i deklarace proměnných Výstupní hodnota metody je předávána příkazem return
Příkaz return return (výraz) nebo return výraz Je vypočtena hodnota výrazu a přiřazena jako návratová hodnota metody, metoda je ukončena Statické metody jsou uvnitř jedné třídy volány použitím běžné konvence: x = min(3*a,b-c*d)
Metoda bez parametrů Metoda musí být deklarována i volána stejným způsobem jako metoda s parametry Příklad: static int nasob ( ) { int a,b; a=ctiInt(); b=ctiInt(); return (a*b); } Volání: i = nasob ( );
Metoda bez návratového typu - procedura V podstatě nelze zapsat metodu bez návratového typu, lze však použít návratový typ void (tj.prázdný) Metoda musí být deklarována i volána stejným způsobem jako v předchozím případě Příklad: static void tiskVysledku(int cas) { System.out.println(„hod:“ +cas+“hod.“); } Volání: tiskVysledku(t); tiskVysledku(2);
Metoda bez návratového typu - procedura Poznámka: U procedur není příkaz return povinný, není-li uveden, je nahrazen běžným ukončením metody, tj. složenou závorkou } Příkaz return se pak používá pouze pro nucené ukončení metody před dosažením běžného konce na základě nějaké podmínky
Procedura bez parametrů Nejjednodušší typ metody Použití – především pro různé výstupy (tisky) Příklad: static void tisk() { System.out.println(„KONEC“); }
Metoda s více parametry různých typů Větší počet formálních parametrů – vypisují se jednotlivě včetně svých typů a oddělují se čárkami V deklaraci lze volit pořadí parametrů libovolně, při volání je nutno zvolené pořadí dodržet Pozor - na rozdíl od Pascalu nelze uvést seznam parametrů určitého typu, v OOP je počet parametrů nižší než ve strukturovaném programování Doporučení – není vhodné volit větší počet parametrů (cca 5 parametrů, ne více)
Rekurze Podprogram volá sám sebe přímá rekurze Podprogram X volá podprogram Y a ten opět volá podprogram X nepřímá rekurze Podprogramy existují ve všech programovacích jazycích; rozdílný je způsob deklarace, konkrétní způsob realizace a možnost použití rekurze
Rekurzivní metody Rekurze – v těle metody volá metoda sama sebe Public class Faktor { public static void main }String [] args{ System.out.println(“20!” + fakt (20)); } Public static long fakt (long n){ if (n>1) return n * fakt (n-1); else return 1;
Konverze skutečných parametrů a návratové hodnoty Není-li typ návratové hodnoty shodný s návratovým typem metody: Je provedena implicitní konverze (zúžení) Není-li možný předchozí krok, je nutno provést explicitní rozšiřující typovou konverzi Obdobný postup platí v případě typové rozdílnosti pro skutečné a formální parametry
Mechanismus volání podprogramu Volání podprogramu programový skok s uchováním návratové adresy (adresa následující instrukce za voláním procedury) (funkce). Uchování návratové adresy na jeden a ten samý podprogram mohou vést odkazy z různých míst programu.
Mechanismus volání podprogramu Instrukce vyvolání podprogramu zajistí uchování návratové adresy do speciální části paměti. Paměť typu LIFO (Last In First Out zásobník
Způsoby předávání parametrů Parametry (obecně u jazyků typu Pascal): volané hodnotou volané odkazem s udáním typu bez udaného typu
Mechanismus předávání 1. parametry volané hodnotou a) v okamžiku volání se v zásobníku (STACK) vyhradí místa pro všechny parametry volané hodnotou a označí se jmény formálních parametrů. hodnoty skutečných parametrů se do takto alokovaných míst zkopírují 2. parametry volané odkazem Místo kopie do stacku (zásobníku) se pouze ztotožní adresy skutečného a formálního parametru (nealokuje se nové paměťové místo).
Předávání skutečných parametrů metod Java umožňuje pouze předávání hodnotou (call by value), skutečné parametry mohou být v metodě pouze čteny Možnost volání odkazem je na rozdíl od jazyka C řešeno pomocí OOP
Přetížené metody Overloaded Metody mající stejná jména, ale různé hlavičky Formální parametry se musí lišit počtem nebo typem nebo pořadím Pozor – nelze přetížit pouze změnou návratové hodnoty Příklad – metoda print ()
Globální a lokální proměnné Nelokální proměnné – „globální“ – nesprávná terminologie Lokální proměnné – deklarace v těle metody (řešeno v problematice tříd – oblast viditelnosti) Zastínění nelokálních proměnných lokálními – v případě stejných jmen (na typu nezáleží) je nelokální proměnná zastíněna – existuje však možnost přístupu k zastíněné proměnné pomocí plně kvalifikovaného jména (full qualified name – jméno třídy a jména proměnné oddělené tečkou)