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ě:
{CPP_CONSOLE}
int i = 1;
while (i <= 10)
{
cout << i << ' ';
i++;
}
cin.get();
{/CPP_CONSOLE}
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):
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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.
{CPP_CONSOLE}
int i;
for (i = 0; i < 20; i++)
{
if (i * i > 130)
break;
}
// i == 12
cout << i;
{/CPP_CONSOLE}
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).
{CPP_CONSOLE}
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;
{/CPP_CONSOLE}
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 130x (7.06 kB)
Aplikace je včetně zdrojových kódů v jazyce C++