Instrukcja switch
W wielu przypadkach, gdy należy podjąć wielowariantową decyzję zależną od wartości wyrażenia
zamiast zagnieżdżonych instrukcji
if
wygodniej jest zastosować instrukcję
switch.
Ma ona
postać:
switch (wyr)
{
case st_1:
instrukcje_1
case st_2:
instrukcje_2
………….
default:
instrukcje_default
case st_k:
instrukcje_k
………..
}
Instrukcja
switch
oblicza wartość całkowitego wyrażenia
wyr
i porównuje ją ze stałymi
całkowitymi
– st_1,….st_k.
Jeżeli wartość wyrażenia jest zgodna ze stałą
st_i
wykonywany
jest ciąg instrukcji
instrukcje_i, instrukcje_i+1,…
aż do wystąpienia słowa
kluczowego
default.
Gdy żaden przypadek nie odpowiada stałe
j wyr
wykonywane są
instrukcje_default
i występujące po nich
instrukcje_k.
Przypadek
default
nie
jest obowiązkowy, jednak jeśli jest, może wystąpić w dowolnym miejscu. Instrukcja
break
powoduje przerwanie wykonywania instrukcji
switch.
Jest ona zwykle stosowana po ostatniej
instrukcji przypadku
default,
a często także na końcu ciągów instrukcji odpowiadającym
pozostałym przypadkom.
Poniższy program ilustruje działanie instrukcji
switch.
Wczytuje do tablicy tekstowej liczbę
zapisaną w systemie szesnastkowym i zamienia ją na liczbę dziesiętną. Instrukcja
case
została
wykorzystana do zamiany liter występujących w zapisie liczby szesnastkowej na odpowiadające im
liczby dziesiętne:
A – 10
B – 11
C – 12
D – 13
E – 14
F – 15
Liczbę szesnastkową zamienia się na dziesiętną mnożąc kolejne cyfry szesnastkowe przez kolejne
potęgi podstawy (czyli liczby 16) i sumując je. Wyjaśnia to przykład:
2AB07C
(16)
= (12 * 16
0
+ 7 * 16
1
+ 11 * 16
3
+ 10 * 16
4
+ 2 * 16
5
)
(10)
Do obliczenia wartości wielomianu można zastosować schemat Hornera.
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int main()
{
char lx[MAX],d,dd[2];
int i,l;
int s,x;
fgets(lx,10,stdin);
//fgets dodaje do tabl. znak koniec linii (kod 10) i '\0'
printf("liczba szesnastkowo=%s\n",lx);
s=0;
i=0;
while ((d=lx[i])!=10)
{
printf("znak=%c\n",d);
switch (d)
{
case 'A':
x=10;
break;
case 'B':
x=11;
break;
case 'C':
x=12;
break;
case 'D':
x=13;
break;
case 'E':
x=14;
break;
case 'F':
x=15;
break;
default:
dd[0]=d;
dd[1]='\0';
printf("ciag:%s\n",dd);
x=atoi(dd);
};
i++;
printf("x=%d\n",x);
s=s*16.+x;
}
printf("%d\n",s);
}
W instrukcji
case
każdy znak wczytanego tekstu (liczby szesnastkowej) zamieniany jest na liczbę
dziesiętną. Przypadek
default
dotyczy znaków będących cyframi dziesiętnymi (0-9).
Wykorzystano funkcję
atoi,
która zamienia tekst na liczbę dziesiętną. Wymaga ona zbudowania
tablicy tekstowej, czyli dodania symbolu ‘\0’ (tablica dd). Zgodnie ze schematem Hornera kolejne
wyniki mnoży się przez 16 i dodaje się liczby dziesiętne odpowiadające kolejnym pozycjom
zamienianej liczby 16-tkowej.
Wykorzystując kody ASCII znaków występujących w liczbach 16-tkowych instrukcję
switch
można
zastąpić następującym fragmentem kodu.
if(d>=48 && d<=57)
x=d-48;
else
if(d>=65 && d<=70)
x=d-55;
else
{ printf("zla liczba\n");
break;};
Kody 48 – 57 odpowiadają znakom 0-9, natomiast kody 65-70 odpowiadają znakom A-F.