Dalším příkazem je příkaz switch. Tento příkaz používáme k provádění
příkazů určených nějakým výrazem. Např. předpokládejme, že náš program
obsahuje proměnnou s číslem měsíce a my potřebujeme vypisovat jméno měsíce.
To můžeme provést následujícím příkazem:
int mesic;
. . .
switch (mesic) {
case 1: cout
<< "Leden"; break;
case 2: cout
<< "Únor"; break;
case 3: cout
<< "Březen"; break;
case 4: cout
<< "Duben"; break;
case 5: cout
<< "Květen"; break;
case 6: cout
<< "Červen"; break;
case 7: cout
<< "Červenec"; break;
case 8: cout
<< "Srpen"; break;
case 9: cout
<< "Září"; break;
case 10: cout
<< "Říjen"; break;
case 11: cout
<< "Listopad"; break;
case 12: cout
<< "Prosinec"; break;
}
Příkaz switchvyhodnotí svůj výraz, v našem případě je
to hodnota proměnné mesic a provede příkaz označený příslušnou hodnotou.
Tuto situaci můžeme také vyřešit pomocí příkazu if:
int mesic;
. . .
if (mesic ==
1) {
cout << "Leden";
} else if (mesic
== 2) {
cout << "Únor";
. . .
Zda použít příkaz if nebo příkaz switch rozhodneme podle
počtu větvení. Každá část case musí být unikátní a hodnota těchto
částí musí být stejného datového typu a to typu poskytnutého výrazem příkazu
switch.
Jiným důležitým bodem používání příkazu switch je použití příkazu
break
na závěr každého case. Příkaz break předává řízení za příkaz
switch
a pokračuje se prvním příkazem za switch. Tj. bez použití příkazu
break
bude provádění pokračovat příkazy další části
case. V předchozím
příkladu nechceme, aby řízení přecházelo z jedné části case do další
části a tedy každá část case je ukončena příkazem break.
Toto ale nepožadujeme vždy. Např. následující část programu zjišťuje počet
dní v zadaném měsíci (přestupné roky jsou roky, kde číslo roku je dělitelné
4; výjimku tvoří roky na přelomu století, kde jsou přestupné pouze roky,
u kterých století je dělitelné 4, tj. roky 1600 a 2000 přestupné jsou a
roky 1700, 1800 a 1900 přestupné nejsou):
int mesic, rok;
int pocetDni;
. . .
switch (mesic) {
case
1:
case
3:
case
5:
case
7:
case
8:
case
10:
case
12:
pocetDni = 31; break;
case
4:
case
6:
case
9:
case
11:
pocetDni = 30; break;
case
2:
if ( ((rok % 4 == 0) && !(rok % 100 == 0)) || (rok % 400 == 0)
)
pocetDni = 29;
else
pocetDni = 28;
break;
}
V příkazu switch můžeme také použít implicitní příkaz na konci
příkazu switch k zpracování všech hodnot, které se nevyskytly v
žádné předchozí části case.
int mesic;
. . .
switch (mesic) {
case 1: cout
<< "Leden"; break;
case 2: cout
<< "Únor"; break;
case 3: cout
<< "Březen"; break;
case 4: cout
<< "Duben"; break;
case 5: cout
<< "Květen"; break;
case 6: cout
<< "Červen"; break;
case 7: cout
<< "Červenec"; break;
case 8: cout
<< "Srpen"; break;
case 9: cout
<< "Září"; break;
case 10: cout
<< "Říjen"; break;
case 11: cout
<< "Listopad"; break;
case 12: cout
<< "Prosinec"; break;
default: cout
<< "Toto není přípustný měsíc.";
}
Vytvořte konzolovou aplikaci, ve které po zadání čísla měsíce vypíšete
jméno měsíce. V případě zadání chybného čísla měsíce vypište chybové hlášení.
Pokuste se vytvořit konzolovou aplikaci, která bude pracovat jako jednoduchá
kalkulačka. Zadávejte operand, operátor a druhý operand a vypište výsledek.
Nyní opět opustíme konzolové aplikace a vyzkoušíme si použití příkazu switch
v aplikaci GUI. V této aplikaci na formulář přidáme editační ovladač (vyprázdníme
jej), nad něj přidáme komponentu Label s textem
?Zadej číslo dne v týdnu:?, vedle editačního
ovladače umístíme tlačítko ?Urči? a pod editační
ovladač vložíme další komponentu Label pro
výpis výsledků (vyprázdníme jej). Výsledky budeme zobrazovat větším písmem
a barevně. Nastavíme tedy vlastnost Font komponenty
Label2
(po výběru vlastnosti Font
v
Inspektoru
objektů se v místě hodnoty této vlastnosti zobrazí tlačítko s třemi
tečkami; kliknutím na toto tlačítko zobrazíme dialogové okno volby písma,
kde provedeme požadované nastavení) na větší a barevné písmo. Obsluha stisknutí
tlačítka bude tvořena příkazem:
switch (Edit1->Text.ToInt())
{
case 1: Label2->Caption = "Pondělí"; break;
case 2: Label2->Caption = "Úterý"; break;
case 3: Label2->Caption = "Středa"; break;
. . . zde
doplňte další příkazy
default: Label2->Caption = "Chyba";
}
Chybějící příkazy doplňte sami a program vyzkoušejte.
Vytvořte aplikaci GUI, která po zadání čísla měsíce vypíše jméno měsíce.
V případě zadání čísla mimo interval <1,12> vypište chybové hlášení.
Následující konzolová aplikace rozloží zadané přirozené číslo na jednotlivé
číslice (od nejnižšího řádu k nejvyššímu). V programu je chyba. Nalezněte
a odstraňte ji (chybné pořadí příkazů).
Vytvořte konzolovou aplikaci, která rozloží zadané přirozené číslo na prvočinitele.
Podmínka cyklu while určuje ukončení cyklu. Příkazy cyklu jsou prováděny
dokud tato podmínka je pravdivá (nenula). Příkazy cyklu by tuto podmínku
měly ovlivňovat. Jinak hrozí nebezpečí, že provádění cyklu nikdy neskončí.
V tomto případě je nutno ukončit práci programu pomocí Správce úloh Windows.
V C++ Builderu obvykle program spouštíme volbou Run | Run (nebo
stiskem klávesy F9 nebo tlačítkem Run na paletě nástrojů). Z prostředí
Builderu lze také ukončit spuštěný program. Provedeme to volbou Run
| Program Reset nebo kombinací kláves Ctrl+F2.
Podívejte se na následující konzolovou aplikaci.
cout << endl
<< "Začátek programu ... " << endl << endl;
int i = 6;
while (i-- > 0) {
cout <<
endl << "Máme ještě " << i << " problémů.";
}
cout << "\b!\nSláva";
cout << endl
<< endl <<
"Pro pokračování stiskni libovolnou klávesu ... ";
getch();
Pokuste se určit, co provede příkaz:
cout << "\b!\nSláva";