Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET
Využij akce až 80% zdarma při nákupu e-learningu. Více informací .
C# week

Lekce 5 - Podmínky (větvení) v Javě

V předešlém cvičení, Řešené úlohy k 4. lekci Javy, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

Abychom si něco naprogramovali, potřebujeme nějak reagovat na různé situace. Může to být například hodnota zadaná uživatelem, podle které budeme chtít měnit další běh programu. Říkáme, že se program větví a k větvení používáme podmínky, těm se budeme věnovat celý dnešní díl. Vytvoříme program na výpočet odmocniny a vylepšíme naši kalkulačku.

Podmínky

V Javě se podmínky píší úplně stejně, jako ve všech CLike jazycích, pro začátečníky samozřejmě vysvětlím. Pokročilejší se asi budou chvilku nudit :)

Podmínky zapisujeme pomocí klíčového slova if, za kterým následuje logický výraz. Pokud je výraz pravdivý, provede se následující příkaz. Pokud ne, následující příkaz se přeskočí a pokračuje se až pod ním. Vyzkoušejme si to:

if (15 > 5)
    System.out.println("Pravda");
System.out.println("Program zde pokračuje dál");

Výstup programu:

Konzolová aplikace
Pravda
Program zde pokračuje dál

Pokud podmínka platí (což zde ano), provede se příkaz vypisující do konzole text pravda. V obou případech program pokračuje dál. Součástí výrazu samozřejmě může být i proměnná:

System.out.println("Zadej nějaké číslo");
int a = Integer.parseInt(sc.nextLine());
if (a > 5)
    System.out.println("Zadal jsi číslo větší než 5!");
System.out.println("Děkuji za zadání");

Ukažme si nyní relační operátory, které můžeme ve výrazech používat:

Operátor C-like zápis
Rovnost ==
Je ostře větší >
Je ostře menší <
Je větší nebo rovno >=
Je menší nebo rovno <=
Nerovnost !=
Obecná negace !
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Rovnost zapisujeme dvěma == proto, aby se to nepletlo s běžným přiřazením do proměnné, které se dělá jen jedním =. Pokud chceme nějaký výraz znegovat, napíšeme ho do závorky a před něj vykřičník. Když budeme chtít vykonat více než jen jeden příkaz, musíme příkazy vložit do bloku ze složených závorek:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadej nějaké číslo, ze kterého spočítám odmocninu:");
int a = Integer.parseInt(sc.nextLine());
if (a >= 0)
{
    System.out.println("Zadal jsi číslo větší nebo rovno 0, to znamená, že ho mohu odmocnit!");
    double o = Math.sqrt(a);
    System.out.println("Odmocnina z čísla " + a + " je " + o);
}
System.out.println("Děkuji za zadání");

Konzolová aplikace
Zadej nějaké číslo, ze kterého spočítám odmocninu:
144
Zadal jsi číslo větší nebo rovno 0, to znamená, že ho mohu odmocnit!
Odmocnina z čísla 144 je 12.0
Děkuji za zadání

Často můžete vidět použití bloku i v případě, že je pod podmínkou jen jeden příkaz, mnohdy je to totiž přehlednější. Nezapomeňte si naimportovat java.util.Scanner, aby program znal třídu Scanner.

Program načte od uživatele číslo a pokud je větší než 0, vypočítá z něj druhou odmocninu. Mimo jiné jsme použili třídu Math, která na sobě obsahuje řadu užitečných matematických metod, někdy si ji blíže představíme. Metoda sqrt() vrací hodnotu jako double. Bylo by hezké, kdyby nám program vyhuboval v případě, že zadáme záporné číslo. S dosavadními znalostmi bychom napsali něco jako:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadej nějaké číslo, ze kterého spočítám odmocninu:");
int a = Integer.parseInt(sc.nextLine());
if (a >= 0)
{
    System.out.println("Zadal jsi číslo větší nebo rovno 0, to znamená, že ho mohu odmocnit!");
    double o = Math.sqrt(a);
    System.out.println("Odmocnina z čísla " + a + " je " + o);
}
if (a < 0)
{
    System.out.println("Odmocnina ze záporného čísla neexistuje v oboru reálných čísel!");
}
System.out.println("Děkuji za zadání");

Kód však můžeme výrazně zjednodušit pomocí klíčového slova else, které vykoná následující příkaz nebo blok příkazů v případě, že se podmínka neprovede:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadej nějaké číslo, ze kterého spočítám odmocninu:");
int a = Integer.parseInt(sc.nextLine());
if (a >= 0)
{
    System.out.println("Zadal jsi číslo větší nebo rovno 0, to znamená, že ho mohu odmocnit!");
    double o = Math.sqrt(a);
    System.out.println("Odmocnina z čísla " + a + " je " + o);
}
else
{
    System.out.println("Odmocnina ze záporného čísla neexistuje v oboru reálných čísel!");
}
System.out.println("Děkuji za zadání");

Kód je mnohem přehlednější a nemusíme vymýšlet opačnou podmínku, což by v případě složené podmínky mohlo být někdy i velmi obtížné. V případě více příkazů by byl za else opět blok { }.

Klíčové slovo else se také využívá v případě, kdy potřebujeme v příkazu manipulovat s proměnnou z podmínky a nemůžeme se na ni tedy ptát potom znovu. Program si sám pamatuje, že se podmínka nesplnila a přejde do sekce else. Ukažme si to na příkladu: Mějme číslo a, kde bude hodnota 0 nebo 1 a po nás se bude chtít, abychom hodnotu prohodili (pokud tam je 0, dáme tam 1, pokud 1, dáme tam 0). Naivně bychom mohli kód napsat takto:

int a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
{
    a = 1;
}
if (a == 1) // pokud je a 1, dáme do něj nulu
{
    a = 0;
}

System.out.println(a);

Nefunguje to, že? Pojďme si projet, co bude program dělat. Na začátku máme v a nulu, první podmínka se jistě splní a dosadí do a jedničku. No ale rázem se splní i ta druhá. Co s tím? Když podmínky otočíme, budeme mít ten samý problém s jedničkou. Jak z toho ven? Ano, použijeme else.

int a = 0; // do a si přiřadíme na začátku 0

if (a == 0) // pokud je a 0, dáme do něj jedničku
{
    a = 1;
}
else // pokud je a 1, dáme do něj nulu
{
    a = 0;
}

System.out.println(a);

Podmínky je možné skládat, a to pomocí dvou základních logických operátorů:

Operátor C-like Zápis
A zároveň &&
Nebo ||

Uveďme si příklad:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadejte číslo v rozmezí 10-20:");
int a = Integer.parseInt(sc.nextLine());
if ((a >= 10) && (a <= 20))
{
    System.out.println("Zadal jsi správně");
}
else
{
    System.out.println("Zadal jsi špatně");
}

S tím si zatím vystačíme, operátory se pomocí závorek samozřejmě dají kombinovat.

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Zadejte číslo v rozmezí 10-20 nebo 30-40:");
int a = Integer.parseInt(sc.nextLine());
if (((a >= 10) && (a <= 20)) || ((a >= 30) && (a <= 40)))
{
    System.out.println("Zadal jsi správně");
}
else
{
    System.out.println("Zadal jsi špatně");
}

Switch

Konstrukce switch je převzatá z jazyka C (jako většina gramatiky Javy). Umožňuje nám zjednodušit (relativně) zápis více podmínek pod sebou. Vzpomeňme si na naši kalkulačku v prvních lekcích, která načetla 2 čísla a vypočítala všechny 4 operace. Nyní si ale budeme chtít zvolit, kterou operaci chceme. Bez switch bychom napsali kód podobný tomuto:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte první číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.println("Zadejte druhé číslo:");
float b = Float.parseFloat(sc.nextLine());
System.out.println("Zvolte si operaci:");
System.out.println("1 - sčítání");
System.out.println("2 - odčítání");
System.out.println("3 - násobení");
System.out.println("4 - dělení");
int volba = Integer.parseInt(sc.nextLine());
float vysledek = 0;
if (volba == 1)
{
        vysledek = a + b;
}
else if (volba == 2)
{
        vysledek = a - b;
}
else if (volba == 3)
{
        vysledek = a * b;
}
else if (volba == 4)
{
        vysledek = a / b;
}
if ((volba > 0) && (volba < 5))
{
        System.out.println("Výsledek: " + vysledek);
}
else
{
        System.out.println("Neplatná volba");
}
System.out.println();
System.out.println("Děkuji za použití kalkulačky.");

Konzolová aplikace
Vítejte v kalkulačce
Zadejte první číslo:
3.14
Zadejte druhé číslo:
2.72
Zvolte si operaci:
1 - sčítání
2 - odčítání
3 - násobení
4 - dělení
2
Výsledek: 0.42
Děkuji za použití kalkulačky.

Všimněte si, že jsme proměnnou výsledek deklarovali na začátku, jen tak do ni můžeme potom přiřazovat. Kdybychom ji deklarovali u každého přiřazení, Java by kód nezkompilovala a vyhodila chybu redeklarace proměnné. Důležité je také přiřadit výsledku nějakou výchozí hodnotu, zde nula, jinak by nám Java vyhubovala, že se snažíme vypsat proměnnou, která nebyla jednoznačně inicializována. Proměnná může být deklarována (založena v paměti) vždy jen jednou. Další vychytávka je kontrola správnosti volby. Program by v tomto případě fungoval stejně i bez těch else, ale nač se dále ptát, když již máme výsledek.

Nyní si zkusíme napsat ten samý kód pomocí switch:

Scanner sc = new Scanner(System.in, "Windows-1250");
System.out.println("Vítejte v kalkulačce");
System.out.println("Zadejte první číslo:");
float a = Float.parseFloat(sc.nextLine());
System.out.print("Zadejte druhé číslo:");
float b = Float.parseFloat(sc.nextLine());
System.out.println("Zvolte si operaci:");
System.out.println("1 - sčítání");
System.out.println("2 - odčítání");
System.out.println("3 - násobení");
System.out.println("4 - dělení");
int volba = Integer.parseInt(sc.nextLine());
float vysledek = 0;
switch (volba)
{
    case 1:
        vysledek = a + b;
    break;
    case 2:
        vysledek = a - b;
    break;
    case 3:
        vysledek = a * b;
    break;
    case 4:
        vysledek = a / b;
    break;
}
if ((volba > 0) && (volba < 5))
{
    System.out.println("Výsledek: " + vysledek);
}
else
{
    System.out.println("Neplatná volba");
}
System.out.println();
System.out.println("Děkuji za použití kalkulačky.");

Vidíme, že kód je trochu přehlednější. Pokud bychom potřebovali v nějaké větvi switch spustit více příkazů, překvapivě je nebudeme psát do bloku, ale rovnou pod sebe. Blok {} nám zde nahrazuje příkaz break, který způsobí vyskočení z celého switch. Switch může místo case x: obsahovat ještě možnost default:, která se vykoná v případě, že nebude platit žádný case. Je jen na vás, jestli budete switch používat, obecně se vyplatí jen při větším množství příkazů a vždy jde nahradit sekvencí if a else. Nezapomínejte na breaky. Konstrukce switch je v Javě podporován i pro hodnoty Stringové proměnné, a to od Javy 7.

V následujícím cvičení, Řešené úlohy k 5. lekci Javy, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 926x (13.03 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Řešené úlohy k 4. lekci Javy
Všechny články v sekci
Základní konstrukce jazyka Java
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
72 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (19)

 

 

Komentáře
Zobrazit starší komentáře (117)

Avatar
Michal Š.
Člen
Avatar
Michal Š.:15.5.2020 18:38

Bingo, je to jasné
Už to vidím, musel jsem ale spustit kód a pak to odřádkování tam je
V tabulce pod totiž ten prázdný řádek chybí
To mě zmátlo
Díky

 
Odpovědět
15.5.2020 18:38
Avatar
Filip Vraník:25.9.2020 11:39

Ahoj,
v příkladu kalkulačky jsem zkusil místo:
if ((volba > 0) && (volba < 5))
zadat:
if ((volba = 1) || (volba = 2) || (volba = 3) || (volba = 4))
abych eliminoval errory u zádání desetinných čísel v rozmezí (0 < volba < 5) čísel, jako jsou například: 2.2, 3,5 v případě volby
ale Java mi to nebere, poradí prosím někdo proč?
PS: jsem začátečník, a chtěl jsem použít zmiňovaný příkaz "nebo", tedy "||", i když nebyl v příkladu, tak pardon pokud se ptám na nějakou bazální blbost :D
pak jsem to zkusil i takhle hulvátsky:
if (volba = 1 || 2 || 3 || 4) ale to asi uz vubec ne ze? :D

 
Odpovědět
25.9.2020 11:39
Avatar
Václav Dachs:19. ledna 15:15

Ahoj všem.

Nevím proč, ale kalkulačka mi nefunguje správně ani v mém kódu v NetBeans IDE 12.2 ani v ukázce tady na stránkách.

Moje kalkulačka i kalkulačka v ukázce tady na stránkách při zadání hodnot a = 3.3, b = 2.2 a jako operaci zvolím rozdíl vrátí mi to c = 1.099999 - což není správně (to samé vrací i kalkulačka v C# jak u mne ve VS 2019 tak v ukázce na stránkách tutoriálu C#).

Může mi prosím někdo vysvětlit proč? Děkuji

Odpovědět
19. ledna 15:15
S úsměvem jde všechno lépe :-)
Avatar
Odpovídá na Alesh
Václav Dachs:19. ledna 19:13

Aha, tak to jsem se vlastně učil před víc jak 20 lety a za těch víc jak 20 let, co se živím převážně hudbou, jsem to úspěšně zapomněl :-D Díky za refresh :-)

Odpovědět
19. ledna 19:13
S úsměvem jde všechno lépe :-)
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jan Křížek:21. března 12:42

Ahoj,

příklady na podmínky jsou hezké, a tak, jen ten poslední ukázkový příklad na odmocninu se mi vážně nelíbí. Je špatně prezentovaný.

  1. Když uživatel zadá 0, pak mu to vyplivne větu, že "Odmocnina ze záporného čísla neexistuje!", což je pěkná blbost. 0 není ani záporné ani kladné číslo a navíc odmocnina z nuly je rovna nule.
  2. Věta "Odmocnina ze záporného čísla neexistuje!" je nepravdivá. Odmocnina záporného čísla existuje, jen taková hodnota leží až v množině komplexních čísel. Tedy, navrhuji, aby se tato věta upravila na "Odmocnina ze záporného čísla neexistuje na množině reálných čísel!"
 
Odpovědět
21. března 12:42
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Jan Křížek
Alesh:21. března 13:21

Máš pravdu matematicky je to špatně, programátorsky to je ale v pořádku. Opravit by to asi chtělo, na druhou stranu to alespoň některé jedince vybičuje k zamyšlení, což je dobře. ;-)

 
Odpovědět
21. března 13:21
Avatar
Vojtěch Perník
Redaktor
Avatar
Odpovídá na Filip Vraník
Vojtěch Perník:5. května 19:00

Rovnost se totiž v logických výrazech zapisuje pomocí dvou rovnítek (==), ne jen =.

 
Odpovědět
5. května 19:00
Avatar
Vojtěch Perník
Redaktor
Avatar
Odpovídá na Jan Křížek
Vojtěch Perník:5. května 19:07

Ne, kód je zde dobře. Používá se tam totiž a >= 0. To znamená "a je větší nebo rovno nule". V tomto případě tedy může na blok else dojít jen v případě, kdy je a opravdu záporné.

 
Odpovědět
5. května 19:07
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Vojtěch Perník
Alesh:5. května 19:59

V době, kdy on psal ten komentář, tak to skutečně bylo špatně, na základě jeho komentáře jsem opravil tu podmínku a zeditoval ten text v případě záporných čísel.

 
Odpovědět
5. května 19:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 127. Zobrazit vše