6. P°φkazy °φdφcφ b∞h programu I
  1. V jednΘ z p°edchozφch konsolov²ch aplikacφ jsme pou╛ili tyto p°φkazy:

  2. 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.
  3. 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:

  4. 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;
  5. 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

  6. 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.
  7. Vytvo°te konzolovou aplikaci, ve kterΘ zadßte dv∞ reßlnß Φφsla z klßvesnice a vypφ╣ete hodnotu v∞t╣φho z nich.
  8. 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:

  9. if (Edit1->Text.ToInt() > 100) Caption = "VelkΘ Φφslo";
    else Caption = "MalΘ Φφslo";
    Program vyzkou╣ejte.
  10. 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.
  11. 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:

  12. 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.
  13. 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.
  14. 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.
  15. 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:
    1. 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.
  16. 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╛?).
  17. 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:

6. P°φkazy °φdφcφ b∞h programu I