Cykly, neboli smyčky - pokračování

7. díl - Cykly, neboli smyčky - pokračování

Petr Sklenička       19. 11. 2010       C++/C       8358 zobrazení

V tomto díle si dovysvětlíme cykly. V minulém díle jsme se zaměřili na cykly for, dnes to bude o cyklech while. Vysvětlíme si tedy, jaký je mezi nimi rozdíl, ukážeme si, jaká je syntaxe cyklu while a nebude chybět ani krátký příklad na závěr.

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.

 

hodnocení článku

1 bodů / 1 hlasů       Hodnotit mohou jen registrované uživatelé.

 

Všechny díly tohoto seriálu

13. Virtuální metody 1. 2. 2012
12. Dědičnost 24. 7. 2011
11. Konstruktory, destruktory a hrátky s objekty 28. 5. 2011
10. Úvod do objektově orientovaného programování 10. 3. 2011
9. Ukazatele a odkazy, vyhledávání půlením intervalu 26. 1. 2011
8. Funkce 18. 12. 2010
7. Cykly, neboli smyčky - pokračování 19. 11. 2010
6. Cykly, neboli smyčky 26. 10. 2010
5. Pole 13. 7. 2010
4. Relační operátory a podmínky, příkaz switch 29. 6. 2010
3. Proměnné a konstanty 22. 6. 2010
2. První program 15. 6. 2010
1. Úvod, příprava na psaní aplikací v C++ 8. 6. 2010

 

Mohlo by vás také zajímat

C++/CLI a interoperabilita managed a unmanaged kódu - díl 1.: Úvod do jazyka a základní konstrukce

V tomto článku je popsána nadstavba C++ pro práci s .NET prostředím zvaná C++/CLI umožňující vytvářed mixed assembly obsahující jak managed tak unmanaged kód. V prvním díle je popsána myšlenka jazyka a základní syntaktické konstrukty (základní typy, podmínky, cykly, pole, namespace a část tříd a objektů). U čtenáře je předpokládána znalost .NET frameworku a nativního programování nejlépe v C++ (alespoň syntaxi a základy).

C++/CLI a interoperabilita managed a unmanaged kódu - díl 2.: Složitější konstrukty, low-level přístup a generické programování

V tomto článku je popsána nadstavba C++ pro práci s .NET prostředím zvaná C++/CLI umožňující vytvářed mixed assembly obsahující jak managed tak unmanaged kód. V tomto díle jsou popsány pokročilejší partie jazyka týkající se hlavně objektů, low-level přístupu k managed objektům a generického programování.

Virtuální souborový systém

Článek pojednává o způsobu návrhu virtuálního souborového systému. Před čtením Vám doporučuji stáhnout si a přečíst zadání, abyste věděli o co vlastně jde. Ke stažení jsou i zdrojové kódy v jazyce C++. Aplikace asi nemá žádné velké využití, nicméně přišlo mi to jako zajímavý problém - jednalo se o semestrální projekt.

 

 

Nový příspěvek

 

Diskuse: Cykly, neboli smyčky - pokračování

Jsem začátečník, a tento seriál je opravdu jeden z nejlepších na internetu o C++. Jenom by mě zajimalo. Jaku udělat, aby program po vyhodnocení průměru známky se opět zapnul a neskončil.

#include <iostream>

using namespace std;

int main (){

int pocetcisel,znamka;

double soucet,prumer;

int pokracovani;

pocetcisel=0;

soucet=0;

do {

cout << "zadejte " << pocetcisel+1 << ".znamku:";

cin >> znamka;

pocetcisel++;

soucet += znamka;

} while(znamka !=0);

prumer=soucet/(pocetcisel-1);

cout << "vas prumer je: " << prumer << endl;

cout << "Dalsi prumer?? (1/0): ";

cin >> pokracovani;

if (pokracovani==1) {

system ("start prvni_pokus.exe");

}

return 0;

}

Zkoušel jsem to z 1 a 0, ale když jsem se tam pokusi zadat například, aby uživatel zadal y nebo n, tak mi to hlásilo chybu na řádku If (pokracovani==y), i když jsem měl typ proměnné nastavený na char.(prvni_pokus se jmenuje ten prográmek.) Takže když jsem chtěl aby to fungovalo na (Y/N) místo (1/0), tak to nefungovalo. Díky za radu

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback