Rozhodování
6. Logické a relační operátory
Pro vytváření výrazů využíváme logické operátory – viz Tabulka 1.
|
Operátor | Operace | Příklad |
|
&& |
Logický součin – konjunkce (klávesová zkratka na české klávesnici: Alt+38 … nebo … AltGr+C) |
((x < y) && (y < z)) |
|
|| |
Logický součet – disjunkce (klávesová zkratka na české klávesnici: Alt+124 … nebo … AltGr+w) |
((x < y) || (y < z))
|
|
! |
Negace |
! (x > y) |
Následující tabulka obsahuje možné hodnoty, kterých může nabývat logická proměnná– true, tj. pravda vs false, tj. nepravda - viz Tabulka 2. Ve sloupcích jsou umístěny logické a relační operátory, jejichž aplikací na hodnoty těchto proměnných získáme výsledek. Pro zjednodušení si představte namísto false hodnotu 0 a namísto true hodnotu 1. Pak již u operátoru && stačí násobit (logický součin – konjunkce) nebo v případě || hodnoty sčítat (logický součet – disjunkce – pozor 1 + 1 je v tomto případě 1. Hodnota totiž může být 0 nebo 1). Poslední sloupec v tabulce znázorňuje porovnání hodnot dvou logických proměnných. V C# lze pro relační operace použít porovnání metoda CompareTo, která navrací celočíselnou hodnotu výsledku.
|
x | y | x && y | x || y | ! (x) | x == y | x <= y |
false |
false |
false |
false |
true |
true |
true |
|
false |
true |
false |
true |
true |
false |
true |
|
true |
false |
false |
true |
false |
false |
false |
|
true |
true |
true |
true |
false |
true |
true |
Tabulka 2: Logické a relační operátory
Je také vhodné zmínit zajímavou vlastnost označovanou jako zkrácené vyhodnocení (anglicky „Short Circuiting“) logického operátoru && pro konjunkci (logický součin), nebo česky řečeno operátoru „a zároveň“. Pokud jsou tímto operátorem spojeny dva operandy např. podmínky, není zapotřebí vyhodnocovat obě, protože pokud je levá podmínka vyhodnocena jako false, je celý výsledek těchto dvou podmínek false, bez ohledu na pravou podmínku. Uveďme příklad:
Stejná vlastnost platí i pro logický operátor disjunkce (logického součtu), neboli operátoru „nebo“. Pokud je použit operátor || spojující dva operandy a levý operand např. podmínka má hodnotu true, pak je výsledek celého výrazu true nezávisle na hodnotě pravé podmínky.
Z předchozích tvrzení si logicky odvodíme, že už není zapotřebí vyhodnocovat pravý operand. Pokud tedy použijete logické operátory a chcete se vyhnout zbytečnému vyhodnocování logických výrazů, umísťujte na levou stranu podmínkového logického operátoru jednoduše a rychle vyhodnotitelné logické výrazy a na pravou stranu ty složitější. [6]
Ilustrativní příklad LogickySoucin
Algoritmus LogickySoucin
- Popis: Vývojový diagram s použitím logických a relačních operátorů
- Zadání: Zkuste vymyslet, jak byste zaznamenali v hlavním programu příklad úplného větvení příkazu if. Deklaruje tři celočíselné lokální proměnné x a y a z. Proměnným přiřaďte následující hodnoty: x = 2, y = 3 a z = 4. Deklarujte také logickou proměnnou boolPromenna. Pokud platí že x < y a zároveň y < z pak do logické proměnné uložte hodnotu true. V opačném případě do logické proměnné uložte hodnotu false.
Rozhodovací blok v algoritmu obsahuje logický výraz (testovanou podmínku, která se skládá ze dvou částí). První část logické výrazu (x < y) v rozhodovacím bloku je splněna, tj. (2 < 3). Zároveň také došlo ke splnění druhé části logického výrazu (y < z), tj. (3 < 4). Protože první část logického výrazu nabyla hodnoty true a zároveň druhá část výrazu také nabyla hodnoty true, logický součin ve formě operátoru && navrací výsledek true (můžeme si představit aritmetickou operaci 1 * 1 = 1). Musí být tedy vykonán přiřazovací příkaz umístěný ve větvi True. Po přiřazení hodnoty logické proměnné následně dojde k vypsání její hodnoty, tedy true.
Program LogickySoucin
- Popis: Zdrojový kód úplného větvení s použitím logických a relačních operátorů
- Zadání: Vymyslete, jak byste v C# naprogramovali v hlavní metodě Main algoritmus LogickySoucin jako konzolovou aplikaci
- Řešení: Bude postupně probráno v následujícím textu
V následujícím kódu jsou použity 3 celočíselné proměnné a
jedna logická proměnná datového typu bool
– viz Kód 1.
Z příkazu if vycházejí dvě větve.
Pokud složená podmínka platí, pak se provede v kódu příkaz pod podmínkou. Pokud
podmínka neplatí, provede se kód za else.
Uvnitř podmínky jsme použili operátor logického součinu &&, kde musí platit zároveň obě definované části logického výrazu.
static void Main(string[] args) { //Deklarace celočíselné proměnné včetně inicializace int x = 2; //Deklarace celočíselné proměnné včetně inicializace int y = 3; //Deklarace celočíselné proměnné včetně inicializace int z = 4; //Deklarace logické proměnné bool boolPromenna; //Rozhodovací podmínka - platí tvrzení? if ((x < y) && (y < z)) //Přiřazení hodnoty logické proměnné - pravda boolPromenna = true; else //Přiřazení hodnoty logické proměnné - nepravda boolPromenna = false; //Výpis výsledné hodnoty logické proměnné Console.WriteLine("Výsledek je: {0}", boolPromenna); //Čekání na stisk klávesy -> ukončení programu Console.ReadKey(); }
Kód 1: Příklad logického součinu
Na následujícím výpisu v konzoli vidíme výsledek rozhodování – viz Výstup programu - Kód 1.
Výsledek je: True
Výstup programu - Kód 1: Ukázka výsledku u příkladu logického součinu