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.