Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 7 - Cykly v C++ (while, do while)

V minulé lekci, Cykly v C++ (for), jsme začali s cykly.

V dnešním C++ tutoriálu v nich budeme pokračovat, ukážeme si while a do while.

while cyklus

Cyklus while funguje jinak než cyklus for, jednoduše opakuje příkazy v bloku tak dlouho, dokud platí podmínka. Syntaxe cyklu je následující:

while (podminka)
{
    // příkazy
}

Pokud vás napadá, že lze přes while cyklus udělat i for cyklus, máte pravdu :) for je vlastně speciální případ while. Cyklus while se ale používá na trochu jiné věci, často máme v jeho podmínce např. funkci vracející logickou hodnotu true/false. Původní příklad z for cyklu bychom udělali pomocí while následovně:

int i = 1;
while (i <= 10)
{
    cout << i << ' ';
    i++;
}
cin.get();

To ale není ideální použití while cyklu.

Vezmeme si naši kalkulačku z minulých lekcí a opět ji trochu vylepšíme, konkrétně o možnost zadat více příkladů. Program tedy hned neskončí, ale zeptá se uživatele, zda si přeje spočítat další příklad. Připomeňme si původní verzi kódu (je to ta verze se switch, ale klidně použijte i tu bez něj, záleží na vás):

cout << "Vitejte v kalkulacce" << endl;
cout << "Zadejte prvni cislo:" << endl;
float a;
cin >> a;
cout << "Zadejte druhe cislo:" << endl;
float b;
cin >> b;
cout << "Zvolte si operaci:" << endl;
cout << "1 - scitani" << endl;
cout << "2 - odcitani" << endl;
cout << "3 - nasobeni" << endl;
cout << "4 - deleni" << endl;
int volba;
cin >> volba;
float vysledek = 0.0f;
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))
    cout << "Vysledek:" << vysledek << endl;
else
    cout << "Neplatna volba" << endl;
cout << "Dekuji za pouziti kalkulacky, aplikaci ukoncite libovolnou klavesou." << endl;
cin.get(); cin.get();

Nyní vložíme téměř celý kód do while cyklu. Naší podmínkou bude, že uživatel zadá "ano", budeme tedy kontrolovat obsah proměnné pokracovat. Zpočátku bude tato proměnná nastavena na "ano", aby se program vůbec spustil, poté do ní necháme načíst volbu uživatele:

cout << "Vitejte v kalkulacce" << endl;
string pokracovat = "ano";
while (pokracovat == "ano")
{
    cout << "Zadejte prvni cislo:" << endl;
    float a;
    cin >> a;
    cout << "Zadejte druhe cislo:" << endl;
    float b;
    cin >> b;
    cout << "Zvolte si operaci:" << endl;
    cout << "1 - scitani" << endl;
    cout << "2 - odcitani" << endl;
    cout << "3 - nasobeni" << endl;
    cout << "4 - deleni" << endl;
    int volba;
    cin >> volba;
    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))
        cout << "Vysledek: " << vysledek << endl;
    else
        cout << "Neplatna volba" << endl;
    cout << "Prejete si zadat dalsi priklad? [ano/ne]" << endl;
    cin >> pokracovat;
}
cout << "Dekuji za pouziti kalkulacky, aplikaci ukoncite libovolnou klavesou." << endl;
cin.get(); cin.get();

Výsledek:

Konzolová aplikace
Vitejte v kalkulacce
Zadejte prvni cislo:
128
Zadejte druhe cislo:
16
Zvolte si operaci:
1 - scitani
2 - odcitani
3 - nasobeni
4 - deleni
4
Vysledek: 8
Prejete si zadat dalsi priklad? [ano/ne]
ano
Zadejte prvni cislo:
12
Zadejte druhe cislo:

Naši aplikaci lze nyní používat vícekrát a je již téměř hotová.

do-while cyklus

Cyklus do-while je velmi podobný jako while, ale je tu jeden rozdíl - příkaz (nebo blok příkazů) se provede vždy alespoň jednou, podmínka se kontroluje až poté.

Syntaxe cyklu je následující:

do
{
    // příkazy
} while ( /* podmínka */ );

Všimněte si středníku za kulatými závorkami, u do-while musí být.

Cyklu do-while lze využít např. u čtení vstupu z konzole. Představte si, že chceme, aby uživatel zadal číslo větší než 2. Ale co když zadá jiné? Není úplně ideální ukončit program po prvním špatném zadání. Lepší bude ptát se ho tak dlouho, až odpoví správně. Pomocí while by to vypadalo asi takto:

int a;
cin >> a;
while (a <= 2)
{
    cin >> a;
}

A teď s do-while:

int a;
do
{
    cin >> a;
} while (a <= 2);

Pozn. Jak ošetřit i případy, kdy uživatel vůbec nezadá číslo, si řekneme dále v kurzu.

Zde to ještě není takový rozdíl, ale pokud bychom měli místo cin >> a; nějaký delší kód, u while bychom ho museli celý napsat dvakrát.

Možná vás napadlo, že i s while by šla vymyslet kratší verze:

int a = 1;
while (a <= 2)
{
    cin >> a;
}

Ne vždy ale bude podmínka tak jednoduchá, aby bylo možné podobné řešení.

break a continue

Poslední, co si k cyklům ukážeme, budou příkazy break a continue.

Příkaz break slouží k okamžitému ukončení aktuálního cyklu.

int i;
for (i = 0; i < 20; i++)
{
    if (i * i > 130)
        break;
}
// i == 12
cout << i;

Příkaz break jsme již viděli u switch a má naprosto stejný význam - opustí cyklus. Slovo break nevyskočí z vnořených cyklů - vždy se vztahuje pouze na 1 nejbližší cyklus.

Na druhou stranu, continue ukončí jen aktuální průběh cyklem, za kterým se mohou dále spustit další průběhy (iterace).

int i, a;
for (i = 2, a = 1; i < 10; i++)
{
    if (i % 3 == 0)
        continue;
    a *= i;
}
// a bude ve výsledku 2240 což je 1 * 2 * 4 * 5 * 7 * 8;
cout << a;

Program výše zjišťuje, zda je i dělitelné třemi, zbytek vnitřku cyklu se přeskočí, takže už jím nenásobíme.

To by již k cyklům stačilo. Již toho umíme docela dost, začíná to být zábava, že? :)

V následujícím cvičení, Řešené úlohy k 6.-7. lekci C++, 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 124x (7.06 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

Předchozí článek
Cykly v C++ (for)
Všechny články v sekci
Základní konstrukce jazyka C++
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 6.-7. lekci C++
Článek pro vás napsal Zdeněk Pavlátka
Avatar
Uživatelské hodnocení:
111 hlasů
Autor se věnuje spoustě zajímavých věcí ze světa informatiky a grafiky
Aktivity