9. Vícenásobné větvení

Příkaz se hodí zejména, pokud se rozhodujeme mezi dvěma možnostmi. Pokud máme na výběr z většího počtu možností, jako v předchozím zdrojovém kódu algoritmu KalkulackaKaskadovani (viz kapitola Kaskádování), kde jsme zvolili kaskádové členění podmínek za pomoci příkazu else if. Další možností, jak zvýšit přehlednost a čitelnost je použití příkazu switch. Tento příkaz nahrazuje příliš členité rozdělení podmínek. Obecná syntaxe tohoto příkazu v jazyce C# vypadá následovně:

switch (řídícíVýraz)
{
	case konstanta1:
			příkazy;
                        break;
	case konstanta2:
			příkazy;
			break;

               // … další větve case konstantaX
	default:
		příkazy;
		break;
}

kde:

  • switch - klíčové slovo uvozující vícenásobné větvení
  • řídícíVýraz - představuje datový typ jako celočíselný, znak, výčtový, textový řetězec nebo logická hodnota, který bude vyhodnocen pouze jednou a pak budou spuštěny příkazy za klíčovým slovem case
  • case - testování, zda hodnota řídícího výrazu odpovídá specifikované konstantě konstanta1
  • konstanta1 - specifikovaná konstanta pro první sekci. Datový typ konstant uvedených v jednotlivých sekcích (case konstantaX) – tzv. návěštích, musí odpovídat datovému typu řídícího výrazu. Konstanta se v žádném návěští nesmí opakovat
  • break - klíčové slovo ukončující část příkazů uvedených za návěštími (v jednotlivých sekcích). Pokud bude dosaženo klíčového slova break, je ukončení provádění bloku switch. Tento příkaz lze nahradit příkazem return, nebo goto – příkaz skoku na určité místo v programu
  • default - pokud ani jedna hodnota z konstant uvedených v návěštích neodpovídá hodnotě řídícího výrazu, budou provedeny příkazy za příkazem default. Část default je volitelná, tzn., že není povinná

Každý příkaz switch musí splňovat následující pravidla:

  • V řídícím výrazu lze použít jen primitivní datové typy např. int, string (více o datových typech se dozvíte později). U jiných datových typů např. float a double je nutné použít příkaz if
  • Návěští case musí obsahovat konstantní výrazy (hodnoty nelze počítat dynamicky za běhu programu), jinak se musí použít příkaz if
  • Hodnoty návěští case musí být jedinečné
  • V případě potřeby lze spustit jednu skupinu příkazů pro několik návěští tak, že uvedeme několik návěští pod sebou (mezi návěštími v tomto případě nesmí být žádné příkazy). Kód uvedený za posledním z těchto návěští bude spuštěn, bude-li mít řídícíVýraz hodnotu libovolného návěští z celého uvedeného seznamu. Následuje-li však za návěštím alespoň jeden příkaz a není-li tato skupina ukončena příkazem break (nebo jiným z příkazů pro přenos řízení – např. return, goto), ohlásí kompilátor chybu [6]

Ilustrativní příklad KalkulackaVicenasobneVetveni

Algoritmus KalkulackaVicenasobneVetveni

  • Popis: Vývojový diagram pro řešení aritmetických operací u dvou zadaných čísel - vícenásobné větvení
  • Zadání: Zkuste navrhnout v hlavním programu algoritmus KalkulackaVicenasobneVetveni, 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í vícenásobného větvení proměnné kod. Výsledek aritmetické operace vypište v hlavním programu

Na základě vývojového diagramu KalkulackaVicenasobneVetveni vytvoříme v konzolové aplikaci program, na kterém si vysvětlíme princip vícenásobného větvení. Vývojový diagram algoritmu KalkulackaVicenasobneVetveni byl vytvořen v aplikaci Visio s použitím dodatečně vytvořených vlastních značek deklarace proměnných, které využíváme v aplikaci Flowgorithm.

Program KalkulackaVicenasobneVetveni

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

Začátek zdrojového kódu je stejný jako v předchozím případě kaskádování algoritmu KalkulackaKaskadovani. Rozdíl spočívá v použití switch pro přehlednějšího členění jednotlivých aritmetických operací umístěných za jednotlivými návěštími – viz Kód 1. V těle switch je také definována větev default, které obsahuje příkazy, které jsou prováděny tehdy, pokud uživatele zadal jinou než povolenou hodnotu číselného kódu operace. 

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());
    //Přepnutí do příslušné sekce podle hodnoty 'kod'
    switch (kod)
    {
        //Operace sečtení
        case 1:
            //Sečtení dvou zadaných čísel
            c = a + b;
            //Ukončení sekce pro kod == 1
            break;
        //Operace odečtení
        case 2:
            //Odečtení dvou zadaných čísel
            c = a - b;
            break;
        //Operace násobení
        case 3:
            //Násobení dvou zadaných čísel
            c = a * b;
            break;
        //Operace dělení
        case 4:
            //Podíl dvou zadaných čísel
            c = a / b;
            break;
        //Zadání špatného číselného kódu operace
        default:
            //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 KalkulackaVicenasobneVetveni – příklad vícenásobného větvení

Na základě výpisu v konzoli vidíme, jak by vypadal případ odečtení dvou reálných čísel pomocí programu KalkulackaVicenasobneVetveni spuštěného v hlavní metodě Main – viz Výstup programu - Kód 1.

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

Výstup programu 1: Ukázka výsledku programu KalkulackaVicenasobneVetveni