Informatica 2 Liceo Scientifico Scienze Applicate/Istruzione switch

Wikibooks, manuali e libri di testo liberi.
Indice del libro

Istruzione switch[modifica]

L'istruzione switch serve per selezionare ed eseguire, in funzione del risultato (intero) di una certa espressione, uno dei blocchi di codice indicizzati nello switch.

Viene utilizzata per creare ad esempio un menù di scelta, se l'utente preme il numero 1 viene creato il database, se preme 2 può inserire un record, se preme 3 può ricercare un elemento ecc.


La sintassi del comando è la seguente


switch (espressione_dal_risultato_intero)
{ case costanteintera1 :  istruzione_1blocco1;
                          istruzione_2blocco1;
                              ....
                          istruzione_nblocco1;
                          break;
  case costanteintera2 :  istruzione_1blocco2;
                          istruzione_2blocco2;
                              ....
                          istruzione_mblocco2;
                          break;                         
                   ....
  case costanteinterak :  istruzione_1bloccok;
                          istruzione_2bloccok;
                              ....
                          istruzione_gbloccok;
                          break;                         
  default               : istruzione_1bloccodefault;
                          istruzione_2bloccodefault;
                              ....
                          istruzione_pbloccodefault;
                                                   
 }


Quando viene eseguito il comando viene valutata l'espressione, questa da come risultato un numero intero, si ricerca fra i numeri scritti a fianco alla parola case se c'è una corrispondenza, se viene trovata vengono eseguite le istruzioni del blocco associato a quel case, se non c'è una corrispondenza vengono eseguite le istruzioni associate alla parola default. Attenzione che i .... li ho messi per evidenziare che potete aggiungere più istruzioni o più case.

Vediamo un esempio per capire meglio:


#include <iostream>

using namespace std;
/* realizza un menu di scelta tramite uno switch che permetta di calcolare 
   l'area del trapezio o l'area del cerchio o quella del rettangolo
   per scegliere quale area calcolare premi 1,2,3
*/
    
int main(int argc, char *argv[])
{   int x;
    float baseminore,basemaggiore,altezza,base,raggio;
    float area; 
    cout<<"inserisci 1 per area rettangolo"<<endl;
    cout<<"inserisci 2 per area trapezio"<<endl;
    cout<<"inserisci 3 per l'area del cerchio"<<endl;
    cin>>x;
    
    switch(x)
    {case 1 : cout<<"calcolo dell'area del rettangolo"<<endl;
              cout<<"inserisci la base ";
              cin>>base;
              cout<<"inserisci l'altezza ";
              cin>>altezza;
              area=base*altezza;
              cout<<"l'area vale"<<area<<endl;
              break;
     case 2 : cout<<"calcolo dell'area del trapezio"<<endl;
              cout<<"inserisci la base minore ";
              cin>>baseminore;
              cout<<"inserisci la base maggiore ";
              cin>>basemaggiore;
              cout<<"inserisci l'altezza ";
              cin>>altezza;        
              area=(baseminore+basemaggiore)*altezza/2;
              cout<<"l'area vale"<<area<<endl;
              break;
     case 3:  cout<<"calcolo dell'area del cerchio"<<endl;
              cout<<"inserisci il raggio";
              cin>>raggio;
              area=raggio*raggio*3.14;
              cout<<"l'area vale"<<area<<endl;
              break;
     default : cout<<"devi premere 1,2,3"<<endl;      
    }
    
    cout<<"questa e' l'istruzione dopo lo switch "<<endl;
      
    system("PAUSE");
    return EXIT_SUCCESS;
}

In questo programma si è realizzato un menù di scelta

  • se l'utente preme 1 si esegue il blocco di codice per calcolare l'area di un rettangolo
  • se seleziona 2 si esegue il blocco di codice per il calcolo del trapezio
  • se si seleziona 3 il blocco di codice per il calcolo dell'area del cerchio


in questo caso l'espressione intera da valutare è costituita da una sola variabile la x, ma poteva anche essere del tipo 2*x*y-4, basta che il risultato sia un numero intero.

poi ci sono 3 case, ciascuno con associato un numero intero, il primo case ha come costante numerica associata il numero 1, il secondo case il numero 2, il terzo case il numero 3. Il fatto che il primo case abbia come numero associato il valore 1 è un puro caso poteva benissimo avere come costante numerica il numero 37, stessa cosa dicasi per i case successivi, ad esempio il secondo case poteva avere il numero 10, quindi non bisogna neppure rispettare un ordine crescente nella scelta delle costanti numeriche.

dopo il numero che rappresenta la costante numerica compaiono i : che ci vanno e poi vengono scritte le istruzioni associate a quel case, questo blocco di istruzioni di solito termina con l'istruzione break che termina lo switch, se nel corso dell'esecuzione del programma ci sarà corrispondenza fra il valore assunto dalla x e la costante di un case verrà eseguito il blocco di codice corrispondente. Nel nostro caso se premo 1 la x assume quel valore, c'è corrispondenza con la costante numerica (1) del primo case e quindi si avviano le istruzione per eseguire il calcolo dell'area del rettangolo. Se il numero digitato fosse stato 3, la x assumeva quel valore, il primo e il secondo case venivano ignorati perché avevano una costante numerica diversa dal valore della x, e si arrivava al terzo case che aveva come costante numerica lo stesso valore della x, ora il codice ad essere eseguito è quello che serve per risolvere il calcolo dell'area del cerchio. L'esecuzione dei blocchi di codice si ferma quando viene incontrata l'istruzione break, se non c'è l'esecuzione prosegue con il blocco successivo e così via fino a trovare un break o in ultima istanza la parentesi graffa di chiusura che termina lo switch. Quindi e' possibile omettere il break in uno o più blocchi se si trae vantaggio da questa prosecuzione nel blocco successivo.Se nessuna costante numerica corrisponde al valore della x viene eseguito il blocco di codice messo dopo i : della parola default fino alla parentesi graffa di chiusura dello switch. La parola default e il relativo blocco di istruzioni possono essere omessi in questo caso se non ci sono corrispondenze fra la x e i valori costanti dei diversi case non viene eseguito nessun blocco e l'istruzione switch termina e l'esecuzione passa all'istruzione successiva.

Nel C le variabili char vengono memorizzate come interi, è allora possibile usarle come possibile espressione di scelta, le costanti dei diversi case che simboleggiano dei singoli caratteri vanno scritte fra singoli apici, le variabili costanti se sono stringhe vengono scritte fra doppi apici, se sono dei char fra singoli apici e se sono numeri senza niente. Non possiamo usare delle parole (string) come espressioni di scelta, solo interi o singoli char;
Il programma di prima allora diventa

#include <iostream>
using namespace std;
/* realizza un menu di scelta tramite uno switch che permetta di calcolare 
   l'area del trapezio o l'area del cerchio o quella del rettangolo
   per scegliere quale area calcolare premi t,c,r
*/

int main(int argc, char *argv[])
{   char x;
    float baseminore,basemaggiore,altezza,base,raggio;
    float area; 
    cout<<"inserisci r per area rettangolo"<<endl;
    cout<<"inserisci t per area trapezio"<<endl;
    cout<<"inserisci c per l'area del cerchio"<<endl;
    cin>>x;
    
    switch(x)
    {case 'r' : cout<<"calcolo dell'area del rettangolo"<<endl;
              cout<<"inserisci la base ";
              cin>>base;
              cout<<"inserisci l'altezza ";
              cin>>altezza;
              area=base*altezza;
              cout<<"l'area vale"<<area<<endl;
              break;
     case 't' : cout<<"calcolo dell'area del trapezio"<<endl;
              cout<<"inserisci la base minore ";
              cin>>baseminore;
              cout<<"inserisci la base maggiore ";
              cin>>basemaggiore;
              cout<<"inserisci l'altezza ";
              cin>>altezza;        
              area=(baseminore+basemaggiore)*altezza/2;
              cout<<"l'area vale"<<area<<endl;
              break;
     case 'c':  cout<<"calcolo dell'area del cerchio"<<endl;
              cout<<"inserisci il raggio";
              cin>>raggio;
              area=raggio*raggio*3.14;
              cout<<"l'area vale"<<area<<endl;
              break;
           
    }
    
    cout<<" hai visto che funziona?";
      
    system("PAUSE");
    return EXIT_SUCCESS;
}

dove potete vedere per confronto le modifiche da fare nel caso la variabile di scelta sia di tipo char.