7. Příkazy řídící běh programu II
  1. 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:

  2. 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 switch vyhodnotí 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.";
    }
  3. 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í.
  4. 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.
  5. 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:

  6. 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.
  7. 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í.
  8. 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ů).

  9. int cislo, cislice;
    cout << "Zadej přirozené číslo: ";
    cin >> cislo;
    while (cislo) {
      cislo /= 10;
      cislice = cislo % 10;
      cout << cislice << endl;
    }
  10. Vytvořte konzolovou aplikaci, která rozloží zadané přirozené číslo na prvočinitele.
  11. 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.

  12. 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.
  13. Podívejte se na následující konzolovou aplikaci.

  14. 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";
7. Příkazy řídící běh programu II