V jedné z předchozích konsolových aplikací jsme použili
tyto příkazy:
int c;
while ((c = getchar())
!= '\n')
printf("%c",
c);
Je zde příkaz while, který prochází přečtenými
znaky dokud nenarazíme na znak odřádkování. Obecně řečeno, příkaz while
provádí nějakou akci, pokud je splněna nějaká podmínka. Syntaxe příkazu
while
je:
while (výraz)
příkaz
Pokud výraz je pravdivý, pak je proveden příkaz.
V našem případě cyklus probíhá tak dlouho, dokud přečtený znak není znak
odřádkování.
Příkaz může být jeden příkaz (což vidíme v našem programu) nebo to
může být složený příkaz. Složený příkaz je řada příkazů uzavřená ve složených
závorkách. Např. předpokládejme, že mimo výpisu znaků potřebujeme v cyklu
ještě vypisované znaky počítat. Můžeme to provést např. takto:
int c, pocet = 0;
while ((c = getchar())
!= '\n') {
printf("%c",
c);
pocet++;
}
Zde v cyklu jsou dva příkazy a musíme tedy použít složený příkaz.
Příkazy jako je příkaz while jsou příkazy řídící běh programu, které
určují pořadí, ve kterém budou provedeny ostatní příkazy. Jazyk C podporuje
několik příkazů řídících běh programu. Tyto příkazy jsou popsány v následující
tabulce:
Příkaz
Klíčová slova
větvení
if-else, switch-case
cyklu
for, while, do-while
různé
break, continue, goto, return
Pokud za výraz zapíšeme středník, pak dostaneme příkaz.
Příkaz if-else poskytuje našemu programu možnost výběru prováděného
příkazu na základě nějakého kritéria. Např. předpokládejme, že náš program
vypisuje v závislosti na hodnotě proměnné LADENI ladící informace. Jestliže
LADENI má nenulovou hodnotu (je pravdivá), pak náš program vypíše hodnotu
nějaké proměnné, např. x. Jinak náš program pokračuje v normální
práci. Úsek kódu, který tuto činnost implementuje, je tento:
if (LADENI)
cout
<< "LADENI: x = " << x << endl;
Toto je jednoduchá verze příkazu if; příkaz v příkazu if
je proveden, jestliže podmínka je splněna. Jednoduchý tvar příkazu if
můžeme obecně popsat takto:
if (výraz)
příkaz
Za výraz tvořící podmínku nesmíme zapsat středník. Pokud bychom zapsali
if (výraz);
příkaz
pak příkaz bude proveden vždy (bez ohledu na hodnotu výrazu). Středník
vytváří prázdný příkaz (příkaz, který nic neprovádí) a provedení tohoto
prázdného příkazu je ovlivňováno hodnotou výrazu.
Když při splnění podmínky je zapotřebí provést více příkazů, pak tyto
příkazy je nutno zapsat do složených závorek (vytvořit z nich složený příkaz).
Při zápisu výrazu podmínky nesmíme zaměňovat operátor rovnosti (==)
a operátor přiřazení (=). Pokud např. zapíšeme:
if (x = 20)
příkaz;
pak do proměnné x je přiřazena hodnota 20 a provedený výraz
má hodnotu 20, která je interpretována jako pravdivá hodnota a příkaz bude
proveden vždy. V této situaci může překladač vypsat varování "Possibly
incorect assignment" (možné chybné přiřazení).
Příkazy if můžeme vnořovat (úroveň vnoření není omezena). Není
to nic jiného, než následování příkazu if jedním nebo více dalšími
příkazy if. Např.
if (x > 10)
if (x > 20)
cout << "x je mezi 10 a 20." << endl;
V některých případech, ale můžeme chtít při nesplněné podmínce provést
jiný příkaz. K tomuto účelu můžeme použít část else příkazu if.
Předpokládejme následující příklad. Máme dvě proměnné x a y
typu float a máme vypsat hodnotu většího z nich. K tomuto účelu
lze použít příkaz
if (x > y) cout <<
x << endl;
else cout << y << endl;
Pokud podmínka je splněna, pak je proveden první příkaz cout,
není-li splněna je proveden druhý příkaz cout.
Toto je příklad použití úplného příkazu if. Část else je
provedena, pokud podmínka příkazu if je nesplněna.
Část else může mít i jiný tvar a to else, které je provedeno
na základě jiné podmínky. Např. předpokládejme, že vytváříme program, který
přiřazuje hodnotu znaku na základě určených intervalů. A pro více než 90%,
B pro 80% až 90%, atd. K tomuto můžeme použít příkaz if s řadou
porovnávání else if a můžeme zapsat tento kód:
int procento;
char znak;
if (procento >= 90)
{
znak = 'A';
} else if (procento
>= 80) {
znak = 'B';
} else if (procento
>= 70) {
znak = 'C';
} else if (procento
>= 60) {
znak = 'D';
} else {
znak = 'F';
}
Příkaz if může mít libovolný počet částí else if, ale
pouze jednu část else. Povšimněte si, že pro některé hodnoty proměnné
procento
vyhovuje více výrazů ve složeném příkazu if. Např. hodnota 76 má
pravdivé podmínky procento
>= 70 a procento
>= 60. Nicméně zpracování složeného příkazu if po
nalezení první pravdivé podmínky (76 >=70) a po provedení příkazu znak
= 'C';, předá řízení za příkaz if bez vyhodnocení
zbývajících podmínek.
Editor kódu má funkci, která pomáhá nalézt k závorce její odpovídající
párovou závorku. Umístíme kurzor před závorku, pro kterou chceme nalézt
odpovídající otevírací nebo zavírací závorku a stiskneme klávesovou kombinaci
Alt+[
nebo
Alt+]. Kurzor je přemístěn na příslušnou párovou závorku.
Podívejte se na následující kód:
if (smer == JIH)
ztrata = true;
else ztrata = false;
Tento typ příkazu je možno zkrátit takto:
(smer == JIH) ? ztrata
= true : ztrata = false;
nebo dokonce i takto:
ztrata = (smer ==
JIH);
Další příkazy řídící běh programu budou popsány v dalších kapitolách.
Vytvořte konzolovou aplikaci, ve které zadáte dvě reálná čísla z klávesnice
a vypíšete hodnotu většího z nich.
Opustíme opět konzolové aplikace a budeme vytvářet aplikaci GUI. V následujícím
programu budeme titulek okna (formuláře) určovat v závislosti na zadané
hodnotě (pro hodnoty větší než 100 bude titulek ?Velké číslo?, jinak
?Malé číslo?). Na formulář vložíme editační ovladač (vyprázdníme jej),
nad něj umístíme Label s textem ?Zadej
celé číslo:? a vedle něj tlačítko ?Vyhodnoť?.
Obsluhu stisku tohoto tlačítka bude tvořit příkaz:
if (Edit1->Text.ToInt()
> 100) Caption = "Velké číslo";
else Caption = "Malé
číslo";
Program vyzkoušejte.
Vytvořte program s formulářem obsahujícím dva editační ovladače, ve kterých
budete zadávat celá čísla a tlačítko, po jehož stisku se větší číslo zobrazí
jako název okna. Editační ovladače doplňte vhodným textem.
Začneme novou aplikaci. V komponentě Memo
můžeme zobrazit obsah textového souboru. Vytvoříme formulář, na který vložíme
tuto komponentu (je na stránce Standard) a
zvětšíme ji tak, aby zabírala levou polovinu formuláře. Když nyní aplikaci
spustíme, můžeme komponentu Memo používat
jako textový editor. Vyzkoušejte. K otevření textového souboru v této komponentě
použijeme metodu LoadFromFile pro vlastnost
Lines
této komponenty. Parametrem metody je specifikace otevíraného souboru.
Většinou budeme chtít specifikovat soubor až za běhu aplikace a využijeme
tedy komponentu OpenDialog (je na stránce
Dialogs).
Tuto komponentu umístíme na formulář (za běhu aplikace nebude viditelná)
a na formulář dále vložíme tlačítko a změníme jeho text na ?Otevři
soubor?. Vytvoříme obsluhu stisku tohoto tlačítka příkazem:
if (OpenDialog1->Execute())
Memo1->Lines->LoadFromFile(OpenDialog1->FileName);
Když nyní aplikaci spustíme a stiskneme tlačítko ?Otevři
soubor je otevřeno dialogové okno pro otevření souboru. Zavřeme-li
toto okno bez volby jména souboru (např. okno uzavřeme tlačí? Zrušit),
pak funkce Execute (zobrazující toto okno)
vrací
False (podmínka příkazu if
není splněna) a příkaz v if se neprovede.
Vybereme-li jméno textového souboru, pak obsah tohoto souboru je zobrazen
v komponentě Memo. Vlastnost FileName
komponenty OpenDialog udává jméno zvoleného
souboru.
Při delších souborech by bylo vhodné komponentu Memo
vybavit posuvníky. To můžeme zajistit změnou vlastnosti ScrollBars
této komponenty. Přidejte do komponenty oba posuvníky.
Komponenta OpenDialog má vlastnost
Filter. Pomocí této vlastnosti můžeme určovat typy souborů, které
budou nabízeny k otevření. V poli hodnot této vlastnosti stiskneme tlačítko
(?)
a v zobrazeném Editoru filtrů zadáme požadovaný
filtr. V prvním sloupci zadáme název filtru (text zobrazovaný v dialogovém
okně otevření souboru) a ve druhém sloupci tento filtr vyjádříme pomocí
hvězdičkové konvence (můžeme zadat více řádků filtrů). My zadáme filtr:
Textové
soubory - *.txt.
Vytvořený textový editor můžeme také vybavit funkcemi pro práci se schránkou
a funkcí zrušení celého textu. Přidáme tedy na formulář tlačítka ?Vyjmout?,
?Kopírovat?, ?Vložit?
a ?Smazat vše?. Obsluha pro stisknutí tlačítka
?Vyjmout? bude tvořena příkazem:
Memo1->CutToClipboard();
Obdobně v dalších obsluhách událostí použijeme metody CopyToClipboard,
PasteFromClipboard
a Clear. Vytvořte tyto obsluhy a program vyzkoušejte.
Po provedení změn v textu souboru budeme chtít nový soubor většinou uložit.
Můžeme postupovat obdobně jako při otevírání souboru, použijeme komponentu
SaveDialog
a
metodu SaveToFile (na formulář přidáme tlačítko
?Ulož?).
Začneme novou aplikaci, kde se budeme zabývat změnou barvy. Pro změnu barvy
běžně používáme standardní komponentu ColorDialog
(používá se obdobně jako OpenDialog). Tzn.
dialogové okno barev zobrazíme metodou Execute
a vybraná barva je určena vlastností Color
této komponenty. Vytvořte aplikaci, kde po stisku tlačítka ?Barva?
zobrazíte dialogové okno barev a vybranou barvu přiřadíte barvě formuláře.
Nové pojmy:
Složený příkaz je řada příkazů uzavřených ve složených závorkách.
Složený příkaz je považován za jeden příkaz i když se skládá z několika
příkazů.
Příkaz if je použit k testování podmínky a provedení příkazu, když
je podmínka splněna.
Příkaz else je používán společně s příkazem if a určuje část
kódu, který bude proveden při nesplnění podmínky příkazu if.