# Ří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

