Shrnutí minulého dílu
V předchozím díle jsme se seznámili s tím, co to jsou cykly, jaká je jejich syntaxe a k čemu jsou dobré. Celý minulý díl byl ale pouze o cyklech for, tedy o cyklech, kde dopředu známe počet opakování. Dnes se seznámíme s druhým typem cyklů, u kterých nebudeme vědět, kolikrát se provedou, ale budeme vědět, že se budou provádět tak dlouho, dokud bude (nebo nebude) platit nějaká podmínka.
Cyklus while
Chceme-li do našeho programu zakomponovat tuto smyčku, nemusíme se starat o to, kolikrát se bude opakovat. Důležité je vědět, co musí platit, aby se příkazy, umístěné v tomto cyklu, opakovaly. Možná to zní poněkud chaoticky, proto si uvedeme jednoduchý příklad. Představte si, že Vás čeká ve škole nějaká zkouška, na kterou se samozřejmě musíte učit. Na tuto zkoušku máte neomezený počet pokusů, musíte ji ale úspěšně vykonat. Budete se tedy učit, pak půjdete na zkoušku. V případě, že zkoušku uděláte, je všechno v pořádku, už se nemusíte učit. Druhou možností je, že se Vám zkouška nepovede, tudíž jste něco neuměli a musíte se znovu učit, aby to příště bylo lepší. Jak dlouho se musíte učit? Tak dlouho, dokud zkoušku neuděláte. Je tedy asi patrné, že proces "učení se" se několikrát opakuje, ale vy předem nevíte kolikrát. Opakuje se tak dlouho, dokud úspěšně nesložíte zkoušku. Celý tento příklad by se dal v jazyce C++ zapsat pomocí cyklu while, jehož syntaxe vypadá následně:
while (zkouska == false)
{
// Zde by byly prikazy, ktere se maji opakovat
// V nasem pripade "uceni se"
}
V cyklu tedy říkáme - dokud zkouška je rovno false (tedy dokud jsme úspěšně neudělali zkoušku), musíme se učit. Určitě chápete, že zde se nehodí použití cyklu for, neboť nevíme, kolikrát na zkoušku půjdeme. Víme pouze podmínku, na základě které se rozhodneme. V tom tedy spočívá rozdíl mezi cykly for a cykly while.
Cyklus while se dá zapsat dvěma způsoby. První způsob vidíte výše. Tam se podmínka testuje hned na začátku, tedy ještě předtím, než se provedou příkazy v cyklu - je tedy možné, že se neprovedou ani jednou. To by nastalo v případě, že by se zkouška rovnala true ještě předtím, než bychom na ní vůbec šli. To je ovšem trochu nelogické, proto zde bude lepší použít druhou variantu cyklu while.
do
{
cout << "Ucime se.\n";
} while (zkouska == false);
Takto vypadá syntaxe druhé možnosti. V tomto případě se celý cyklus provede minimálně jednou, neboť to, zda jsme zkoušku udělali zjistíme až po absolvování zkoušky. Podmínka se tedy testuje až po průchodu cyklem.
Je samozřejmé, že do těla cyklu můžeme napsat mnohem více příkazů, včetně další vnořených cyklů apod. Tento příklad měl posloužit jako demostrativní, čili pro pochopení rozdílu mezi cykly for a while.
Příklad
Nyní si zkusíme napsat krátký program, který bude počítat průměr čísel (ano, vím že to bylo i v minulých dílech). Tento program však bude univerzální, čímž mám na mysli, že bude úplně jedno, kolik uživatel zadá čísel. Vzpomeňte si na díl, kde jsme probírali pole. Tam byl také příklad na průměr čísel, nicméně program byl přesně pro pět čísel, které poté sečetl a vydělil pěti. My si ted napíšeme program, kde uživatel bude zadávat čísla a teprve až on sám bude chtít znát průměr, zadá číslo nula. Toto číslo už se ale do výsledného průměru nezapočítá. Mohli jsme program samozřejmě napsat tak, aby vypočítal průměr potom co uživatel napíše například slovo konec, ale s nulou to bude jednodušší a podstata příkladu zůstane nedotčena. Ještě pro představu, zadá-li uživatel posloupnost čísel 2, 4, 5, 3, 1, 0, program vypíše toto:
Pocet zadanych cisel: 5 (pozn.: nula se nepočítá)
Soucet cisel: 15
Prumer cisel: 3
Nejprve si můžete příklad zkusit napsat sami, není to nikterak složité. Malou nápovědou Vám může být to, že nepotřebujete žádné pole a nejdůležitější část programu bude umístěna v cyklu do while.
Pokud jste si to zkusili nebo se Vám to zkoušet nechce, ukázka, jak by kód mohl vypadat, je zde:
#include <iostream>
using namespace std;
int main()
{
int cislo, pocetCisel;
double prumer, soucet;
pocetCisel = soucet = 0;
do
{
cout << "Zadejte cislo: ";
cin >> cislo;
soucet += cislo;
pocetCisel++;
} while (cislo != 0);
prumer = soucet / (pocetCisel - 1);
cout << "STATISTIKA:\n";
cout << "Pocet zadanych cisel: " << pocetCisel - 1 << "\n";
cout << "Soucet cisel: " << soucet << "\n";
cout << "Prumer cisel: " << prumer << "\n";
return 0;
}
V programu jsme si tedy zavedli potřebné proměnné a následně napsali cyklus do while. Ten se bude opakovat tak dlouho, dokud uživatel nezadá číslo nula. V těle cyklu vždy vypíšeme zprávu, aby uživatel zadal číslo, které následně přičteme k dosavadnímu součtu. Proměnnou pocetCisel zvýšíme o jedničku a celý cyklus se opakuje. Jakmile uživatel zadá nulu, cyklus končí a zbývá už jen vypsat výsledky. Vypočteme tedy průměr, a to tak, že součet čísel vydělíme počtem zadaných čísel, zmenšeným o jedničku. To je právě ta nula, kterou uživatel zadal, aby cyklus skončil. Poté máme ve všech proměnných správné hodnoty, nezbývá tedy nic jiného, než je vypsat.
Doufám, že jste pochopili, jakým způsobem se cykly používají a jaký je rozdíl v použití cyklu while a for. V příštím díle se podíváme na funkce, řekneme si, k čemu jsou dobré, jak fungují a jak si je vytvořit a používat.