# Řídicí struktury - Řídicí struktury - Programové konstrukce, které se skládají z dílčích příkazů - Určují způsob provedení těchto příkazů - ovlivňují směr provádění programu => bez nich by program běžel postupně od prvního do posledního příkazu - Tři základní řídící struktury - Posloupnost - Příkazy jsou v posloupnosti a vždy se provedou v pořadí, v jakém jsou zapsány („řádku po řádce“) - Složený příkaz (blok) - Několik příkazů uzavřených do složených závorek „{“ a „}“ - Např. tělo metody ```main()``` (a jakékoliv jiné metody) je blok - Často se využívá s větvením a cykly - Příkazy v bloku důsledně odsazujeme alespoň dvěma mezerami nebo tabulátorem - V Javě téměř ve všech případech využití bloku otevírací závorce „{“předchází předchozí konstrukce (např. hlavička metody, větvení, cyklus) napsaná na STEJNÉ řádce jako tato závorka - Větvení - V závislosti na splnění podmínky se provede jen určitá část programu - Příkaz ```if``` pro jednoduché větvení (neúplný podmíněný příkaz) a příkaz ```if - else``` pro dvojité větvení (úplný podmíněný příkaz) - Cyklus - V závislosti na splnění podmínky se část programu opakuje - Příkaz ```for``` - pro cyklus s předem známými mezemi (s předem známým počtem opakování) - Příkaz ```while``` - pro cyklus a předem neznámými mezemi - Příkaz ```do - while``` pro cyklus s předem neznámými mezemi ### Větvení - Základem je příkaz ```if - else```, ostatní příkazy pro větvení urychlují nebo zpřehledňují zápis - Bez větvení nelze vytvářet ani jednoduché užitečné programy s výjimkou jednorázových výpočtů #### Podmíněný příkaz (příkaz if – else) - V závislosti na splnění podmínky se provede buď jedna, nebo druhá část programu - Tyto části se často nazývají „větve“ - Podmínka - Logický výraz, jehož výsledkem je (booleovská hodnota) buď ```true``` (podmínka je pravdivá, je splněná) nebo ```false``` (podmínka není pravdivá, není splněná) - Uvádí se bezprostředně za klíčové slovo ```if``` - Je vždy uzavřena do kulatých závorek „(“ a „)“ - Může obsahovat relační operátory (operátory pro porovnání) - ```„<“, „>“, „<=“, „>=“, „!=“, „==“``` - Může se skládat z více logických výrazů, které jsou spojeny logickými operátory ```„&&“``` („a zároveň“, konjunkce) nebo ```„||“``` („nebo“, disjunkce) - Bez ohledu na komplikovanost a délku podmínky, jejím výsledkem je VŽDY hodnota ```true``` nebo ```false``` - Úplný podmíněný příkaz (```if - else```) - Pokud je podmínka splněna (její hodnota je ```true```), provede se první část kódu (uvedená bezprostředně za podmínkou) – „větev ```if```“ - Pokud podmínka není splněna (její hodnota je false), provede se druhá část kódu – „větev ```else```“ - Neúplný podmíněný příkaz (```if```) - Pokud je podmínka splněna (její hodnota je ```true```), provede se část kódu uvedená bezprostředně za podmínkou - Pokud podmínka není splněna (její hodnota je ```false```), neprovede se nic - Vnořený příkaz ```if``` - Příkaz ```if``` může v sobě obsahovat další příkaz ```if```, ten zase další atd. - Úroveň zanoření není omezena - Příkaz ```else if``` - Kromě vnořování je možné využít příkaz ```else if```, kdy po klíčovém slově else bezprostředně následuje další příkaz ```if``` - Běžně se využívá - Možnost reagovat na více podmínek - Možnost závěrečné ```else``` větve, která se provede, pokud žádná podmínka nebyla splněna - Vždy se provede maximálně jedna větev (nebo žádná, pokud chybí závěrečné ```else``` a žádná podmínka není splněná) #### Přepínač (příkaz switch) - Umožňuje několikanásobné větvení programu na základě hodnoty jedné proměnné - Proměnná může být typ celočíselný datový typ (```int, byte, short, long```) nebo ```char, String``` a výčtový datový typ - Lze plně nahradit příkazy ```if – else``` - Není nutné ho používat příliš často, je možné nepoužívat ho vůbec - Je ale minimálně dobré vědět, jak funguje, když ho použije někdo jiný - Každá větev (začínající klíčovým slovem ```case```) může být ukončena příkazem ```break;``` ```java switch (proměnná) { case konstanta1: příkaz11; příkaz12; … break; case konstanta2: příkaz21; příkaz22; … break; default: příkazN1; příkazN2; … break; } ``` - Sémantika příkazu ```switch``` - Nalezne se konstanta odpovídající hodnotě proměnné (nebo vypočtené hodnotě výrazu, pokud je místo proměnné výraz) - Provedou se všechny příkazy v této větvi - Pokud je větev ukončena příkazem ```break;```, skočí se na konec přepínače, pokračuje se dalším příkazem za přepínačem - Pokud větev příkazem ```break;``` ukončena není, pokračuje se s příkazy další větve - Zdroj častých chyb vedoucí k neočekávanému chování programu - Umožňuje provést stejnou akci pro více hodnot - Pokud není nalezena konstanta odpovídající hodnotě proměnné, provedou se příkazy větve ```default``` - Příkaz ```break;``` za větví ```default``` je zbytečný, protože po dokončení posledního příkazu této větve příkaz ```switch``` končí v každém případě, ale většinou se uvádí - POZOR! – Nikdy nekombinujte použití příkazu ```if - else``` a příkazu ```switch```, značně to znepřehledňuje kód #### Ternární operátor - Umožňuje přiřazení v závislosti na podmínce - Syntaxe ```(podmínka) ? výrazTrue : výrazFalse;``` - Podmínka je libovolný logický výraz s výsledkem ```true``` nebo ```false``` (stejně jako v příkazu if) - Výrazy jsou libovolné výrazy, jejichž výsledek je stejného datového typu - Pro přehlednost dávat mezery okolo „?“ a „:“ - Sémantika - Pokud je podmínka splněná (```true```), vrátí ```výrazTrue``` - Pokud podmínka není splněná (```false```), vrátí ```výrazFalse``` - Ternární operátor vždy vrací hodnotu a nelze použít jako příkaz - Hodnota musí být přiřazena do proměnné nebo jinak použita, např. může být součástí složitějšího výrazu