8. Kaskádování

Příkazy if se dají vnořit do jiných příkazů if. Takto je možné zřetězit posloupnost logických výrazů, které budou postupně vyhodnocovány, dokud jeden z nich nenabyde hodnoty true. [6]

Tomuto principu se říká kaskádování (anglicky – „Cascading“). Jedná se o podmíněné vykonání části kódu definované pro zápornou větev else. Pro tento účel se využívá příkaz else if. K příkazu if můžeme definovat libovolný počet těchto příkazů else if a žádný nebo maximálně jeden příkaz else. Syntaxe takového výrazu může být např.:

if (logickýVýraz1) 
	příkaz1;
else if (logickýVýraz2) 
	příkaz2; 
else if (logickýVýraz3) 
	příkaz3;

//… další else if (logickýVýrazX)

else
	příkazN;

kde:

  • if - klíčové slovo pro specifikaci prvního rozhodování
  • logickýVýraz1 - představuje první podmínku rozhodování 
  • příkaz1 - příkaz (nebo složený příkaz, tj. blok příkazů), který je proveden, je-li logickýVýraz1  vyhodnocen jako true
  • else - větev, která je vykonána, pokud logickýVýraz1 je vyhodnocen jako false
  • if (logickýVýraz2) - představuje další testované rozhodování se specifikací podmínky testování logickýVýraz2 
  • příkaz2 - příkaz (nebo složený příkaz, tj. blok příkazů), který je proveden, je-li logickýVýraz1  vyhodnocen jako false a logickýVýraz2 je vyhodnocen jako true
  • else if (logickýVýraz3) - stejný princip jako u else if (logickýVýraz2)
  • else - větev, která je vykonána, pokud byly všechny předchozí logické výrazy vyhodnoceny jako false
  • příkazN - poslední příkaz (nebo složený příkaz, tj. blok příkazů), který je proveden, pokud byly všechny předchozí logické výrazy vyhodnoceny jako false

Pokud potřebujeme provést ve větvi více příkazů, tyto příkazy uzavřeme do složených závorek { }, tj. využijeme složený příkaz. 

Ilustrativní příklad KalkulackaKaskadovani

Algoritmus KalkulackaKaskadovani
  • Popis: Vývojový diagram pro řešení aritmetických operací u dvou zadaných čísel - kaskádování
  • Zadání: Zkuste navrhnout v hlavním programu algoritmus KalkulackaKaskadovani, který řeší základní aritmetické operace podle zadaného číselného kódu (1 … sčítání, 2 … odečítání, 3 … násobení a 4 … dělení) u dvou uživatelem zadaných čísel a a b. Rozhodování o provedení aritmetické operace bude provedeno pomocí vnořeného větvení v rozhodovacích blocích na základě proměnné kod. Výsledek aritmetické operace vypište v hlavním programu

Na základě vývojového diagramu KalkulackaKaskadovani vytvoříme v konzolové aplikaci program, na kterém si vysvětlíme princip kaskádování - vnoření bloků if do jiných příkazů if. Je také důležité zdůraznit, že v algoritmu nejsou ošetřeny možné chyby, které mohou nastat, např. dělení nulou, atd. 

Program KalkulackaKaskadovani

  • Popis: Hlavní metoda pro řešení aritmetických operací u dvou zadaných čísel - kaskádování 
  • Zadání: Vymyslete, jak byste v C# naprogramovali hlavní metodu programu KalkulackaKaskadovani jako konzolovou aplikaci
  • Řešení: Bude postupně probráno v následujícím textu

Pokud jste překopírovali zdrojový kód z aplikace Flowgorithm, asi jste byli překvapeni výpisem chyby: "Use of unassigned local variable 'c'." Tento výpis nás upozorňuje, že ve zdrojovém kódu není ošetřen případ výpisu výsledku výpočtu uložený v proměnné c, když by uživatel zadal nepovolený číselný kód aritmetické operace, např. 5. Tuto chybu lze napravit tak, že za výpis chyby "Zadali jste špatný číselný kód!", v případě zadání špatného kódu operace, umístíme příkaz return. Všimněte si použití příkazu return, kde neuvádíme žádný argument (nebude žádný návrat výsledku). Tento příkaz nám opustí právě vykonávanou metodu (v tomto případě, hlavní metodu). Díky tomu už nebude proveden výpis vypočteného výsledku aritmetické operace, který ani vypočten nebyl - viz Kód 1.

V aplikaci Flowgorithm bylo možné deklarovat obě zadávaná čísla jako Integer, ale pokud jste si zkopírovali vygenerovaný kód v C# z této aplikace, zjistili jste, že u aritmetické operace dělení bylo provedeno tzv. přetypování - konverze datového typu na jiný datový typ. V našem případě se jednalo o konverzi na datový typ double. Poněvadž se konverzí budeme zabývat v pozdější kapitole tohoto kurzu, nyní budeme deklarovat proměnné a, b a c jako datový typ double - reálné číslo.  Pokud bychom v C# deklarovali a a b jako typ int (Integer), aritmetická operace dělení by prováděla celočíselné dělení a poskytovala by jako výsledek výpočtu celé číslo namísto reálného čísla. 

Pojďme dále prozkoumat mírně upravený zdrojový kód programu KalkulackaKaskadovani. Úprava znamenala odstranění přebytečných závorek ve větvích else, které znamenali složený příkaz. V každém rozhodovacím bloku týkající se testování číselného kódu aritmetické operace je větvích else (ve vývojovém diagramu tyto větve představují větve False) umístěn pouze jeden vnořený if a ne více příkazů. 

Závěrečný else nám představuje variantu číselného kódu, která byla zadána špatně (mimo platný rozsah).  Pokud Vás napadlo, že testování číselného kódu operace jsme mohli provést před zadáním obou čísel, na nichž mají být provedeny aritmetické operace, tak Vám gratuluji. Je vhodné uživatele oprostit od zbytečného zadávání dat, když ve finále tyto vstupy nebudou využity.

Dále jsme ve zdrojovém kódu, oproti kódu generovaného pomocí Flowgorithm, nahradili statickou metodu readValue, která je generována aplikaci Flowgorithm. Tuto metodu jsme nahradili konverzemi u jednotlivých datových typů int.Parse.

Ve vývojovém diagramu nezaznamenáváme příkaz Console.ReadKey(), který čeká na stisk nějaké klávesy, abychom si mohli přečíst výpis a došlo k ukončení algoritmu!

static void Main(string[] args)
{
    /*Deklarace proměnných: 'kod' ... celočíselný kód aritmetické operace, 
     * 'a' ... první zadané číslo, 'b' ... druhé zadané číslo; 
     * 'c' ... výsledek aritmetické operace*/
    int kod;
    double a, b, c;
    //Výpis výzvy k zadání operace
    Console.Write("Zadejte kód operace (1 ... sčítání, 2 ... odečítání, " +
        "3 ... násobení, 4 ... dělení): ");
    //Načtení kódu operace
    kod = int.Parse(Console.ReadLine());
    //Výpis výzvy k zadání prvního čísla
    Console.Write("Zadejte A: ");
    //Načtení prvního zadaného čísla
    a = double.Parse(Console.ReadLine());
    //Výpis výzvy k zadání druhého čísla
    Console.Write("Zadejte B: ");
    //Načtení druhého zadaného čísla
    b = double.Parse(Console.ReadLine());
    //Operace sčítání
    if (kod == 1)
        //Sečtení dvou zadaných čísel
        c = a + b;
    //Operace odečtení
    else if (kod == 2)
        //Odečtení dvou zadaných čísel
        c = a - b;
    //Operace násobení
    else if (kod == 3)
        //Násobení dvou zadaných čísel
        c = a * b;
    //Operace dělení
    else if (kod == 4)
        //Podíl dvou zadaných čísel
        c = a / b;
    //Zadání špatného číselného kódu operace
    else
    {
        //Výpis chyby v zadávání kódu
        Console.WriteLine("Zadali jste špatný číselný kód!");
        //Zamezení provádění dalších příkazů - opuštění metody
        return;
    }
    //Výpis textu s hodnotou výsledku
    Console.WriteLine("Výsledek C: {0}", c);
 
    //Čekání na stisk klávesy -> Ukončení programu
    Console.ReadKey();
}

Kód 1: Kód těla hlavní metody programu Kalkulacka – příklad kaskádového příkazu else if a vnořeného rozhodovacího bloku

Na základě výpisu v konzole vidíme, jak by mohl vypadat případ sečtení dvou čísel pomocí metody hlavní metody Main – viz Výstup programu 1 - Kód 1. 

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 1
Zadejte A: 7
Zadejte B: 5
Výsledek C: 12

Výstup programu 1 - Kód 1: Ukázka výsledku - součet

Zkusme si otestovat dělení dvou čísel – viz Výstup programu 2 - Kód 1: Ukázka výsledku - dělení.

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 4 
Zadejte A: 7 
Zadejte B: 5 
Výsledek C: 1,4

Výstup programu 2 - Kód 1: Ukázka výsledku - dělení

A nyní zkusíme trochu škodit a otestovat funkčnost naší aplikace. Nastavme hodnotu číselného kódu aritmetické operace mimo povolené meze – viz Výstup programu 3 - Kód 1.

Zadejte kód operace (1 ... sčítání, 2 ... odečítání, 3 ... násobení, 4 ... dělení): 5 
Zadejte A: 7 
Zadejte B: 5 
Zadali jste špatný číselný kód!

Výstup programu 3 - Kód 1: Ukázka výsledku - chybný číselný kód aritmetické operace