Home >> C++ návod >> Řídící struktury

Řídící struktury

V předchozí lekci jsme si vysvětlili, že program je zpracován shora řádek po řádku. Programy, které jsme psali doposud byly pouze sekvencí příkazů, které se jeden po druhém postupně zpracovali a to v pořadí, v jakém byly uvedeny ve zdrojevém kódu. S tímto by jsme si ovšem v programvání nevystačili, proto se v této lekci naučíme používat tzv. řídící struktury.

Řídící struktury rozhodují o dalším průběhu programu a to tak, že samy o sobě nic nevykonávají, ale větví, cyklí nebo jinak mění běh programu.

Složený příkaz

Na úvod je potřeba, objasnit si nový pojem - složený příkaz. Jedná se o skupinu jednoduchých příkazů, které jsou sloučeny v jeden celek pomocí složených závorek. Příklad:

cout << "zadej cislo: " << endl;
cin >> x;
cout << "zadal jsi cislo: " << x << endl;

Tuto ukázku tvoří trojice jednoduchých příkazů (1. cout, 2. cin, 3. cout). Nyní z této trojice příkazů vytvoříme jeden složený příkaz:

{
cout << "zadej cislo: " << endl;
cin >> x;
cout << "zadal jsi cislo: " << x << endl;
}

Nyní se již jedná o 1 složený příkaz, skládající se ze 3 jednoduchých příkazů.

Význam složeného příkazu lépe pochopíte dále v této lekci, kdy jej použijeme u některé z řídících struktur.

Podmíněný příkaz (if,else)

První řídící strukturou na kterou se podíváme, je podmíněný příkaz. Již z názvu je patrné, že klíčovým prvkem této struktury je podmínka. Na základě této podmínky vzniká rozhodování, zda provést či neprovést příkazy obsažené v těle této struktury. Podmíněný příkaz je označen klíčovým slovem if a zapisuje se ve tvaru:

if (podmínka) příkaz

Například:

if (zdravi == 0)
cout << "Tvuj hrdina zemrel!" << endl;

V příkladu si všimněme příkazu cout. Tento příkaz se provede pouze pokud je splněna podmínka, tedy pokud hodnota proměnné zdravi je rovna nule (vrací hodnotu TRUE). V opačném případě, kdy podmínka není splněna (vrácena hodnota FALSE), je příkaz cout přeskočen a neprovede se.

Pozor! Podmínka se vztahuje vždy pouze pro následující příkaz. Pokud chceme k podmínce přiřadit více příkazů, je třeba tyto příkazy sloučit v jeden složený příkaz.

Stejná podmínka ovšem se složeným příkazem:

if (zdravi == 0)
{
cout << "Tvuj hrdina zemrel!" << endl;
cout << "Chces hrat znovu? (A - ano, N - ne): " << endl;
cin >> rozhodnuti;
}

if + else

Pomocí klíčového slova else lze vytvořit druhou větev, která se provede v případě nepravdivého vyhodnecení podmínky. Tvar takového podmíněného příkazu vypadá následovně:

if (podmínka) příkaz;
else příkaz
Například:
if (skore > 999) cout << "Vyhral jsi!" << endl;
else cout << "Prohral jsi!" << endl;

Tato ukázka se skládá ze dvou větví. Jedna větev se provede v případě pravdivého vyhodnocení podmínky a druhá větev (else) se provede při nepravdivém vyhodnocení. Znamená to tedy, že hláška Vyhral jsi! se výpiše pouze v případě, kdy hodnota proměnné skore je větší než 999. V opačném případě se vypíše hláška Prohral jsi!

else if

Počet větví podmíněného příkazu není nijak omezen, může tedy klidně obsahovat 20 větví je-li to nutné. Každá další větev musí mít ovšem svou vlastní podmínku a vytvoříme ji pomocí klíčových slovelse if. Například:

int den;
cout << "Zadej cislo dne (1 - 7): ";
cin >> den;

if (den == 1)
cout << "Pondeli" << endl;
else if(den == 2)
cout << "Utery" << endl;
else if(den == 3)
cout << "Streda" << endl;
else if(den == 4)
cout << "Ctvrtek" << endl;
else if(den == 5)
cout << "Patek" << endl;
else if(den == 6)
cout << "Sobota" << endl;
else if(den == 7)
cout << "Nedele" << endl;
else
cout << "Zadal jsi spatne cislo!" << endl;

Přepínač (switch)

Jistě jste si v předchozím příkladu, kde se v závislosti na zadaném čísle, vypsal název dne, všimli, že se neustále opakuje určitá koncepce a mění se pouze číslo a jemu odpovídající název dne. V takovém případě lze pro zjednodušení zápisu použít tzv. přepínač nebo-li switch. Syntaxe přepínače je následující:

switch (proměnná)
{
case konstanta1:
příkaz;
break;
case konstanta2:
příkaz;
break;
.
.
.
default:
příkaz;
}

Přepínač se vždy vztahuje k určité proměnné. V těle přepínáče jsou vypsány příkazy pro jednotlivé hodnoty, kterých daná proměnná může nabýt (case). Každý case musí být ukončen příkazem break;, protože jinak by došlo k tomu, že se provede spravný příkaz, ale i všechny následující po něm. Případ default není nutnou součástí přepínače, provede se v případě, že zadaná hodnota nemá v těle přepínače odpovídající case (stejná funkce jako else u podmíněného příkazu).

Pro možnost porovnání použijeme opět, příklad se dny v týdnu:

int den;
cout << "Zadej cislo dne (1 - 7): ";
cin >> den;

switch (den)
{
case 1: cout << "Pondeli" << endl; break;
case 2: cout << "Utery" << endl; break;
case 3: cout << "Streda" << endl; break;
case 4: cout << "Ctvrtek" << endl; break;
case 5: cout << "Patek" << endl; break;
case 6: cout << "Sobota" << endl; break;
case 7: cout << "Nedele" << endl; break;
default:
cout << "Zadal jsi spatne cislo!" << endl;
}

Cyklus while

Cyklus while je řídící strukturou, jenž vytvoří smyčku, která se opakuje dokud je splněna podmínka. Podívejme se jak se cyklus while zapisuje:

while (podmínka) příkaz;

Princip cyklu while si ukážeme na následujícím příkladu:

int cislo;
cout << "Zadej poocatecni cislo odpoctu: ";
cin >> cislo;

while (cislo > 0)
{
cout << cislo << ", ";
cislo = cislo - 1;
}

cout << "Ted!" << endl;
return 0;

Jedná se o odpočítávání se stanovením počátečního čísla. Pojďme se na tento příklad podívat podrobněji.

Po spuštění programu jsme nejprve požádáni o zadání počátečního čísla. Zadejme tedy například číslo 10. Nyní již přichází na řadu cyklus while s podmínkou (cislo > 0). Pokud je tato podmínka vyhodnocena jako pravdivá (což pro hodnotu 10 je), provedou se příkazy v těle cyklu. To znamená, že se nejrve vypíše aktuální hodnota proměnné cislo (10) a poté dojde ke snížení této hodnoty o 1. Hodnotou proměnné cislo je nýní číslo 9. Opět se vrátíme zpět k přezkoumání, zda je pro tuto novou hodnotu (9) splněna podmínka cyklu. Jelikož 9 je větší než 0, podmínka je opět splněna a příkazy uvnitř cyklu se opět provedou. Takto se celý proces bude opakovat, dokud nenastane situace, kdy hodnota proměnné cislo bude rovna nule. V tomto případě dojde k tomu, že podmínka cyklu bude vyhodnocena jako nepravdivá a proto se již příkazy v cyklu neprovedou - cyklus je u konce. Proces zpracování rogramu pokračuje od nasledujícího řádku ve zdrojovém kódu. Nakonec se tedy vypíše slovo Ted!.

10, 9, 8, 7, 6, 5, 4, 3, 2, 1, Ted!
Slovo while znamená z angličtiny dokud, proto například:
while (x < 5)
čteme jako: "Dokud je x menší jako 5"

Každý cyklus musí být někdy ukončen!. V opačném případě nastane tzv. nekonečný cyklus nebo-li zacyklení, což vede k tomu že tělo cyklu se bude donekonečna opakovat a program nikdy neskončí. Příklad nekonečného cyklu:

int cislo = 7;
while (cislo > 0)
cout << cislo << ", ";
cout << "Konec programu" << endl;

V tomto příkladě se bude neustále vypisovat číslo 7, jelikož podmínka je splněna a hodnota proměnné zůstává stejná - tedy i podmínka je stále plněna. Proto je nutné dbát o to aby se hodnota proměnné, která je zkoumána v podmínce, s každým provedením těla cyklu vhodně změnila. Tím máme na mysli, aby po určité době nastal případ nepravdivého vyhodnocení podmínky. Předchozí příklad upravíme například tímto způsobem:

int cislo = 7;
while (cislo > 0)
{
cout << cislo << ", ";
cislo--;
}
cout << "Konec programu" << endl;

Nyní se již nejedná o nekonečný cyklus, jelikož postupným snižováním se dostaneme na hodnotu 0.

Cyklus do-while

Cyklus do-while pracuje na stejném principu jako cyklus while. Ovšem oproti cyklu while má tu výhodu, že tělo cyklu s provede vždy minimálně jednou a to i ve chvíli, kdy je podmínka vyhodnocena jako napravdivá. Jak je to možné napoví již struktura zápisu takového cyklu:

do příkaz while (podmínka);

Jistě jste si všimli rozdílu, že se podmínka zapisuje oproti while až na konec cyklu. Z minulých lekcí víme, že zdrojový kód programu je zpracováván shora řádek po řádku. Což má za následek to, že se nejprve provede tělo cyklu a až poté je zkoumána podmínka. To znamená, že tělo cyklu se provede minimálně jednou i v případě, že podmínka není splněna.

Rozdíl mezi while a do-while si ukážeme na následujícím příkladu:

pomocí while

int cislo = 7;
while (cislo < 0)
{
cout << cislo << ", ";
cislo++;
}
cout << "Konec programu" << endl;

Výpis programu:

Konec programu

Hodnota proměnné cislo je záměrně nastavena tak, aby byla podmínka cyklu vyhodnocena jako nepravdivá. Jak můžeme vidět, při nepravdivém vyhodnocení podmínky se tělo cyklu neprovede.

pomocí do-while

int cislo = 7;
do {
cout << cislo << ", ";
cislo++;
} while (cislo < 0);
cout << "Konec programu" << endl;

Výpis programu:

7, Konec programu

Podmínka je i v tomto případě vyhodnocena jako nepravdivá. I přesto se však tělo cyklu jednou provedlo.

Cyklus for

Posledním cyklem, který zbývá představit, je cyklus for. Tento cyklus je vhodný použít zejména ve chvíli, kdy chceme přesně vymezit interval čísel, pro ketré se má provádět nějaká akce. Syntaxe cyklu for je následující:

for (inicializace; podmínka; krok) příkaz;

Například:

int x;
for (x = 10; x > 0; x--)
cout << x << ", ";

cout << "Ted!" << endl;

Podívejme se nyní na tuto ukázku podrobněji. Všimněme si závorky u klíčového slova for, která je středníky rozdělena na 3 části. První část tvoří tzv. inicializace, což je určení počáteční hodnoty (initial z agličtiny znamená počáteční). V našem příkladě je počáteční hodnota nastavena na 10. Druhá část obsahuje podmínku, která je, stejně jako u ostatních cyklů, vyhodnocována jako pravdivá nebo nepravdivá. Ve třetí části se uvádí hodnota kroku, která s každým provedením cyklu změní hodnotu proměnné. V příkladu se vždy hodnota sníží o 1 (x--). Tělo cyklu je tvořeno příkazem cout, pomocí kterého vypisujeme aktualní hodnotu proměnné. To se bude provádět, dokud bude podmínka vyhodnocována jako pravdivá, tedy dokud hodnota proměnné x bude větší než nula. Poté se nakonec vypíše slovo Ted!. Výpis na obrazovku bude následující:

10, 9, 8, 7, 6, 5, 4, 3, 2, 1, Ted!
C++ Návod
Úvod do C++
Volba programu
Struktura programu
Proměnné
Konstanty
Operátory
Vstup a výstup
Řídící struktury
Funkce - 1.část
Funkce - 2.část
Pole
Práce s textovými řetězci
Ukazatele - 1.část
Ukazatele - 2.část
Dynamické proměnné
Datové struktury
©2008 - 2011 Klikzone.cz
Ráj aut - inzerce nových i ojetých aut