V předchozím díle jsme se naučili pracovat s proměnnými, dnes nás čekají podmínky. Nejprve se ale podíváme na to, co jsou relační operátory, neboť v podmínkách se s nimi setkáme.
Relační operátory se používají, chceme-li určit, zda jsou si dvě čísla rovna nebo jestli je jedno větší či menší než druhé. Každý příkaz, obsahující relační operátor, se vyhodnotí buď jako pravdivý nebo nepravdivý. Relačních operátorů je šest, konkrétně rovná se, menší než, menší nebo rovno, větší než, větší nebo rovno a nerovná se. Viz následující tabulka:
Název | Operátor |
Rovná se | == |
Menší než | < |
Menší nebo rovno | <= |
Větší než | > |
Větší nebo rovno | >= |
Nerovná se | != |
Dáte mi jistě za pravdu, že něco podobného znáte z matematiky. Dovolím si však upozornit na operátor rovná se, neboť si všimněte, že jde o dva znaky rovná se vedle sebe ( == ). Začátečníci si často pletou operátor přiřazení ( = ) s relačním operátorem rovná se ( == ). Díky tomu může v programu dojít k nepříjemným chybám. Pokud tedy například chceme do proměnné přiřadit hodnotu, použijeme operátor přiřazení. Chceme-li porovnat dvě čísla, je nutné použít relační operátor rovná se. Žádnou jinou záludnost však v relačních operátorech nehledejte. Nyní jsme připraveni naučit se podmínky, tedy příkaz if.
Příkaz if
Příkaz if nám umožňuje v programu otestovat nějakou podmínku (například, zda je číslo a větší než číslo b, apod.) a na základě vyhodnocení této podmínky můžeme poté rozvětvit kód. Jednoduchá ukázka příkazu if může vypadat třeba takto:
if (a < b)
cout << "Cislo 'a' je mensi.\n";
Výraz v závorce může být libovolný, ve velké většině případů se ale jedná o výraz obsahující relační operátor, jako je tomu i v tomto případě. Má-li výraz hodnotu nepravda, příkaz se neprovede, v opačném případě se provede. Z ukázky kódu nelze určit, jakou hodnotu výraz má, neboť neznáme hodnoty proměnných. Pokud by ale například proměnná a měla hodnotu 3 a proměnná b 7, výraz by byl vyhodnocen jako pravdivý a na obrazovku by se vypsalo Cislo ‘a’ je mensi.
Kdybychom chtěli provést více příkazů při splnění podmínky, je nutné je uzavřít do složených závorek.
if (a < b)
{
// příkaz 1
// příkaz 2
// příkaz 3
}
/* POZOR! Příkaz na tomto místě by se provedl vždy -
není už ve složených závorkách a proto se k podmínce nevztahuje */
Napsání podmínky tedy není nic složitého – napíšeme klíčové slovo if, za něj do kulatých závorek výraz, který se má vyhodnotit a pak do složených závorek příkazy, které se mají provést, pokud se výraz vyhodnotí jako pravdivý.
Klauzule else
Zatím jsme si ukázali, jak provést nějaké příkazy, pokud je výraz pravdivý. Často však potřebujeme větvit program do dvou směrů. Jinak řečeno, pokud je podmínka splněna, provedou se jiné příkazy než při jejím nesplnění. K tomu nám poslouží klíčové slovo else.
if (a < b)
{
cout << "Cislo 'a' je mensi nez cislo 'b'.\n";
cout << "Podminka je splnena.\n";
}
else
{
cout << "Cislo 'a' neni mensi nez cislo 'b'\n";
cout << "Podminka neni splnena.\n";
}
Na ukázce je vidět, jak else používat. Pokud bychom u else měli jen jeden příkaz, nemuseli bychom používat složené závorky, stejně jako je tomu u if. Dále si všimněte stylu odsazení – mě se tento způsob odsazování jeví jako nejlepší, neboť je hned vidět, co se stane při splnění nebo nesplnění podmínky.
Pokud nám nepostačí ani dva směry větvení programu, můžeme použít ještě else if. To lze použít teoreticky nekonečněkrát. Na následující ukázce pochopíte.
if (a == 0)
{
cout << "Cislo 'a' je nula.\n";
}
else if (a == 1)
{
cout << "Cislo 'a' je jedna.\n";
}
else if (a == 2)
{
cout << "Cislo 'a' je dva.\n";
}
else
{
cout << "Cislo 'a' neni nula, jedna, ani dva.\n";
}
Pokud tedy proměnná a má hodnotu 0, 1 nebo 2, vypíše se patřičný text. Jinak (else) se vypíše Cislo ‘a’ neni nula, jedna, ani dva. Else if můžete napsat kolikrát chcete, někdo ale v těchto případech dává přednost použití switch, ke kterému se dostaneme za chvíli. Dále si v ukázce všimněte, že porovnáváme čísla, proto používáme relační operátor rovná se ( == ).
Složitější podmínky
Podmínky lze i všelijak kombinovat, lze tedy vytvořit vnořené příkazy if. Může se jednat například o takovýto kód:
if (a == b)
{
if (c == d)
{
// nějaké příkazy
}
else if (c > d)
{
// jiné příkazy
}
else
{
if (a > d)
{
// zase jiný příkaz
}
else
{
// už zase nějaký příkaz
}
}
}
else
{
// opět nějaký příkaz
}
Takovýmto způsobem byste mohli vytvořit velkou spoustu vnořených příkazů if. Kdo by se v tom poté vyznal je věc druhá. Kompilátoru by to samozřejmě nevadilo, člověk by se ale při luštění kódu mohl trochu “zapotit”. Proto je dobré vždy dobře předem rozmyslet, jak podmínky napsat tak, aby splnily svůj účel, zároveň aby však byly člověku srozumitelné.
Logické operátory
Často můžeme v podmínce chtít položit více než jednu otázku, čili chceme vyhodnotit dva nebo více výrazů. Mezi tyto výrazy umisťujeme logické operátory, v jazyce C++ jsou to logické AND, OR a NOT. Možná jste se s něčím podobným potkali v matematice, tuším že se tomu říká výroková logika.
Logické AND (a zároveň, a současně)
Tento operátor vyhodnocuje výrazy a jestliže platí všechny současně, pak je celý výraz také pravdivý. Máte-li tedy peníze a současně je otevřeno v restauraci, můžete se jít najíst. V jazyce C++ se tento operátor zapisuje &&. Viz následují část kódu.
if ((a == 3) && (b == 4))
cout << "'a' je tri a zaroven 'b' je ctyri.\n";
else
cout << "Podminka nebyla splnena.\n";
Pokud bude proměnná a mít hodnotu 3 a proměnná b hodnotu 4, podmínka bude splněna. Vidíte, že opět žádná složitá věc to není.
Logické OR (nebo)
Logické OR vyhodnocuje výrazy a platí li alespoň jeden z nich, podmínka bude splněna. Máte-li tedy kreditní kartu nebo peníze v hotovosti, můžete si něco koupit. Pokud máte obojí, je to také v pořádku. Tento operátor napíšeme takto: ||.
if ((a == 3) || (b == 3))
cout << "Jedna z promennych ma hodnotu 3. A mozna ze obe.\n";
else
cout << "Podminka nebyla splnena.\n";
Ke splnění podmínky stačí aby jedna z proměnných měla hodnotu 3. Pokud by ani jedna neměla hodnotu 3, podmínka by splněna nebyla.
Logické NOT (ne)
Logický výraz NOT se vyhodnotí jako pravdivý, je-li testovaný výraz nepravdivý. Tento operátor zapisujeme pomocí vykřičníku.
if (!(a == 2))
cout << "'a' NEMA hodnotu 2.\n";
else
cout << "'a' MA hodnotu 2.\n";
V dalších dílech, až budeme společně programovat něco zajímavějšího, se s těmito operátory ještě setkáme, takže pokud Vám teď nejsou stoprocentně jasné, nemusíte se bát. V praxi zbytek pochopíte.
Příkaz switch
Příkaz switch nám umožňuje větvení podle více hodnot. Jak se příkaz používá si ukážeme na krátkém příkladě.
#include <iostream>
using namespace std;
int main()
{
int znamka;
cout << "Jakou znamku jsi dostal ve skole? ";
cin >> znamka;
switch (znamka)
{
case 1:
cout << "Vyborne. Jsi velmi chytry.\n";
break;
case 2:
cout << "Chvalitebne. Je to dobre, skoda ze to neni jednicka.\n";
break;
case 3:
cout << "Dobry. No, priste se vice snaz.\n";
break;
case 4:
cout << "Dostatecne. Davej pozor, aby si nepropadl.\n";
break;
case 5:
cout << "Nedostatecne. Hned se jdi ucit!\n";
break;
default:
cout << "Nelzi, takova znamka ve skole neni.\n";
}
return 0;
}
Jde o program, který podle známky ve škole vypíše nějaký text. Program tedy očekává číslo (tj. známka), které se předá příkazu switch. V případě zadání celého čísla v rozmezí 1 až 5 se vypíše patřičný text a poté se příkazem break ukončí switch. Pokud bude zadána známka, která se ve škole nedává (např. 6), vypíše se Nelzi, takova znamka se ve skole nedava, program tedy skočí k příkazu default, který ale není povinný. Kdybychom jej v našem kódu smazali a zadali známku 6, nic by se nevypsalo. U jednotlivých možností (case 1, case 2 …) je nutné napsat příkaz break, čímž zamezíme provedení příkazu default. Kdybychom příkaz break nepsali, tak například při zadání známky 3 by se vypsalo Dobry. No, priste se vice snaz. Vypsalo by se ale taktéž Nelzi, takova znamka ve skole neni.
Celý tento program by bylo možné přepsat pomocí příkazu if a else if. Je na Vás, jakou možnost budete používat, mě se více líbí switch.
Program – sleva při nákupu
Stejně jako v minulém díle, tak i dnes si na závěr napíšeme jednoduchý program, na kterém si procvičíme to, co jsme se naučili. Příkaz switch jsme si ukázali na předchozím příkladě, proto se nyní bude jednat o příklad s jednoduchou podmínkou if.
Našim cílem bude napsat program, který vypočítá cenu nákupu. Cena se vypočítá jako počet zakoupených kusů x cena za kus. Koupí-li si ale zákazník více než tři kusy, cena za jeden kus se sníží o polovinu. Pro lepší pochopení mějme třeba zákazníka Pepu, který si koupí dva kusy zboží, kdy jeden kus stojí 43 Kč. Zaplatí tedy 2 x 43 = 86 Kč. Kdyby si ale Pepa koupil šest kusů, cena za kus by nebyla 43 Kč, ale 43 / 2 = 21,5 Kč. Zaplatil by tedy 6 x 21,5 = 129 Kč.
Pokud chcete, můžete si to nejprve zkusit sami, opět nejde o nic složitého. Pokud by se přeci jen vyskytl nějaký problém, zde je kód:
#include <iostream>
using namespace std;
int main()
{
int pocetKusu;
double cenaZaKus, vyslednaCena;
cout << "Zadejte pocet zakoupenych kusu: ";
cin >> pocetKusu;
cout << "Zadejte cenu za jeden kus: ";
cin >> cenaZaKus;
if (pocetKusu > 3)
{
// Cena se slevou
vyslednaCena = (cenaZaKus / 2) * pocetKusu;
}
else
{
// Cena bez slevy
vyslednaCena = cenaZaKus * pocetKusu;
}
cout << "Zakaznik zaplati " << vyslednaCena << " Kc.\n";
return 0;
}
Vidíme, že program se může zachovat dvěma způsoby. Jestliže je počet kusů větší než tři, cena se počítá jinak, než pokud je počet kusů menší než tři. Jde tedy o úplně jednoduchou podmínku. Program si můžete zkusit “vyšperkovat” třeba tím, že cena se bude ještě odvíjet od toho, jestli má zákazník členskou kartu, jestli nemá nějaký slevový kupón atd.
Tímto programem končí čtvrtý díl. Na závěr ještě uvádím krátký přehled, co nás čeká v několika následujících dílech.
- Pátý díl – Pole (co je to pole, inicializování polí, deklarování polí, vícerozměrná pole atd.)
- Šestý díl – Smyčky (for, while)
- Sedmý díl – Funkce
- Osmý díl – Ukazatele, neboli pointery
- Devátý díl – Doplnění některých informací, popis a implementace některých základních algoritmů
- Desátý díl – Úvod do OOP (objektově orientované programování)
Budu se snažit tento sled dodržet, může se však stát, že dojde k nějaké změně. Proto prosím neberte tento přehled jako zcela přesný a závazný.