Větvení
Z MiS
Počítače von Neumannova typu provádí instrukce v takovém pořadí, v jakém jsou v operační paměti uloženy. Občas ale potřebujeme vykonat příkaz pouze tehdy, kdy je splněna nějaká podmínka. K tomu slouží podmíněný příkaz.
Příkazy větvení:
- podmíněný příkaz (
if-elseif-else) - příkaz
switch
Podmíněný příkaz je jednou z řídících struktur programu.
Jsme si vědomi, že následující text je zjednodušený pro úroveň začátečníků v programování!
Obsah |
Podmíněný příkaz
Syntaxe
if (PODMÍNKA) PŘÍKAZ [ else PŘÍKAZ ];
- PODMÍNKA:
- výraz, který vrací pravdivostní hodnotu (pravda nebo nepravda)
- více o zápisu podmínek je v kapitole Podmíněný výraz.
- PŘÍKAZ:
- obvykle se jedná o 'složený příkaz', tedy o posloupnost příkazů, ohraničenou složenými závorkami.
- větev
else:- tento příkaz se provede, pokud podmínka není splněná.
- tato část příkazu ale nemusí být vůbec uvedena.
Příklady PHP
if ($vek < 15) {
echo "POZOR! Přístupné až od 15 let!";
}
if ($hotovost > $cena) {
$hotovost -= $cena;
} else {
die("Nákup nelze provést! Nemáme dostatek peněz.");
}
Příklady Java
if (vek < 15) {
System.out.println("POZOR! Přístupné až od 15 let!");
}
if (zakaznik.getHotovost() > cena) {
zakaznik.zaplat(cena);
} else {
System.err.println("Nákup nelze provést! Nemáme dostatek peněz.");
}
Úkoly
- Pro zvídavé — Malý bug pro programátora, ale fatální chyba pro program! ;)
- Přečtěte si následující kód. Zkuste uhodnout, co bude vypisovat.
- Vyzkoušejte prakticky. Uhodli jste účel? Funguje správně?
- Najděte a opravte chybu! ;)
public class Pocitadlo {
int citac = 1;
public int dalsi() {
this.citac++;
if (this.citac > 5);
{
this.citac = 1;
}
return this.citac;
}
public static void main(String[] args) {
Pocitadlo p = new Pocitadlo();
while (true) {
System.out.println(p.dalsi());
}
}
}
Vícenásobné větvení
- Můžeme opakovaně použít konstrukci
else if:
if (PODMÍNKA) PŘÍKAZ else if (PODMÍNKA) PŘÍKAZ ... else if (PODMÍNKA) PŘÍKAZ else PŘÍKAZ
PŘÍKAZ:
-
{ posloupnost příkazů } -
jeden příkaz ;
PODMÍNKA
- Zápis podmínek viz Podmíněný výraz.
Příklady Java
- Převod číselných hodnot na odpovídající objekty.
- Máme zadáno číslo dne v týdnu jako číslo.
- Potřebujeme vyrobit odpovídající instanci potomka třídy
DenTydne. Máme připraveny potomkyNedele,Pondeli,...,Sobota.
int denTydne; ... DenTydne vysledek = null; /* Třída DenTydne je společným předkem tříd * Pondeli, Utery, Streda, Ctvrtek, Patek a Sobota. */ if (denTydne == 0) vysledek = new Nedele(); else if (denTydne == 1) vysledek = new Pondeli(); else if (denTydne == 2) vysledek = new Utery(); else if (denTydne == 3) vysledek = new Streda(); else if (denTydne == 4) vysledek = new Ctvrtek(); else if (denTydne == 5) vysledek = new Patek(); else vysledek = new Sobota();
- Spočítejte prvky v kategoriích
- Máme kontejner instancí třídy
Osoba. -
Osobamá metodugetVyska(), která vrací výšku osoby v cm. - Spočítejte, kolik osob v kontejneru má výšku pod 170 cm, kolik 170-190 cm a kolik přes 190 cm.
ArrayList<Osoba> osoby = new ArrayList<>();
...
int velci = 0, normalni = 0, mali = 0;
for (Osoba osoba : osoby) {
int vyska = osoba.getVyska();
if (vyska < 170) {
mali++;
} else if (vyska <= 190) {
normalni++;
} else {
velci++;
}
}
Úkol
- Dostanete pořadové číslo měsíce.
- Vypište na obrazovku text:
Dnes je jaro|léto|podzim|zima. - Předpokládejte, že zimní měsíce jsou leden, únor a březen, jarní měsíce duben, květen a červen atd.
Příkaz switch
Syntaxe
switch (proměnná) {
case hodnota1: příkaz; break;
case hodnota2: příkaz; break;
default: příkaz
}
Příklad Java
int denTydne;
...
DenTydne vysledek = null;
/* Třída DenTydne je společným předkem tříd
* Pondeli, Utery, Streda, Ctvrtek, Patek a Sobota.
*/
switch (denTydne) {
case 0: vysledek = new Nedele(); break;
case 1: vysledek = new Pondeli(); break;
case 2: vysledek = new Utery(); break;
...
case 5: vysledek = new Patek(); break;
default: vysledek = new Sobota();
}
Úkol
Máte číslo stav faktury. Faktura může být: 1... vystavená (poslali jsme, zatím nepřišla platba) 2... zaplacená (platba přišla, odeslali jsme zboží) 3... vyřešená (zákazník převzal zboží) Vypište podle stavu faktury text: "Faktura je vystavená|zaplacená|vyřešená!"
Zdroje:
- The Java Tutorials [online]. 1995, 2011 [cit. 2011-06-07]. Control Flow Statements.
- ARCANIS. Výuka PHP a MySQL [online]. Třeboň : 2008 [cit. 2011-06-07]. Řídící struktury.
- Dostupné z WWW: <http://arcanis.argon.cz/docs/seminarka1/index.php?incl=lekce_5>.
- ARCANIS. Výuka PHP a MySQL [online]. Třeboň : 2008 [cit. 2011-06-07]. Cykly.
- Dostupné z WWW: <http://arcanis.argon.cz/docs/seminarka1/index.php?incl=lekce_6>.