IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

16. diel - Cykly v Jave do tretice - do-while, break a continue

V minulej lekcii, Podmienky v Jave - Ternárny výraz, prepadávací switch, sme sa venovali ďalšej syntaxi podmienok.

V dnešnom Java tutoriále sa pozrieme na cyklus do-while, príkazy break a continue a tiež na skrátený zápis už prebraného cyklu for. Tutoriál obsahuje menej používané praktiky a slúži hlavne na to, aby vás neprekvapili v cudzom kóde. Zatiaľ nie je príliš dôležité, aby ste ich sami vedeli používať.

Cyklus do-while

Cyklus while už dobre poznáme. Menej používaný do-while sa líši iba tým, že sa vždy vykoná najmenej raz. Jeho podmienka je totiž umiestnená až za telom cyklu. Vyzerá teda takto:

do {
    // code
} while (condition);

Príklad - Kalkulačka

Použitie do-while cyklu si ukážme na našej kalkulačke z lekcie Cykly v Jave.

Varianta s while

V kalkulačke sme použili cyklus while, ktorý umožnil celý program opakovať a tak zadávať ďalšie a ďalšie príklady. Kód vyzeral takto (jedná sa o verziu s konštrukciou switch):

Scanner scanner = new Scanner(System.in, "Windows-1250");

System.out.println("Welcome to our calculator");
String goOn = "yes";
while (goOn.equals("yes")) {
    System.out.println("Enter the first number:");
    double a = Double.parseDouble(scanner.nextLine());
    System.out.println("Enter the second number:");
    double b = Double.parseDouble(scanner.nextLine());
    System.out.println("Choose one of the following operations:");
    System.out.println("1 - addition");
    System.out.println("2 - subtraction");
    System.out.println("3 - multiplication");
    System.out.println("4 - division");
    int option = Integer.parseInt(scanner.nextLine());
    double result = 0;
    switch (option) {
        case 1:
            result = a + b;
            break;
        case 2:
            result = a - b;
            break;
        case 3:
            result = a * b;
            break;
        case 4:
            result = a / b;
            break;
    }
    if ((option > 0) && (option < 5)) {
        System.out.println("Result: " + result);
    } else {
        System.out.println("Invalid option");
    }
    System.out.println("Would you like to make another calculation? [yes/no]");
    goOn = scanner.nextLine();
}
System.out.println("Thank you for using our calculator.");

Všimnite si, že sme sa pri tomto variante s while museli zamyslieť nad východiskovou hodnotou premennej goOn, ktorej sme nastavili hodnotu yes, aby bola podmienka splnená pre prvý prechod cyklom. Vymyslieť východiskovú hodnotu môže byť niekedy pomerne zložité a treba aj vyžadovať pomocnú premennú. V tomto prípade je vhodnejšie využiť cyklus do-while.

Varianta s do-while

Keď použijeme cyklus do-while, tak predvolenú hodnotu danej premennej nemusíme riešiť:

Scanner scanner = new Scanner(System.in, "Windows-1250");

System.out.println("Welcome to our calculator");
String goOn;
do {
    System.out.println("Enter the first number:");
    double a = Double.parseDouble(scanner.nextLine());
    System.out.println("Enter the second number:");
    double b = Double.parseDouble(scanner.nextLine());
    System.out.println("Choose one of the following operations:");
    System.out.println("1 - addition");
    System.out.println("2 - subtraction");
    System.out.println("3 - multiplication");
    System.out.println("4 - division");
    int option = Integer.parseInt(scanner.nextLine());
    double result = 0;
    switch (option) {
        case 1:
            result = a + b;
            break;
        case 2:
            result = a - b;
            break;
        case 3:
            result = a * b;
            break;
        case 4:
            result = a / b;
            break;
    }
    if ((option > 0) && (option < 5)) {
        System.out.println("Result: " + result);
    } else {
        System.out.println("Invalid option");
    }
    System.out.println("Would you like to make another calculation? [yes/no]");
    goOn = scanner.nextLine();
} while (goOn.equals("yes"));
System.out.println("Thank you for using our calculator.");

Príkazy break a continue

Beh cyklu je potrebné niekedy prerušiť, k tomu máme nasledujúce dve kľúčové slová.

Príkaz break

Príkaz break ukončuje aktuálny cyklus. Najčastejšie sa používa, ak pomocou cyklu nájdeme nejakú položku v kolekcii a ďalej už v jej prechádzaní nechceme pokračovať. Nebudeme tak ďalej zbytočne prehľadávať zvyšok kolekcie, keď už máme to, čo sme hľadali.

Príklad s využitím break

Predstavme si, že máme veľké a malé štítky na poháre a chceme použiť na všetky poháre buď jedny alebo druhé. Zaujíma nás teda, či sa text všetkých popisov zmestí na malé štítky. Napíšeme program, ktorý zistí, či je v poli slovo dlhšie ako 6 znakov. Pokiaľ áno, musíme použiť väčšie štítky.

Začneme cyklom prechádzať jednotlivé slová a akonáhle nájdeme slovo dlhšie ako 6 znakov, tak si uložíme jeho index. Zatiaľ stále nič nové pod slnkom. V tej istej chvíli však pomocou príkazu break cyklus ukončíme.

Ukážka použitia príkazu break:

String[] fruits = {"Apples", "Pears", "Plums", "Apricots", "Strawberries", "Cherries"};
int index = -1;

for (int i = 0; i < fruits.length; i++) {
    if (fruits[i].length() > 6) {
        index = i;
        break;
    }
}

if (index >= 0)
    System.out.println("First word longer than 6 characters: " + fruits[index]);

Výstup programu:

Konzolová aplikácia
First word longer than 6 characters: Apricots

Príkaz break sa v praxi často nahrádza príkazom return za predpokladu, že je kód v našej vlastnej metóde. Vlastné metódy sa ale naučíme deklarovať až v nadväzujúcom kurze Základy objektovo orientovaného programovania v Jave. Potom príkaz break odporúčam skôr nepoužívať, správnejší variant je kód pre prácu s kolekciou vyčleniť do samostatnej funkcie.

Príkaz continue

Príkaz continue je podobný príkazu break. Používa sa však na ukončenie iba aktuálnej iterácie (priebehu) cyklu a nie celého cyklu. Cyklus potom rovno prechádza na ďalšiu iteráciu. Použitie continue môžeme nájsť napr. pri validovaní položiek pri prechádzaní nejakej kolekcie.

Príklad s využitím continue

Predstavme si, že máme od používateľa zadané čísla a chceme ich sčítať. Používateľ tieto čísla zadá ako jeden reťazec, kde je každé číslo oddelené čiarkou. Bohužiaľ musíme počítať aj s tým, že používateľ zadá namiesto čísla nejaký nezmysel. Riešenie by mohlo vyzerať nasledovne:

String input = "10,50,ab10cd,30,9";
// parsing a string into an array
String[] items = input.split(",");
int sum = 0;
for (String item : items) {
    // verification that the variable does not contain any non-numeric characters
    if (!item.matches("\\d+"))
        continue;
    // converting a string to an integer
    int number = Integer.parseInt(item);

    sum += number;
}
System.out.println("Sum is: " + sum);

Výstup programu:

Konzolová aplikácia
Sum is: 99

Program sčíta všetky správne zadané hodnoty. Formát reťazca overujeme pomocou metódy matches(). Kým sa budeme naplno týmito regulárnymi výrazmi zaoberať, bude nám stačiť, že výraz \\d+ vráti true, pokiaľ je text len celé kladné číslo. Pri nesprávne zadaných hodnotách je aktuálna iterácia ukončená. Namiesto príkazu continue by sme samozrejme mohli použiť len príkaz if.

Skrátený zápis cyklu for

Nasledujúce konštrukcie sú tu pre ukážku, s čím všetkým je možné sa stretnúť v cudzích kódoch a nie je dobrý dôvod tieto konštrukcie používať !

Cyklus for je možné zapísať takto skrátene bez tela cyklu:

for (int i = 0; i < 10; System.out.print(i++));

Výstup:

Konzolová aplikácia
0123456789

Písať logiku priebehu behu cyklu aj logiku v cykle na jeden riadok však nie je intuitívne. Navyše sa tak môže ľahko zabudnúť na inkrementáciu premennej alebo ju inkrementovať viackrát.

Dokonca nie je nutné v hlavičke cyklu for uvádzať akýkoľvek príkaz:

for (;;) {
    // infinite cycle
}

Tento zápis je rovnaký ako:

while (true) {
    // infinite cycle
}

Oba vyššie deklarované cykly bežia donekonečna a môžete ich stretnúť v zle napísaných zdrojových kódoch spolu s príkazmi break, ktoré z nich potom za nejakých podmienok vyskakujú.

Akonáhle podmienka nie je priamo v deklarácii cyklu, je pomerne neprehľadné zistiť, kedy cyklus vôbec skončí a ľahké urobiť z takého cyklu nechtiac nekonečný. To platí obzvlášť, keď z cyklu vyskakujeme viacerými podmienkami a nepokryjeme všetky možné prípady.

Hoci dnešný tutoriál obsahoval štandardnú gramatiku Javy pre cykly, z nových konštrukcií používajte iba do-while a continue. Prechodne ešte môžete používať príkaz break, než sa dostaneme k objektom :-)

V budúcej lekcii, Matematické funkcie v Jave a knižnica Math, sa pozrieme na matematické funkcie a základný kurz úplne zakončíme.


 

Predchádzajúci článok
Podmienky v Jave - Ternárny výraz, prepadávací switch
Všetky články v sekcii
Základné konštrukcie jazyka Java
Preskočiť článok
(neodporúčame)
Matematické funkcie v Jave a knižnica Math
Článok pre vás napísal Petr Štechmüller
Avatar
Užívateľské hodnotenie:
33 hlasov
Autor se věnuje primárně programování v Javě, ale nebojí se ani webových technologií.
Aktivity