Veľkonočná akcia je tu a s ňou aj extra kredity ZADARMO na náš interaktívny e-learning. Dobij si teraz kredity a posuň sa vo svojej kariére vpred!
Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

5. diel - Podmienky (vetvenia) v C ++

V predchádzajúcom kvíze, Kvíz - C++, konzola a premenné, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.

V minulej lekcii, Kvíz - C++, konzola a premenné , sme si podrobne prebrali dátové typy v C ++. Aby sme si niečo naprogramovali, potrebujeme nejako reagovať na rôzne situácie. Môže to byť napríklad hodnota zadaná užívateľom, podľa ktorej budeme chcieť meniť ďalšie beh programu. Hovoríme, že sa program vetví a k vetvenie používame podmienky. Tým sa budeme venovať celý dnešný C ++ tutoriál. Vytvoríme program na výpočet odmocniny a vylepšíme našu kalkulačku.

Podmienky

Podmienky zapisujeme pomocou kľúčového slova if, za ktorým nasleduje logický výraz. Ak je výraz pravdivý, vykoná sa nasledujúci príkaz. Ak nie, nasledujúci príkaz sa preskočí a pokračuje sa až pod ním. Vyskúšajme si to:

Klikni pre editáciu
  • if (15 > 5)
        cout << "Pravda" << endl;
    cout << "Program tu pokracuje dal" << endl;
    cin.get();
    
    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

    Výstup programu:

    Konzolová aplikácia
    Pravda
    Program tu pokracuje dal

    Ak podmienka platí (čo tu áno), vykoná sa príkaz Vyhlasujúca do konzoly text " Pravda ". V oboch prípadoch program pokračuje ďalej. Súčasťou výrazu samozrejme môže byť aj premenná:

    Klikni pre editáciu
    • cout << "Zadaj nejake cislo" << endl;
      int a;
      cin >> a;
      if (a > 5)
          cout << "Zadal si čísla väčšie ako 5!" << endl;
      cout << "Dekuji za zadani" << endl;
      cin.get(); cin.get();
      
      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

      Ukážme si teraz relačné operátory, ktoré môžeme vo výrazoch používať:

      operátor C-like zápis
      rovnosť ==
      Je ostro väčšia >
      Je ostro menšia <
      Je väčšie alebo rovné > =
      Je menšie alebo rovné <=
      nerovnosť ! =
      Všeobecná negácia !
      Rovnosť zapisujeme dvoma == preto, aby sa to neplietlo s bežným priradením do premennej, ktoré sa robí len jedným =. Ak chceme nejaký výraz znegovat (z true urobiť false a naopak), napíšeme ho do zátvorky a pred neho výkričník.

      Keď budeme chcieť pri splnení podmienky vykonať viac než len jeden príkaz, musíme príkazy vložiť do bloku zo zložených zátvoriek:

      Klikni pre editáciu
      • #include <iostream>
        #include <cmath>
        using namespace std;
        
        int main()
        {
            cout << "Zadaj nejake číslo, z ktorého spočítajú odmocninu:" << endl;
            int a;
            cin >> a;
            if (a >= 0)
            {
                cout << "Zadal si nezáporné čísla, to znamena, ze ho môžem odmocniť!" << endl;
                double o = sqrt(double(a));
                cout << "Odmocnina z cisla " << a << " je " << o << endl;
            }
            cout << "Dekuji za zadani" << endl;
            cin.get(); cin.get();
            return 0;
        }
        
        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

        výsledok:

        Konzolová aplikácia
        Zadaj nejake číslo, z ktorého spočítajú odmocninu:
        150
        Zadal si nezáporné čísla, to znamena, ze ho môžem odmocniť!
        Odmocnina z cisla 150 je 12.2474
        Dekuji za zadani

        Program načíta od užívateľa číslo a ak je väčšia ako 0, vypočíta z neho druhú odmocninu. Okrem iného sme použili funkciu sqrt(), ktorá je spolu s radom ďalších užitočných matematických funkcií definovaná v súbore cmath (Nezabudnite ju includovat, ak chcete funkciu používať). sqrt() vracia hodnotu ako double. Pretože ale dokáže pracovať s niekoľkými dátovými typmi, musíme jej povedať, ktorú verziu chceme použiť. Premennú a teda přetypujeme na double. To sa dá vykonať niekoľkými spôsobmi:

        1. typ (hodnota)
        2. (Typ) hodnota
        3. (Typ) (hodnota)

        Bolo by pekné, keby nám program vyhubovala v prípade, že zadáme záporné číslo. S doterajšími znalosťami by sme napísali niečo ako:

        Klikni pre editáciu
        • cout << "Zadaj nejake číslo, z ktorého spočítajú odmocninu:" << endl;
          int a;
          cin >> a;
          if (a >= 0)
          {
              cout << "Zadal si nezáporné čísla, to znamena, ze ho môžem odmocniť!" << endl;
              double o = sqrt(double(a));
              cout << "Odmocnina z cisla " << a << " je " << o << endl;
          }
          if (a < 0)
              cout << "Odmocnina zo záporného cisla neexistuje!" << endl;
          cout << "Dekuji za zadani" << endl;
          cin.get(); cin.get();
          
          • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

          Kód však môžeme výrazne zjednodušiť pomocou kľúčového slova else, ktoré vykoná nasledujúci príkaz alebo blok príkazov v prípade, že sa podmienka nevykoná:

          Klikni pre editáciu
          • cout << "Zadaj nejake číslo, z ktorého spočítajú odmocninu:" << endl;
            int a;
            cin >> a;
            if (a >= 0)
            {
                cout << "Zadal si nezáporné čísla, to znamena, ze ho môžem odmocniť!" << endl;
                double o = sqrt(double(a));
                cout << "Odmocnina z cisla " << a << " je " << o << endl;
            }
            else
                cout << "Odmocnina zo záporného cisla neexistuje!" << endl;
            cout << "Dekuji za zadani" << endl;
            cin.get(); cin.get();
            
            • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

            Kód je oveľa prehľadnejšie a nemusíme vymýšľať opačnú podmienku, čo by v prípade zloženej podmienky mohlo byť niekedy aj veľmi ťažké. V prípade viac príkazov by bol za else opäť blok { }.

            Kľúčové slovo else sa tiež využíva v prípade, keď potrebujeme v príkaze manipulovať s premennou z podmienky a nemôžeme sa na ňu teda pýtať potom znova. Program si sám pamätá, že sa podmienka nesplnila a prejde do sekcie else. Ukážme si to na príklade: Majme číslo a, kde bude hodnota 0 alebo 1 a po nás sa bude chcieť, aby sme hodnotu prehodili (ak tam je 0, dáme tam 1, ak 1, dáme tam 0).

            Naivne by sme mohli kód napísať takto:

            Klikni pre editáciu
            • int a = 0; // do a si priradíme na začiatku 0
              
              if (a == 0) // ak je a 0, dáme do neho jedničku
                  a = 1;
              if (a == 1) // ak je a 1, dáme doňho nulu
                  a = 0;
              
              cout << a << endl;
              cin.get();
              
              • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

              Nefunguje to, že? Poďme si prejsť, čo bude program robiť. Na začiatku máme v a nulu, prvá podmienka sa určite splní a dosadí do a jedničku. No ale razom sa splní aj tá druhá. Čo s tým? Keď podmienky otočíme, budeme mať ten istý problém s jednotkou. Ako z toho von? Áno, použijeme else.

              Klikni pre editáciu
              • int a = 0; // do a si priradíme na začiatku 0
                
                if(a == 0) // ak je a 0, dáme do neho jedničku
                    a = 1;
                else // ak je a 1, dáme doňho nulu
                    a = 0;
                
                cout << a << endl;
                cin.get();
                
                • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                V C ++ môžeme celú podmienku nahradiť aj takto: a = !a;, Čo nám prehodí nulu a jedničku.

                Podmienky je možné skladať a to pomocou dvoch základných operátorov:

                operátor C-like zápis význam
                A zároveň && platí oboje
                alebo || platí aspoň jedno
                Uveďme si príklad:
                Klikni pre editáciu
                • cout << "Zadajte cislo v rozmedzi 10-20:" << endl;
                  int a;
                  cin >> a;
                  if ((a >= 10) && (a <= 20))
                      cout << "Zadal si spravne" << endl;
                  else
                      cout << "Zadal si spatne" << endl;
                  cin.get(); cin.get();
                  
                  • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                  S tým si zatiaľ vystačíme, operátorov sa pomocou zátvoriek samozrejme dajú kombinovať.

                  Klikni pre editáciu
                  • cout << "Zadajte cislo v rozmedzi 10-20 alebo 30-40:" << endl;
                    int a;
                    cin >> a;
                    if (((a >= 10) && (a <= 20)) || ((a >=30) && (a <= 40)))
                        cout << "Zadal si spravne" << endl;
                    else
                        cout << "Zadal si spatne" << endl;
                    cin.get(); cin.get();
                    
                    • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                    Switch

                    Konštrukcia switch je prevzatá z jazyka C (ako väčšina gramatiky C ++). Umožňuje nám zjednodušiť (relatívne) zápis viac podmienok pod sebou. Spomeňme si na našu kalkulačku v prvých lekciách, ktorá načítala 2 čísla a vypočítala všetky 4 operácie. Teraz si ale budeme chcieť zvoliť, ktorú operáciu chceme. Bez switch by sme napísali kód podobný tomuto:

                    Klikni pre editáciu
                    • cout << "Vitajte v kalkulačke" << endl;
                      cout << "Zadajte prvni cislo:" << endl;
                      float a;
                      cin >> a;
                      cout << "Zadajte druhe cislo:" << endl;
                      float b;
                      cin >> b;
                      cout << "Zvoľte si operáciu:" << endl;
                      cout << "1 - sčítanie" << endl;
                      cout << "2 - odčítanie" << endl;
                      cout << "3 - násobenie" << endl;
                      cout << "4 - delenie" << endl;
                      int volba;
                      cin >> volba;
                      float vysledek = 0;
                      if (volba == 1)
                          vysledek = a + b;
                      else if (volba == 2)
                          vysledek = a - b;
                      else if (volba == 3)
                          vysledek = a * b;
                      else if (volba == 4)
                          vysledek = a / b;
                      if ((volba > 0) && (volba < 5))
                          cout << "Vysledok: " << vysledek << endl;
                      else
                          cout << "Neplatný voľba" << endl;
                      cout << "Dekuji za použitia kalkulačky, aplikáciu ukončíme ľubovoľného klávesu." << endl;
                      cin.get(); cin.get();
                      
                      • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                      výsledok:

                      Konzolová aplikácia
                      Vitajte v kalkulačke
                      Zadajte prvni cislo:
                      18
                      Zadajte druhe cislo:
                      9
                      Zvoľte si operáciu:
                      1 - sčítanie
                      2 - odčítanie
                      3 - násobenie
                      4 - delenie
                      4
                      Vysledok:2
                      Dekuji za použitia kalkulačky, aplikáciu ukončíme ľubovoľného klávesu.

                      Všimnite si, že sme premennú vysledek deklarovali na začiatku, len tak do nej môžeme potom priraďovať. Keby sme ju deklarovali u každého priradenie, na konci podmienok by už neexistovala (existovala by len do skončenia bloku príkazov za if, my máme miesto bloku príkazov len 1 príkaz, takže by zanikla ihneď po jeho vykonaní). Bohužiaľ C ++ nie je schopný poznať, či je do premennej vysledek naozaj priradená nejaká hodnota. Z tohto dôvodu na začiatku dosadíme do vysledek nulu.

                      Ďalšia vychytávka je kontrola správnosti voľby. Program by v tomto prípade fungoval rovnako aj bez tých else, ale načo sa ďalej pýtať, keď už máme výsledok.

                      Teraz si skúsime napísať ten istý kód pomocou switch. Navyše k nemu ale pridáme užitočný riadok kódu. Nie je práve pekné vypisovať len znaky bez diakritiky. Preto zapneme podporu slovenských znakov. To robí funkcie setlocale() zo knižnice clocale.

                      Klikni pre editáciu
                      • cout << "Vitajte v kalkulačke" << endl;
                        cout << "Zadajte prvni cislo:" << endl;
                        float a;
                        cin >> a;
                        cout << "Zadajte druhe cislo:" << endl;
                        float b;
                        cin >> b;
                        cout << "Zvoľte si operáciu:" << endl;
                        cout << "1 - sčítanie" << endl;
                        cout << "2 - odčítanie" << endl;
                        cout << "3 - násobenie" << endl;
                        cout << "4 - delenie" << endl;
                        int volba;
                        cin >> volba;
                        float vysledek = 0.0f;
                        switch(volba)
                        {
                            case 1:
                                vysledek = a + b;
                                break;
                            case 2:
                                vysledek = a - b;
                                break;
                            case 3:
                                vysledek = a * b;
                                break;
                            case 4:
                                vysledek = a / b;
                                break;
                        }
                        if ((volba > 0) && (volba < 5))
                            cout << "Vysledok:" << vysledek << endl;
                        else
                            cout << "Neplatný voľba" << endl;
                        cout << "Dekuji za použitia kalkulačky, aplikáciu ukončíme ľubovoľného klávesu." << endl;
                        cin.get();cin.get();
                        
                        • Skontroluj, či výstupy programu zodpovedajú predlohe. S inými textami testy neprejdú.

                        Vidíme, že kód je trochu prehľadnejšie. Ak by sme potrebovali v nejakej vetve switch spustiť viac príkazov, prekvapivo ich nebudeme písať do bloku, ale rovno pod seba. Blok {} nám tu nahrádza príkaz break, ktorý spôsobí vyskočeniu z celého switch. Blok switch môže namiesto case x: obsahovať ešte možnosť default:, ktorá sa vykoná v prípade, že nebude platiť žiadny case. Je len na vás, či budete switch používať, všeobecne sa oplatí len pri väčšom množstve príkazov a vždy ide nahradiť sekvencií if a else. Nezabúdajte na príkazy break, ak ho neuvediete, program prepadne do ďalšej vetvy a to aj keď by nebola splnená podmienka! V minulosti sa takéto prepadávaniu využívalo schválne, dnešný IDE pred týmto použitím ale skôr už varujú.

                        To by sme mali. V budúcej lekcii, Řešené úlohy ku 4.-5. lekciu C ++ , nás čakajú polia a cykly, tým dovŕšite základné znalosti, máte sa na čo tešiť :)

                        V nasledujúcom cvičení, Řešené úlohy ku 4.-5. lekciu C ++, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


                         

                        Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

                        Stiahnuť

                        Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

                        Stiahnuté 332x (8.14 kB)
                        Aplikácia je vrátane zdrojových kódov v jazyku C++

                         

                        Ako sa ti páči článok?
                        Pred uložením hodnotenia, popíš prosím autorovi, čo je zleZnakov 0 z 50-500
                        Predchádzajúci článok
                        Kvíz - C++, konzola a premenné
                        Všetky články v sekcii
                        Základné konštrukcie jazyka C ++
                        Preskočiť článok
                        (neodporúčame)
                        Řešené úlohy ku 4.-5. lekciu C ++
                        Článok pre vás napísal Zdeněk Pavlátka
                        Avatar
                        Užívateľské hodnotenie:
                        3 hlasov
                        Autor se věnuje spoustě zajímavých věcí ze světa informatiky a grafiky
                        Aktivity