Větvení
Z MiS
(Rozdíly mezi verzemi)
(Osamostatněno ze stránky Řídící struktury programu.) |
m (Přidán úkol pro zvídavé...) |
||
(Nejsou zobrazeny 3 mezilehlé verze od 1 uživatele.) | |||
Řádka 1: | Řádka 1: | ||
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:PHP]] | [[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:PHP]] | ||
− | |||
− | |||
− | |||
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''. | 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''. | ||
Řádka 20: | Řádka 17: | ||
− | === Syntaxe | + | === Syntaxe === |
if (PODMÍNKA) PŘÍKAZ [ else PŘÍKAZ ]; | if (PODMÍNKA) PŘÍKAZ [ else PŘÍKAZ ]; | ||
Řádka 63: | Řádka 60: | ||
} | } | ||
+ | |||
+ | === Ú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()); | ||
+ | } | ||
+ | } | ||
+ | } | ||
Řádka 82: | Řádka 104: | ||
− | === | + | === 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 <code>DenTydne</code>. Máme připraveny potomky <code>Nedele</code>, <code>Pondeli</code>,..., <code>Sobota</code>. | ||
+ | |||
int denTydne; | int denTydne; | ||
... | ... | ||
Řádka 96: | Řádka 123: | ||
else if (denTydne == 5) vysledek = new Patek(); | else if (denTydne == 5) vysledek = new Patek(); | ||
else vysledek = new Sobota(); | else vysledek = new Sobota(); | ||
+ | |||
+ | ; Spočítejte prvky v kategoriích | ||
+ | * Máme kontejner instancí třídy <code>Osoba</code>. | ||
+ | * <code>Osoba</code> má metodu <code>getVyska()</code>, 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 === | === Úkol === | ||
Řádka 155: | Řádka 201: | ||
* [[Řídící struktury programu]] | * [[Řídící struktury programu]] | ||
* [[Cykly]] | * [[Cykly]] | ||
− |
Aktuální verze z 5. 1. 2017, 11:21
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
. -
Osoba
má 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>.