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:
{CPP_CONSOLE}
if (15 > 5)
cout << "Pravda" << endl;
cout << "Program tu pokracuje dal" << endl;
cin.get();
{/CPP_CONSOLE}
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á:
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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 | ! |
==
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:
#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;
}
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:
- typ (hodnota)
- (Typ) hodnota
- (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:
#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;
}
if (a < 0)
cout << "Odmocnina zo záporného cisla neexistuje!" << endl;
cout << "Dekuji za zadani" << endl;
cin.get(); cin.get();
return 0;
}
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á:
#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;
}
else
cout << "Odmocnina zo záporného cisla neexistuje!" << endl;
cout << "Dekuji za zadani" << endl;
cin.get(); cin.get();
return 0;
}
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:
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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
.
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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 |
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
S tým si zatiaľ vystačíme, operátorov sa pomocou zátvoriek samozrejme dajú kombinovať.
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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:
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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
.
{CPP_CONSOLE}
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();
{/CPP_CONSOLE}
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é 328x (8.14 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C++