Rozhodování
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