Přepínač switch
Pro vícenásobné větvení se v jazyce C používá příkaz switch. V programu je většinou možné nahradit ho několika příkazy if, ale správně použitý příkaz switch je mnohem přehlednější. V podmíněném příkazu if jsme se rozhodovali na základě výsledku logického výrazu. Ten má ale jenom 2 možné hodnoty (pravda, nepravda), co nám pro vícenásobné větvení nestačí. V příkazu switch se pro rozhodování používá celočíselný výraz, u kterého testujeme jeho jednotlivé hodnoty.
Obecný popis (syntaxe) příkazu switch:
switch (celociselny_vyraz)
{
case hodnota_1: prikaz1; break;
case hodnota_2: prikaz2; break;
...
case hodnota_n: prikazn; break;
default: prikaz_def; break;
}
Poznámky ke zpracování příkazu switch:
- v závorkách za klíčovým slovem switch použijeme jedině celočíselnou proměnnou nebo celočíselný výraz
- když hodnota výrazu je hodnota_1, vykoná se prikaz1. Příkaz switch končí, pokračuje se dále v programu. Podobně se postupuje pro hodnota_2 až hodnota_n
- část default je nepovinná část příkazu switch. Příkaz prikaz_def se vykoná v případě, že hodnota celočíselného výrazu neodpovídá žádné z hodnot uvedených v částech case. Často se využívá pro ošetření chyb
- příkaz break znamená ukončení příkazu switch po každé jednotlivé části case. Pokud ho neuvedeme pokračuje se v příkazu switch na dalším řádku
- jako celočíselný výraz pro rozhodování se často používají znaky. Datový typ char patří totiž mezi celočíselné datové typy. V tom případě musíme u jednotlivých hodnot za case použít apostrofy
- příkaz switch se často v programech používá pro vytvoření a testování uživatelské nabídky
V příkladech uvedeme 2 varianty stejného programu. Ukazují různé možnosti použití přepínače. Program bude počítat součet, rozdíl, součin nebo podíl dvou zadaných čísel. Typ operace vybere uživatel výběrem z nabídky (1.varianta) nebo zadáním operátoru (2.varianta).
/*
* 1.varianta
* prepinac switch pouzity pro urceni operace podle nabidky
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
float x,y,z;
int volba;
printf("\nZadejte 2 cisla :\n");
printf("\tcislo1 : ");
scanf("%f",&x );
printf("\tcislo1 : ");
scanf("%f",&y );
printf("1 - soucet\n");
printf("2 - rozdil\n");
printf("3 - soucin\n");
printf("4 - podil\n");
printf("\nVyberte operaci : \n");
scanf("%d", &volba);
switch(volba)
{
case 1: z=x+y;
printf("Vysledek : %.2f+%.2f = %.2f\n", x, y, z);
break;
case 2: z=x-y;
printf("Vysledek : %.2f-%.2f = %.2f\n", x, y, z);
break;
case 3: z=x*y;
printf("Vysledek : %.2f*%.2f = %.2f\n", x, y, z);
break;
case 4: if (y != 0)
{
z=x/y;
printf("Vysledek : %.2f/%.2f = %.2f\n", x, y, z);
}
else printf("Nelze delit nulou\n");
break;
default: printf("Spatne zadana operace\n");
}
system("pause");
return 0;
}
// 2. varianta
// prepinac switch pouzity pro urceni operace podle zadaneho operatora
#include <stdio.h>
#include <stdlib.h>
int main()
{
float x,y,z;
int chyba=0;
char op;
printf("\nZadejte priklad :"); //napr. 2+3, 17*4, ...
scanf("%f%c%f",&x ,&op ,&y);
switch(op)
{
case '+': z=x+y; break;
case '-': z=x-y; break;
case '*': z=x*y; break;
case '/': if (y) z=x/y; else chyba=2; break;
default: chyba=1;
}
//promenna chyba je pouzita pro urceni typu vystupu - vysledek nebo chyba
if (chyba == 0) printf("Vysledek : %.2f %c %.2f = %.2f", x,op,y,z);
if (chyba == 1) printf("Spatne zadany operator");
if (chyba == 2) printf("Nelze delit nulou");
system("pause");
return 0;
}