Statistika testů
K této kapitole
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Pro testování a jeho statistické vyhodnocení je nutné se přihlásit.


Celkem
Zodpovězených: 0
Správně: 0
Špatně: 0
Úspěšnost: 0%
Nezodpovězených: 0

Příkaz switch
Na tomto místě budeme demonstrovat, jak rozvětvit tok programu do více větví podle hodnoty určitého výrazu.
RNDr. Dušan Kovář, Ph.D.
26. prosince 2005
Počet návštěv: 19798

Příkaz switch umožňuje provést jednu z větví na základě vyhodnocení testovaného výrazu. Syntaxe příkazu switch ja následující:

switch (testovaný výraz)
{
   case hodnota1:
      // Tento blok příkazů se provede,
      // jestliže testovaný výraz nabývá hodnotu hodnota1.
      break;
   case hodnota2:
      // Tento blok příkazů se provede,
      // jestliže testovaný výraz nabývá hodnotu hodnota2.
      break;
   // ...
   default:
      // Tento blok příkazů se provede,
      // jestliže testovaný výraz nenabývá žádnou z předchozích hodnot.
      // Lze použít jako případ else.
      break;
}

Vyzkoušejme příkaz switch na programu, ve kterém uživatel odpovídá na otázku ano/ne. Nejdříve, předpokládejme, že může zadat pouze malé a (jako ano) nebo malé n (jako ne). Každá jiná hodnota upozorní uživatele, že jeho vstup není správný.

using System;

namespace PrikazSwitch.Priklad1
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         Console.WriteLine("Chcete skutečně ukončit aplikaci (a/n)?");
         string vstup = Console.ReadLine();

         switch (vstup)
         {
            case "a":
               Console.WriteLine("Nashledanou příště.");
               break;
            case "n":
               Console.WriteLine("Pokračujte.");
               break;
            default:
               Console.WriteLine("Neumíte odpovědět na otázku a/n?");
               break;
         }

         Console.ReadLine();
      }
   }
}

V tomto programu musí uživatel nutně zadat malé a nebo malé n, v opačném případě je znak považován za nesprávnou hodnotu. Buďme k uživateli vstřícnější a dovolme mu zadat a nebo n v jakékoliv velikosti. Příkaz switch nám v tom napomůže tím, že umožnuje napsat dva nebo více případů hodnot za sebou, jak je vidět na následujícím příkladu:

using System;

namespace PrikazSwitch.Priklad2
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         Console.WriteLine("Chcete skutečně ukončit aplikaci (a/n)?");
         string vstup = Console.ReadLine();

         switch (vstup)
         {
            case "a":
            case "A":
               Console.WriteLine("Nashledanou příště.");
               break;
            case "n":
            case "N":
               Console.WriteLine("Pokračujte.");
               break;
            default:
               Console.WriteLine("Neumíte odpovědět na otázku a/n?");
               break;
         }

         Console.ReadLine();
      }
   }
}

Tento příklad můžeme také napsat pomocí metody ToLower() typu string:

using System;

namespace PrikazSwitch.Priklad3
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         Console.WriteLine("Chcete skutečně ukončit aplikaci (a/n)?");
         string vstup = Console.ReadLine();

         switch (vstup.ToLower())
         {
            case "a":
               Console.WriteLine("Nashledanou příště.");
               break;
            case "n":
               Console.WriteLine("Pokračujte.");
               break;
            default:
               Console.WriteLine("Neumíte odpovědět na otázku a/n?");
               break;
         }

         Console.ReadLine();
      }
   }
}

Příkazy větvení lze vnořovat do sebe. Představme si příklad, ve kterém uživatel-student zadá známku z předmětu a pohlaví a program, na základě těchto informací, vypíše formátované hlášení. Jednak se větví podle známky a pro každou známku pak podle pohlaví. Program může vypadat následovně:

using System;

namespace PrikazSwitch.Priklad4
{
   class VstupniBodProgramu
   {
      static void Main()
      {
         Console.Write("Zadejte známku z matematiky: ");
         int znamka = int.Parse(Console.ReadLine());
         Console.Write("Zadejte pohlaví muž/žena: ");
         string pohlavi = Console.ReadLine();

         switch (znamka)
         {
            case 1:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, jste výborný.");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, jste výborná.");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví?");
               break;
            case 2:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, jste chvalitebný.");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, jste chvalitebná.");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví?");
               break;
            case 3:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, jste dobrý.");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, jste dobrá.");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví?");
               break;
            case 4:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, jste dostatečný!!");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, jste dostatečná!!");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví?");
               break;
            case 5:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, jste nedostatečný!!!");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, jste nedostatečná!!!");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví?");
               break;
            default:
               if (pohlavi == "muž")
                  Console.WriteLine("Mladíku, co jste to dostal?");
               else if (pohlavi == "žena")
                  Console.WriteLine("Slečno, co jste to dostala?");
               else
                  Console.WriteLine("Jaké to máte vlastně pohlaví? A co to je za známku? "
                     + "Já se v tom vůbec nevyznám.");
               break;
         }

         Console.ReadLine();
      }
   }
}

Takové vnořování však ubírá na přehlednosti a návrhu aplikace. Lepším návrhem zachycení aktuálního stavu se budeme zabývat později.

Příkaz switch můžeme v konzolových aplikacích využít k sejmutí parametrů na příkazovém řádku. V takovém případě musíme napsat jinou verzi metody Main a to s jedním parametrem, který bude tvořit pole parametrů z příkazového řádku:

using System;

namespace PrikazSwitch.Priklad5
{
   class VstupniBodProgramu
   {
      static void Main(string[] parametry)
      {
         // V poli parametry jsou jednotlivé parametry na příkazovém řádku
         // zadané za názvem spouťěcího souboru (souboru exe).
      }
   }
}

V následující aplikaci se na příkazovém řádku mohou napsat následující parametry:

  • -t (vypíše se čas)
  • -d (vypíše se datum)
using System;

namespace PrikazSwitch.Priklad6
{
   class VstupniBodProgramu
   {
      static void Main(string[] parametry)
      {
         // Jsou zadané parametry?
         if (parametry.Length != 0)
         {
            // Jsou!
            // Získáme první parametr:
            string parametr = parametry[0];
            string vypis;

            switch (parametr)
            {
               case "-t":
                  // Vypíšeme aktuální čas:
                  vypis = DateTime.Now.ToLongTimeString();
                  break;
               case "-d":
                  // Vypíšeme aktuální datum:
                  vypis = DateTime.Now.ToLongDateString();
                  break;
               default:
                  vypis = "Zadali jste chybný parametr.";
                  break;
            }
            
            Console.WriteLine(vypis);
            
            Console.ReadLine();
         }
      }
   }
}

Zde jsme použili třídu DateTime pro zjištění aktuálního času, resp. data. Napište na příkazovém řádku, příp. v nabídce Spustit, cestu k programu a dále Priklad6 -t. Na příkazový řádek se vypíše čas.

Příkaz switch se také velmi často používá v souvislosti s výčtovými typy. O výčtových typech se zmíníme později.



Úkoly ke kapitole "Příkaz switch"

Uživatel zadá znamení zvěrokruhu v českém jazyce, na velikosti písmen nezáleží. Program vypíše na příkazový řádek v jakých rozmezí leží den narození.

Napište program, který bude mít jeden parametr na příkazovém řádku, podle kterého program vypíše na příkazový řádek hlášení:

  • -t (vypíše se: "Tiskne se na tiskárně ...")
  • -d (vypíše se: "Zobrazuje se na monitoru ...")
Hodnocení kapitoly "Příkaz switch"
Oslovila vás tato kapitola?
Ohodnoťte její obsah počtem bodů od 1 (nejhorší) do 10 (nejlepší):
Průměrné hodnocení: 8,571428
Celkem hodnotilo 7 osob.
Jednotlivá hodnocení: 
Diskuze ke kapitole "Příkaz switch"

Napadá vás zajímavá otázka související s touto kapitolou?

Přidejte do diskuze
Zatím diskutovaná témata:

Krtečku ahoj [6666, 8.12.2016 13:14:49 ]  
Ahoj krtku
switch [Ultar, 8.3.2007 11:49:02 ]  
moze sa pre switch pouzit datovy typ string? v mojich programoch to nejde.. ??

Vyhledávání
Související kapitoly
Booleovské operátory
Operátory pro vytváření booleovských výrazů
Booleovský typ
Datový typ pro reprezentaci booleovské (dvouhodnotové) logiky.
Příkaz if
Ukážeme si, jak lze blok kódu provést pouze při vyplnění určité podmínky.
Příkaz if/else
Ukážeme si, jak lze v případě, že je splněna určitá podmínka, provést jeden blok kódu a v opačném případě jiný blok.
Příkaz if/else if/else
Zde si vysvětlíme, jak program rozdělit do více než dvou větví podle určitých podmínek.
Příkazy větvení
Uvedeme si přehled příkazů, pomocí nichž můžeme tok programu rozvětvit do několika větví.
Řízení toku programu
V této kapitole si ukážeme, jak lze tok programu rozvětvit do více větví a jak část kódu provádět opakovaně.
Přečtěte si knihu
C# Programujeme profesionálně
Robinson S., Allen K. S., Cornes O., Glynn J., Greenvoss Z., Harvey B., Nagel Ch. a další
Computer Press 2003

Programování Microsoft Windows v jazyce C#
Charles Petzold
Computer Press 2003
Programovací jazyk C# | Programování Windows Forms | Architektura .NET | ASP.NET | Dodatky | Diskuze
RNDr. Dušan Kovář, Ph.D.
Gymnázium Olomouc-Hejčín