Eseguire dei test multipli tramite il costrutto if/else è sempre possibile, ma non è sempre la scelta migliore. Nel caso in cui avessimo varie scelte da effettuare il costrutto ci mette a disposizione un secondo costrutto chiamato "switch" il quale ci permette di effettuare test multipli mantenendo la leggibilità del codice molto più pulita rispetto a duplicare tanti cotrutti if. Il costrutto switch prevede una forma del tipo:
switch(<condizione>) {
case <test1>:
<codice>
break;
case <test2>:
<codice>
break;
default: // Questo è opzionale
<codice da eseguire nel caso in cui tutti i precedenti test fallissero>
}
La condizione in questo costrutto deve essere sempre una variabile di tipo intero (quindi non sono accettati valori in virgola mobile) oppure booleana (anche se in questo casoè sicuramente preferibile usare il costrutto if/else). La condizione viene valutata per ogni costrutto case presente. Quando uno di questi viene soddisfatto viene eseguito il codice subito seguente fino ad incontrare la chiusura della parentesi graffa che delimita la fine del costrutto switch, o fino a quando non si incontra il costrutto "break" che determina un salto alla fine del costrutto switch. L'inserimento della clausola break, anche se opzionale, è importante in quanto nel caso in cui venga omesso si potrebbero verificare dei comportamenti anomali del programma.
Prendiamo come esempio il codice sopra riportato e vediamo come sarebbe se al posto del costrutto if/else si usasse il costrutto switch:
int voto_scolastico;
voto_scolastico = 8;
switch(voto_scolastico) {
case 0:
printf("Ma cosa segui a fare il corso che tanto non hai imparato nulla?\n");
break;
case 1:
case 2:
case 3:
printf("Sei davvero scarso! Cerca di applicarti di più!\n");
break;
case 4:
case 5:
printf("Ancora uno sforzo per raggiungere la sufficienza!\n");
break;
case 6:
case 7:
printf("Stai andando bene! Continua così!\n");
break;
case 8:
case 9:
printf("Complimenti, sei davvero in gamba!\n");
break;
default:
printf("Eccellente!\n");
}
La clausola finale "default" è opzionale e viene utilizzata quando si vuole assegnare un azione nel caso in cui nessuno dei test eseguiti in precedenza abbia dato esito positivo.
Come dicevo prima, alla fine di ogni blocco di test viene inserito il costrutto break. Se questo venisse omesso verrebbe eseguito il codice a partire dal primo test con esito positivo fino alla fine dell'intero costrutto switch. Nel nostro esempio, se omettiamo tutti i break ci verrà stampato a video il testo seguente:
Complimenti, sei davvero in gamba!
Eccellente!
Chiaramente dopo l'ultimo test inserire il comando break risulta del tutto ininfluente.
Giusto per completezza darò un accenno ad un terzo modo per esprimere una struttura condizionale, quello fatto tramite l'operatore ternario "?". A mio parere questo operatore rende il codice molto snello (e per qualcuno anche molto elegante) da vedere, ma specie per chi è all'inizio con il linguaggio C risulta difficile da utilizzare, quindi ve lo espongo, ma vi do come consiglio quello di non utilizzarlo mai (almeno le prime volte). D'altronde ciò che è stato detto finora è più che sufficiente per esprimere condizioni.
L'operatore ternario ha una forma di questo tipo:
<condizione> ? <codice1> : <codice2>
La condizione è sempre la nostra espressione da valutare. Nel caso questa espressione risulti soddisfatta verrà eseguito il codice che segue l'operatore altrimenti verrà eseguito il codice seguente ai due punti. Riprendendo il primo esempio riportato sopra potremo descriverlo tramite una forma di questo tipo:
int voto_scolastico = 8;
(voto_scolastico < 6) ? printf("Bocciato\n") : printf("Promosso\n");
Per questa lezione è tutto, vi aspetto alla prossima dove analizzeremo insieme quelle che vengono chiamate strutture iterative.
switch(<condizione>) {
case <test1>:
<codice>
break;
case <test2>:
<codice>
break;
default: // Questo è opzionale
<codice da eseguire nel caso in cui tutti i precedenti test fallissero>
}
La condizione in questo costrutto deve essere sempre una variabile di tipo intero (quindi non sono accettati valori in virgola mobile) oppure booleana (anche se in questo casoè sicuramente preferibile usare il costrutto if/else). La condizione viene valutata per ogni costrutto case presente. Quando uno di questi viene soddisfatto viene eseguito il codice subito seguente fino ad incontrare la chiusura della parentesi graffa che delimita la fine del costrutto switch, o fino a quando non si incontra il costrutto "break" che determina un salto alla fine del costrutto switch. L'inserimento della clausola break, anche se opzionale, è importante in quanto nel caso in cui venga omesso si potrebbero verificare dei comportamenti anomali del programma.
Prendiamo come esempio il codice sopra riportato e vediamo come sarebbe se al posto del costrutto if/else si usasse il costrutto switch:
int voto_scolastico;
voto_scolastico = 8;
switch(voto_scolastico) {
case 0:
printf("Ma cosa segui a fare il corso che tanto non hai imparato nulla?\n");
break;
case 1:
case 2:
case 3:
printf("Sei davvero scarso! Cerca di applicarti di più!\n");
break;
case 4:
case 5:
printf("Ancora uno sforzo per raggiungere la sufficienza!\n");
break;
case 6:
case 7:
printf("Stai andando bene! Continua così!\n");
break;
case 8:
case 9:
printf("Complimenti, sei davvero in gamba!\n");
break;
default:
printf("Eccellente!\n");
}
La clausola finale "default" è opzionale e viene utilizzata quando si vuole assegnare un azione nel caso in cui nessuno dei test eseguiti in precedenza abbia dato esito positivo.
Come dicevo prima, alla fine di ogni blocco di test viene inserito il costrutto break. Se questo venisse omesso verrebbe eseguito il codice a partire dal primo test con esito positivo fino alla fine dell'intero costrutto switch. Nel nostro esempio, se omettiamo tutti i break ci verrà stampato a video il testo seguente:
Complimenti, sei davvero in gamba!
Eccellente!
Chiaramente dopo l'ultimo test inserire il comando break risulta del tutto ininfluente.
Giusto per completezza darò un accenno ad un terzo modo per esprimere una struttura condizionale, quello fatto tramite l'operatore ternario "?". A mio parere questo operatore rende il codice molto snello (e per qualcuno anche molto elegante) da vedere, ma specie per chi è all'inizio con il linguaggio C risulta difficile da utilizzare, quindi ve lo espongo, ma vi do come consiglio quello di non utilizzarlo mai (almeno le prime volte). D'altronde ciò che è stato detto finora è più che sufficiente per esprimere condizioni.
L'operatore ternario ha una forma di questo tipo:
<condizione> ? <codice1> : <codice2>
La condizione è sempre la nostra espressione da valutare. Nel caso questa espressione risulti soddisfatta verrà eseguito il codice che segue l'operatore altrimenti verrà eseguito il codice seguente ai due punti. Riprendendo il primo esempio riportato sopra potremo descriverlo tramite una forma di questo tipo:
int voto_scolastico = 8;
(voto_scolastico < 6) ? printf("Bocciato\n") : printf("Promosso\n");
Per questa lezione è tutto, vi aspetto alla prossima dove analizzeremo insieme quelle che vengono chiamate strutture iterative.
Comment