next up previous contents index
Next: Gli operatori di confronto Up: Costrutti condizionali e iterativi Previous: Interruzione di un ciclo   Indice   Indice analitico

Il costrutto di scelta multipla

L'ultimo costrutto che esaminiamo in questo capitolo è il costrutto di scelta multipla, switch, che ha come sinonimo sintattico una serie di if in cascata; la sintassi è la seguente:
switch (variabile) {
case valore-1:
corpo del primo case
break;

case valore-2:
corpo del secondo case
break;



case valore-N:
corpo dell'N-esimo case
break;

default:
corpo default
}

che è perfettamente equivalente a

if (variabile == valore-1) corpo del primo case
else if (variabile == valore-2) corpo del secondo case

else if (variabile == valore-N) corpo dell'N-esimo case
else corpo default

Già da una veloce osservazione la sintassi con switch risulta molto più compatta e organica di quella con gli if in cascata; si noti bene che nel costrutto switch non è necessario racchiudere il corpo di ogni case tra parentesi graffe 3.5, mentre è obbligatorio terminarlo con la parola chiave break. La parola chiave default, utilizzata come ultimo caso da considerare, racchiude il corpo di istruzioni da eseguire nel caso variabile sia diversa da valore-1,valore-2,...,valore-N; tale parola chiave è opzionale. Presentiamo ora due esempi riassuntivi, contenenti dei costrutti switch:


// ex3_6_1.cpp
// effettua alcune operazioni numeriche
#include <iostream.h>
#include <math.h>
void main() {
   char comando;
   bool continua = true;
   do {
      cout << "\n\noperazioni disponibili:\n"
         "\t (a) somma \n"
         "\t (b) fattoriale \n"
         "\t (c) arcotangente \n"
         "\t (d) potenza \n"
         "\t (q) esce \n";
      cout << "\n? ";
      cin >> comando;
      switch (comando) {
      case 'a': case 'A': {
         int somma = 0, n;
         cout << "\n digita 0 per terminare\n";
         do {
            cout << "? "; cin >> n;
            somma += n;
         } while (n != 0);
         cout << "somma = " << somma;
         break; }
      case 'b': case 'B': {
         int n, risultato = 1;
         cout << "n = ";
         cin >> n;
         if (n <= 0) {
            cout << "non si puo' calcolare il fattoriale"
               "di un numero non positivo";
            break;
         }
         for (int i = 1; i <= n; i++)
            risultato *= i;
         cout << "\n" << n << "! = " << risultato;
         break; }
      case 'c': case 'C': {
         double x;
         cout << "x = "; cin >> x;
         double risultato = atan (x);
         cout << "arctg(" << x << ") = " << risultato;
         break; }
      case 'd': case 'D': {
         cout << "calcola x elevato alla n\n";
         double x, risultato = 1;
         int n;
         cout << "x = "; cin >> x;
         cout << "n = "; cin >> n;
         if (n >= 0) {
            for (int i = 1; i <= n; i++)
               risultato *= x;
         }
         else {      // n < 0
            n = -n;
            for (int i = 1; i <= n; i++)
               risultato *= x;
            risultato = 1 / risultato;  // inverte risultato
         }
         cout << "\n" << x << " elevato a " << n << " = " << risultato;
         break; }
      case 'q': case 'Q':
         continua = false;
      default:
         // in tal caso l'utente ha immesso un comando non esistente
         cout << "\n d'oh \n";
      }
   } while (continua == true);
}

Innanzitutto si noti la sintassi da utilizzare se due valori hanno il medesimo corpo, come nel nostro caso:

case valore-1: ...case emphvalore-N:
in questa maniera, l'utente è nel nostro esempio libero di immettere un comando utilizzando lettere minuscole o maiuscole, a scelta. Uno degli usi più tipici del costrutto switch è proprio quello dell'esempio ex3_6_1.cpp, nel quale abbiamo allestito un semplice ma efficiente menu utente, dal quale selezionare una operazione da effettuare. Infine, abbiamo introdotto senza alcuna presentazione la funzione atan(), che calcola l'arcotangente dell'argomento, contenuta nella libreria math.h. Vediamo nell'esempio seguente un altro utilizzo tipico del costrutto switch.


// ex3_6_2.cpp
// estrae tre carte da un mazzo di carte da poker
// si veda l'esempio ex3_5_2.cpp per le note riguardo
// l'utilizzo dei numeri pseudocasuali
#include <iostream.h>
#include <time.h>
#include <stdlib.h>
void main() {
   int seme = time(0);
   srand (seme);
   int a, b, c;
   a = ( rand() % 52) + 1;
   // evita che b sia uguale ad a
   do {
      b = ( rand() % 52) + 1;
   } while (a == b);
   // evita che c sia uguale ad a o a b
   do {
      c = ( rand() % 52) + 1;
   } while ( (c == a) || (c == b) );
   for (int i = 1; i <= 3; i++) {
      int n;
      switch (i) {
         case 1:
            n = a;
            break;
         case 2:
            n = b;
            break;
         case 3:
            n = c;
            break;
      }
      int carta = (n % 13) + 1;
      // si noti che la variabile seme esiste gia'
      // essa e' pero' fuori da questo blocco
      // quindi non ci sono problemi di ambiguita'
      int seme = (n - 1) / 13;
      // siano:
      // seme:   0=cuori   1=quadri   2=fiore   3=picche
      // carta:  1=asso    11=fante   12=regina 13=re
      switch (carta) {
         case 1:
            cout << "Asso di ";
            break;
         case 11:
            cout << "Fante di ";
            break;
         case 12:
            cout << "Regina di ";
            break;
         case 13:
            cout << "Re di ";
            break;
         default:
            cout << carta << " di ";
      }
      switch (seme) {
         case 0:
            cout << "cuori";
            break;
         case 1:
            cout << "quadri";
            break;
         case 2:
            cout << "fiori";
            break;
         case 3:
            cout << "picche";
            break;
      }
      cout << "\n";
   }
}
esempio di output:
Asso di quadri
5 di picche
4 di cuori

ex-2
si scriva un programma che estragga una carta da un mazzo di 40 carte (napoletane o piacentine);
ex-3
si scriva un programma che permetta di eseguire le quattro operazioni aritmetiche (somma, sottrazione, prodotto, quoziente) tra due numeri reali, utilizzando un menu utente come quello dell'esempio ex3_6_1.cpp


next up previous contents index
Next: Gli operatori di confronto Up: Costrutti condizionali e iterativi Previous: Interruzione di un ciclo   Indice   Indice analitico
Claudio Cicconetti
2000-09-06