background image

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 

background image

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

)

(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'; 

background image

                  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.