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:
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:
ex3_6_1.cpp