Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

7. díl - Cykly v C++ (while, do while)

C a C++ C++ Základní konstrukce C++ Cykly v C++ (while, do while)

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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

While cyklus 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 cyklu. 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 switchem, 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

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.

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 switche a má naprosto stejný význam - opustí switch. 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.

V příští lekci, Pole v C++, si ukážeme, jak pracovat s poli.

Již toho umíme docela dost, začíná to být zábava, že? :)


 

Stáhnout

Staženo 39x (7.06 kB)
Aplikace je včetně zdrojových kódů v jazyce C++

 

 

Článek pro vás napsal Zdeněk Pavlátka
Avatar
Jak se ti líbí článek?
7 hlasů
Autor se věnuje spoustě zajímavých věcí :)
Miniatura
Předchozí článek
Cykly v C++ (for)
Miniatura
Všechny články v sekci
Základní konstrukce jazyka C++
Miniatura
Následující článek
Cvičení k 6.-7. lekci C++
Aktivity (10)

 

 

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

Avatar
Jaroslav Dubánek:9. srpna 19:09

Tak už jsem přišel na to, v čem byl problém. Otevřel jsem si kalkulačku, kterou jsem tu měl uloženou a na začátku bylo

#include <iostream>
#include <cmath>
using namespace std;

přičemž <cmath> dělal ten problém. Když jsem ho vyměnil za <string> tak už to funguje.

Odpovědět 9. srpna 19:09
Člověka určuje to, co ho fascinuje a co je jeho vášní. Mě fascinují věci, které mě přesahují. Vzrušení z nepoznaného ...
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Jaroslav Dubánek
Zdeněk Pavlátka:9. srpna 19:24

<cmath> obsahuje matematické funkce a <string> práci s textem. Správně bys měl potřebovat oboje, ale některé překladače nevyžadují některé includy... A hlavně každý trochu jiné. Kódy v mých článcích fungovaly s překladačem ve VS 2010.

Odpovědět 9. srpna 19:24
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Vítek Dvořák:11. srpna 13:59

ahoj potrebuji radu kdyz u kalkulacky za while chci zopakovat kod tak mi to pise chyby jako: cout,cin je dovojznačný;nebo casse1-4 předefinovaná jmenovka;float a;b předefinován. Možná mám někde nějakou chybu kterou jsem přehlídl nemá někdo nějakou radu? předem dík :)

 
Odpovědět 11. srpna 13:59
Avatar
Zdeněk Pavlátka
Tým ITnetwork
Avatar
Odpovídá na Vítek Dvořák
Zdeněk Pavlátka:12. srpna 19:50

float a;b předefinován

znamená, že proměnné a, b vytváříš ve chvíli, kdy již existují.
Víc z tvého popisu není jasné, zkus sem dát ten problémový kód.

Odpovědět 12. srpna 19:50
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Vítek Dvořák:17. srpna 23:46

už jsem to vyřešil ale teď mám problém že u řešení pokračování kalkulačky pomoci while mi kod skončí hned po prvnim příkladu a kod s while se vubec nepřečte zkoušel jsem i zkopírovat předlohu a dělá mi úplně to stejné

 
Odpovědět 17. srpna 23:46
Avatar
Odpovídá na Vítek Dvořák
Libor Šimo (libcosenior):18. srpna 9:45

Ako pisal Zdenek, pastni sem svoj kod. Moze tam by malinka chybicka a ty si ju nevsimnes.

Odpovědět 18. srpna 9:45
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Štrbo:21. srpna 1:06

Ahoj dostávam Error pri všetkých cin príkazoch či už cin.get() alebo cin >> " "cin" is ambiguous" ale ak pred cin dám std:: tak to už ide , na začiatku mám napísané using namespace std; ako tento problém vyriešiť ? Keď tam cyklus neni všetko je v poriadku

Editováno 21. srpna 1:07
 
Odpovědět 21. srpna 1:06
Avatar
Odpovídá na Lukáš Štrbo
Libor Šimo (libcosenior):21. srpna 12:04

Skus sem pastnut tvoj kod.

Odpovědět 21. srpna 12:04
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Lukáš Štrbo:21. srpna 17:01

Kód zostal nezmenený zmazal som std:: spred cin príkazu a ide to no pred tím to nešlo , v kóde som nič nemenil neviem kde vtedy nastala chyba ale zdrojový kód je tu :

#include <string>
#include <iostream>
#include <clocale>
#include <conio.h>
using namespace std;

int main(void) {
        setlocale(LC_ALL, "");
        string podmienka = "a";
        while (podmienka == "a")
        {
                cout << "Zadaj 1. cislo: " << endl;
                float a;
                cin >> a;
                cout << "Zadaj 2. cislo: " << endl;
                float b;
                cin >> b;
                cout << "Zvolte si operaciu: " << endl;
                cout << "1 - Scitanie" << endl;
                cout << "2 - Odcitanie" << endl;
                cout << "3 - Nasobenie" << endl;
                cout << "4 - Delenie" << endl;
                float c = 0;
                int volba;
                cin >> volba;
                switch (volba) {
                case 1:
                        c = a + b;
                        break;
                case 2:
                        c = a - b;
                        break;
                case 3:
                        c = a * b;
                        break;
                case 4:
                        c = a / b;
                        break;
                }
                if ((volba > 0) && (volba < 5))
                {
                        cout << "Vysledok: " << c << endl;
                }
                else
                {
                        cout << "Chybna Volba!" << endl;
                }
                cout << "Chcete pokracovat? a\n" << endl;
                std::cin >> podmienka;
        }
        cout << "Koniec" << endl;
        cin.get(); cin.get();
        return 0;

}
Editováno 21. srpna 17:01
 
Odpovědět 21. srpna 17:01
Avatar
Odpovídá na Lukáš Štrbo
Libor Šimo (libcosenior):22. srpna 6:31

Mozno si robila srandu umela inteligencia. Hlavne, ze to uz je v poriadku.

Odpovědět 22. srpna 6:31
Aj tisícmíľová cesta musí začať jednoduchým krokom.
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 11. Zobrazit vše