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