Základní stavební prvky algoritmu Podmínka. Cyklus for, while, do-while. Funkce, metody. Přetěžování. Tomáš Bayer bayertom@natur.cuni.cz Katedra aplikované geoinformatiky a kartografie, Přírodovědecká fakulta UK. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 1 / 40
Obsah přednášky 1 Stavební prvky algoritmu 2 Blok příkazů 3 Podmíněný příkaz 4 Cykly 5 Podprogramy 6 Předávání parametrů hodnotou a odkazem 7 Rekurze Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 2 / 40
Stavební prvky algoritmu 1. Stavební prvky programu Základní stavební prvky programu: příkazy. Dělení příkazů: Jednoduché příkazy Základní stavební jednotka programu, neobsahují další příkazy. Přiřazovací příkaz, prázdný příkaz, příkaz skoku, příkaz podprogramu (procedury, funkce). Strukturované příkazy Tvořeny jednoduchými či dalšími příkazy. Složený příkaz (blok), příkaz pro větvení programu (podmínka), příkaz pro opakování (cyklus). Umožňují realizovat operace nad datovými položkami. Vzájemně mohou být kombinovány. Implementovány prakticky ve všech programovacích jazycích. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 3 / 40
Blok příkazů 2. Blok příkazů Používají se v případech, kdy je nutno provádět více akcí. Představují posloupnost kroků, které jsou prováděny postupně v zadaném pořadí. Jednotlivé kroky mohu/nemusí být elementární. Označován jako složený příkaz. Konstrukce bloku v C++/Javě tvořena složenými závorkami, uvnitř libovolný počet příkazů. V jiných jazycích např. odsazením. //Oteviraci zavorka double a=10, b=15; double c=a*a+b*b; //Uzaviraci zavorka Blok může být prázdný, nemusí se v něm vyskytovat žádný příkaz prázdný příkaz. ; //Prazdny prikaz //Prazdny prikaz Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 4 / 40
Blok příkazů 3. Vnořený blok Bloky mohou být tvořeny podbloky (tzv. vnořené bloky) nebo některými výše uvedenými prvky. Definujeme -li ve vnořeném bloku proměnnou, nelze ji používat mimo vnořený blok. //Zacatek bloku, lze pouzit pouze promennou a double a=1 a++; //Zacatek vnoreneho bloku, lze pouzit promenne a,b double b=10; b=a++; //Konec vnoreneho bloku b=10; //Chyba, platnost bloku //Konec bloku a=17; //Chyba, platnost bloku Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 5 / 40
Podmíněný příkaz 4. Příkazy pro větvení programu Příkazy pro větvení bývají často označovány jako tzv. řídící struktury. Patří k nejčastěji používaným konstrukcím. Umožňují provádět větvení programu a ovlivnit, které příkazy budou provedeny v závislosti na vyhodnocení booleovských relací (podmínek). Bývají proto nazývány podmíněnými příkazy. Realizují větvení algoritmu, reagují na situace, ke kterým dochází v průběhu zpracování programu. O tom, která z větví se bude provádět, rozhoduje pravdivostní hodnota podmínky. Typy podmínek: neúplná podmínka. úplná podmínka. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 6 / 40
5. Neúplná podmínka Podmíněný příkaz Pokud výraz nabývá pravdivé hodnoty, provede se příkaz resp. blok příkazů. Neřeší, co se bude dělat v případě nesplnění podmínky. Je-li za if jednoduchý příkaz, netřeba použít bloku. if (vyraz) prikaz; //jednoduchy prikaz, Z důvodu přehlednosti do bloku dáváme i jednoduchý příkaz. Je-li za if složený příkaz, nutno použít blok. if (vyraz) prikaz1; prikaz2;... Pokud je to možné, podmínky neuvádíme v negaci, ale v kladné formě. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 7 / 40
Podmíněný příkaz 6. Ukázky neúplné podmínky Různé zápisy jednoduché podmínky: if (x==5) aa++; if (x==5) a++; if (x==5) //Doporucena varianta a++; Vnořená neúplný podmínka s jednoduchým příkazem: if (x==5) //Neprehledne, vede k chybam if (y==10) a++; if (x==5) //Doporucena varianta if (y==10) a++; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 8 / 40
7. Úplná podmínka Podmíněný příkaz Úplná podmínka vznikne rozšířením neúplné podmínky o konstrukci else, která bude provedena, pokud podmínka nebude splněna. Umožňuje konstruovat složitější podmínky. Jednoduchý příkaz v těle podmínky: if (vyraz) prikaz; else prikaz; Složený příkaz v těle podmínky: if (vyraz) prikaz1; prikaz2;... //Jednoduchy prikaz, pouzit strednik //Nelze pouzit strednik!!! else prikaz3; prikaz4;... V praxi dáváme přednost variantě s blokem aneb jsou -li pochyby, používej závorky. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 9 / 40
Podmíněný příkaz 8. Ukázky neúplné podmínky Neúplný podmínká s vnořeným blokem obsahující podmínky. if (x==5) a++; if (y==10) b++; else c++; else a--; Pak else odpovídá nejbližšímu nespárovanému if. if (x==5) a++; if (y==10) b++; else c++; else a--; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 10 / 40
9. Ternární operátor? Podmíněný příkaz Tento operátor nazýváme ternárním, má tři argumenty. Umožňuje zapsat úplnou podmínku stručnějším, avšak méně přehledným, způsobem. Vyraz? Prikaz1: Prikaz2; Je -li výraz vyhodnocen jako pravdivý, je proveden Prikaz1, v opačném případě Prikaz2. Podmínku if (a<b) a++ else b++; lze zapsat jako (a<b)? a++: b++; Závorky nepovinné, slouží pro zdůraznění podmínky. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 11 / 40
Podmíněný příkaz 10. Příkaz switch Příkaz switch představuje přepínač, který umožní větvení programu do více větví. Počet větví není omezen, může být libovolný. V každé větvi se může vyskytovat více příkazů, příkazy nemusí být uvedeny v bloku. switch(vyraz) case konstanta1: Prikaz1; break; case konstanta2: Prikaz2; break;... default PrikazX; Za příkazem switch výraz, jehož vyhodnocením musí vzniknout celočíselná hodnota. Tělo příkazu tvoří návěští se syntaxí case konstanta, konstanta celočíselná nebo znaková. Za návěštím uvedeny příkazy, které jsou konány v závislosti na hodnotě návěští. Pokud není nalezeno odpovídající návěští, je vykonán kód nacházející se za návěštím default. Návěští default nepovinné. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 12 / 40
Podmíněný příkaz 11. Příkaz switch, ukázka Hodnota návěští se v příkazu nesmí opakovat. Příkaz break umožňuje předčasné ukončení vykonávání těla příkazu switch. Není -li uveden, dojde k vykonání všech následujících větví bez ohledu na hodnoty návěští. switch(znak) case '1': a++; a*=; break; case '2': a--; a/=; break; default: a*=; break; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 13 / 40
Cykly 12. Příkazy pro opakování Příkazy pro opakování nazýváme iteračními příkazy, umožňují opakovaně provádět jeden nebo více příkazů. V praxi realizovány prostřednictvím cyklů. Patří k často používaným konstrukcím, vykytují se prakticky ve všech programovacích jazycích. Opakování je prováděno v těle cyklu na základě hodnoty relačního výrazu představujícího podmínku. Podle typu vstupní podmínky dělíme cykly do tří kategorií: Cyklus s předem neznámým počtem opakování: while. Cyklus s předem známým počtem opakování: for. Cyklus s neznámým počtem opakování, který má proběhnout alespoň jednou: do while. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 14 / 40
Cykly 13. Cyklus while Používán případech, kdy počet opakování není předem znám. Vyhodnocení podmínky před průchodem cyklu. Pokud je podmínka pravdivá, je provedeno tělo cyklu. while (vyraz) telo cyklu; while (vyraz) telo cyklu; Tělo příkazu nemusí proběhnout ani jednou, pokud je výraz napoprvé vyhodnocen jako false. Nekonečný cyklus V těle cyklu musí být modifikována proměnná ovlivňující hodnotu výrazu, jinak by vznikl nekonečný cyklus. Pozor na tautologie a kontradikce, u kterých se nemění pravdivostní hodnota relace. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 15 / 40
Cykly 14. Ukázka cyklu while int cislo=10, f=1; while (cislo>1) //Opakuj, pokud je cislo >1 f=f*cislo; cislo--; System.out.println(cislo+"!="f); //Vypocet faktorialu //Uprava hodnoty vstupni podminky Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 16 / 40
Cykly 15. Cyklus for Používán v případech kdy je známpočet opakování (tj. jsou známy údaje o výchozí a koncové hodnotě testovacího výrazu). for (inicializacni_vyraz; testovaci_vyraz; zmenovy_vyraz) telo_cyklu for (inicializacni_vyraz; testovaci_vyraz; zmenovy_vyraz) telo_cyklu Inicializační výraz: Je vykonán pouze jednou, a to ještě před vyhodnocením testovacího výrazu. Testovací výraz: Určuje, zda se má provést tělo cyklu. Tělo cyklu se provádí tak dlouho, dokud je testovací výraz vyhodnocen jako pravdivý. Změnový výraz: Vyhodnocen na konci cyklu po vykonání těla cyklu, používá se pro změnu Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 17 / 40
Cykly 16. Varianty cyklu for Inicializační, testovací i změnový výraz jsou nepovinné, nemusí být uváděny. Hodnota proměnné ve změnovém cyklu se může zvětšovat i zmenšovat. Deklarace s inicializací přímo v hlavičce cyklu for. for (int i=0;i<10;i++) System.out.println(i); Deklarace mimo cyklus, inicializace v cyklu. int i; for (i=0;i<10;i++) System.out.println(i); Deklarace a inicializace mimo cyklus, změna hodnoty testovacího výrazu v těle cyklu. int i=0; for (;i<10;i++) System.out.println(i++); //Nepouzivat Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 18 / 40
Cykly 17. Varianty cyklu for Cyklus s prázdným tělem, součástí změnového výrazu i výkonný kód. int i=0; for (;i<10;system.out.println(i++); Deklarace a inicializace mimo cyklus, testovací i změnový výraz v těle cyklu. Minimalistická variantu cyklu, ukončení cyklu příkaz break. int i=0; for (; ; ;) if (i<10) System.out.println(i++); else break; Prázdné tělo cyklu for, středník na nísledující řádce for (int i=0;i<10;i++) ; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 19 / 40
Cykly 18. Ukázka cyklu for Výpočet s využitím dekrementace: int cislo=10, f=1; for (int i=cislo;i>1;f--) //Opakuj, pokud je i>1 f=f*i; //Vypocet faktorialu System.out.println(cislo+"!="f); Výpočet s využitím inkrementace: int cislo=10, f=1; for (int i=2;i<=cislo;i++) f=f*i; //Vypocet faktorialu System.out.println(cislo+"!="f); //Opakuj, pokud je i<=cislo Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 20 / 40
Cykly 19. Cyklus do while Používá se v případě, kdy není známo kolikrát má cyklus proběhnout (ale měl by proběhnout alespoň jednou). Podmínka testována až po vykonání těla cyklu. do telo_cyklu while testovaci_vyraz do telo cyklu while testovaci vyraz Cyklus probíhá, dokud je hodnota testovacího výrazu true. Pozor na vznik nekonečného cyklu, hodnota změnového výrazu musí být uvnitř cyklu změněna. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 21 / 40
Cykly 20. Ukázka: výpočet faktoriálu int cislo=10, f=1; do f=f*cislo; cislo--; while (cislo>1) System.out.println(cislo+"!="f); //Vypocet faktorialu //Uprava hodnoty vstupni podminky Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 22 / 40
Cykly 21. Příkaz break() Umožňuje okamžitě ukončit provádění těla cyklu. První varianta: break; Umožňuje vyskočit z těla cyklu, v jehož těle je tento kód zapsán. Pokračování prvním příkazem následujícím za cyklem. U vnořeného cyklu skok o 1 úroveň výše. Druhá varianta: break navesti; Ukončení provádění cyklu označeného návěštím. U vnořeného cyklu opatřeného návěštím skok o 1 úroveň výše. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 23 / 40
Cykly 22. Ukázka příkazu break() Deklarace návěští End se dvěma vnořenými cykly for. End: //Nazev navesti for (int i=0;i<10;i++) for (int j=0;j<10;j++) if (i==j+10) System.out.println(i*j); break End; //Ukonceni cyklu v navesti End k=i+j; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 24 / 40
Cykly 23. Příkaz continue() Slouží k přeskočení zbývající části příkazů nacházejících se v těle cyklu a k přechodu na další iteraci. První varianta: Vynechání všech příkazů v těle cyklu a skok na další iteraci. continue; Druhá varianta: Přeskočení části cyklu, která je označena tímto návěštím. Tato konstrukce se v praxi příliš často nepoužívá. continue navesti; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 25 / 40
Cykly 24. Ukázka použití příkazu continue for (int i=0;i<10;i++) for (int j=0;j<10;j++) if (i==j+10) System.out.println(i*j); continue; k++; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 26 / 40
Cykly 25. Zásady pro práci s cykly Cyklus by měl mít pouze jednu řídící proměnnou. Hodnota řídící proměnné by neměla být ovlivňována v cyklu. Řídící podmínku cyklu zapisovat v kladném tvaru. Vyvarovat se vzniku nekonečných cyklů. Příkaz continue nahrazovat konstrukcí if else (přehlednost). Preference cyklů while, for před do while (přehlednost). Příkaz break v těle cyklu používat pouze na jednom místě. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 27 / 40
Podprogramy 26. Procedury, funkce, metody Představují samostatnou část programu konající nějakou specializovanou funkci. Umístěny mimo hlavní program. Mohou být opakovaně spouštěny z hlavního programu či jiného podprogramu. Tvořeny: procedurami, funkcemi, metodami (některé jazyky je nerozlišují). Výhoda použití: Zvyšují přehlednost a zlepšují čitelnost programu. Urychlují vývoj a ladění programu. Možnost opakovaného provádění výpočtů (tj. nemusíme psát znovu celý kód, pouze zavoláme příslušný podprogram). Volání podprogramů: Podprogram volány se seznamem parametrů, kterým předáváme hodnoty potřebné pro výpočet, většinou vrací nějaký výsledek. Existují podprogramy, kterým nepředáváme žádné údaje, nebo naopak žádné výsledky nevrací. Procedura vs. funkce vs.metoda: Procedura nevrací výsledek, funkce ano. Tomáš Metoda Bayer bayertom@natur.cuni.cz obdobou procedury/funkce (Katedra aplikované Základní geoinformatiky stavebnív objektově prvky algoritmu kartografie, orientovaném Přírodovědecká fakulta programování. UK.) 28 / 40
Podprogramy 27. Funkce a její deklarace Tvořena hlavičkou a tělem. Hlavička funkce: Obsahuje jméno funkce, typ návratové hodnoty, seznam formálních parametrů. Tělo funkce: Obsahuje výkonný kód funkce. Jméno funkce zpravidla psáno malými písmeny, mělo by vyjadřovat její činnost. navratovy_typ jmeno_funkce(form_typ param1, form_typ param2,...) //Telo funkce V některých jazycích vytvářen prototyp funkce: Popisuje rozhraní funkce, představuje informace pro kompilátor. Tvoří ji jméno funkce, návratový typ, seznam parametrů bez výkonného kódu. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 29 / 40
Podprogramy 28. Volání funkce Provede spuštění funkce. Volání funkce tvořeno zadáním jejího jména doplněného seznamem skutečných parametrů (má -li je funkce). jmeno_funkce(skut_param1, skut_param2,...); V některých jazycích musí deklarace funkce předcházet jejímu volání, v jiných pořadí nehraje roli. Forward deklarace: Tzv. předběžná deklarace. V těle jedné funkce volána jiná funkce, která ještě nebyla deklarována. Použití funkce ještě před jejím deklarací není běžným způsobem možné (C++, Pascal), nutno použít forward deklaraci. Využití při např. při tzv. nepřímé rekurzi. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 30 / 40
Podprogramy 29. Formální a skutečné parametry funkce Skutečné parametry: Jsou použity při volání funkce. Jejich hodnoty resp. odkazy na ně předávány formálním parametrům. Formální parametry: Lokální proměnné, deklarovány v hlavičce funkce. Vznikají v okamžiku volání funkce a zanikají při ukončení funkce. Formální parametry by měly být stejného datového typu jako parametry skutečné. Nejsou -li stejného typu, provedena implicitní konverze. Dva způsoby předávání parametrů: předávání parametrů hodnotou, předávání parametrů odkazem. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 31 / 40
30. Návratová hodnota Podprogramy Pokud funkce nevrací žádnou hodnotu, je její návratový typ void. (C, Java) Má -li funkce návratovou hodnotu, musí obsahovat klíčové slovo return s uvedením hodnoty či výrazu, který bude navracet jako výsledek. Unreachable kód: Za klíčovým slovem return již nesmí následovat žádný kód. Kód byl by nedostupný = unreachable kód. double soucet (double a, double b) return a+b; a=7; //Unreachable kod, neprovede se Funkce v Javě je schopna vrátit nejvýše jednu hodnotu. Toto omezení lze obejít předáváním parametrů odkazem nebo předat Tomáš metodě Bayer bayertom@natur.cuni.cz jako parametr (Katedra další aplikované Základní proměnné, geoinformatiky stavební prvkydo algoritmu kartografie, kterých Přírodovědecká budoufakulta výsledky UK.) 32 / 40
Předávání parametrů hodnotou a odkazem 31. Předávání parametrů hodnotou Formální parametr představuje kopii skutečného parametru. Jakákoliv změna hodnoty formálního parametru neovlivní hodnotu skutečného parametru. Volající data nelze ve funkci přepsat. Použití nejčastěji u základních datových typů. Předávání hodnot skutečných parametrů parametrům formálním je prováděno při volání metody. Hodnoty jsou předávány postupně, tj. hodnotě prvního formálního parametru je předána hodnota prvního skutečného parametru, hodnotě druhého formálního parametru hodnota druhého skutečného parametru, atd... form_param1=skut_param1; form_param2=skut_param2;... Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 33 / 40
Předávání parametrů hodnotou a odkazem 32. Ukázka předávání parametrů hodnotou Funkce Pythagoras, formální parametry a,b double Pythagoras (double a, double b) Volání funkce: return Math.sqrt(a*a+b*b); c=pythagoras(aa,bb); Přiřazení se přiřazení parametrů: a=aa; b=bb; Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 34 / 40
Předávání parametrů hodnotou a odkazem 33. Předávání parametrů odkazem Použití nejčastěji u odvozených datových typů. Při předávání nevzniká kopie skutečného parametru, ale kopie odkazu (pointeru) na skutečný parametr. Formální i skutečný parametr pak odkazují na stejnou proměnnou. V takovém případě změna hodnoty formálního parametru uvnitř funkce způsobí změnu hodnoty skutečného parametru. Možnost přepsání hodnot volajících dat. Předávání odkazem vs hodnotou: Předávání hodnotou je technicky náročnější proces, pro kopii skutečného parametru nutno alokovat pamět. Při práci s rozsáhlými datovými strukturami předávání hodnotou nevhodné, vysoké nároky na pamět a výpočetní výklon. Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 35 / 40
Předávání parametrů hodnotou a odkazem 34. Ukázka předávání odkazem, prohození slov Deklarace funkce: void prohod (String s1, String s2) String pom; pom=s1; //Prirazeni s1 do pom s1=s2; //Prirazeni s2 do s1 s2=pom; //Prirazeni pom do s2 Deklarace skutečných parametrů: String slovo1=new String(Ahoj); String slovo2=new String(Cau); prohod(slovo1, slovo2); Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 36 / 40
Předávání parametrů hodnotou a odkazem 35. Předávání odkazem, znázornění Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 37 / 40
Předávání parametrů hodnotou a odkazem 36. Přetěžování funkcí Deklarace více funkcí stejného názvu, které se mohou lišit: (1) počtem argumentů, (2) typem argumentů, (3) pořadím argumentů. Použití u funkcí provádějících stejné činnosti, ale s různými typy dat. double dist(double x1, double y1, double x2, double y2) return Math.sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)); double dist(double dx, double dy) return Math.sqrt(dx*dy+dy*dy); Pokud zavoláme přetíženou funkci, kompilátor na základě typu parametrů, jejich pořadí či počtu vybere správnou funkci. dist(1.0,0.0,6.0,0.0); //Vyber funkci se 4 parametry dist(1,0,6,0); //Vyber funkci se 2 parametry Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 38 / 40
Rekurze 37. Rekurzivní funkce Rekurze je schopnost metody, datové struktury či objektu volat sebe sama nebo volat metodu, datovou strukturu či objekt podobného typu. Problémy řešitelné rekurzí označeny jako dekomponovatelné, mohou být rozloženy na podproblémy stejného nebo podobného typu nad menší množinou dat. Nekonečná rekurze: Rekurzivní algoritmus musí obsahovat podmínku, při které dojde k jejímu ukončení (aby nepokračovala do nekonečna). V určitém místě tedy musí dojít k takovému dořešení problému, které nebude rekurzivní. Princip rekurze: Při každém novém volání dochází k vytvoření nových lokálních proměnných (tato vlastnost je současně nevýhodou rekurze). Poté jsou zpětně dopočítávány hodnoty z předchozích volání metod. Tomáš Alokace Bayer bayertom@natur.cuni.cz na zásobníku. (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 39 / 40
Rekurze 38. Ukázka rekurze Výpočet faktoriálu rekurzí: int fakt(int n) if (n>1) return n*fakt(n-1); else return 1; Volání funkce: int cislo=10; int faktorial=fakt(cislo); Tomáš Bayer bayertom@natur.cuni.cz (Katedra aplikované Základní geoinformatiky stavební prvky algoritmu kartografie, Přírodovědecká fakulta UK.) 40 / 40