Possiamo immaginare un qualunque programma come una sequenza di comandi che devono essere eseguiti da un computer. I comandi, detti anche istruzioni o statement, si presentano ad un primo sguardo come un flusso continuo, che porta senza sosta da unโistruzione a quella immediatamente successiva, fino alla conclusione del programma stesso.
Se le possibilitร a disposizione del programmatore si esaurissero con quelle indicate da questa analogia perรฒ, le potenzialitร dei linguaggi di programmazione risulterebbero piuttosto ridotte. Non abbiamo infatti finora accennato alla possibilitร di governare il flusso del programma, ovvero di decidere quale, tra piรน possibili istruzioni, venga eseguita, imponendo delle condizioni da verificare dinamicamente.
Per chiarire meglio, si tratta di condizioni da verificare non una volta soltanto allโatto della scrittura del programma ma ad ogni esecuzione, aumentando di conseguenza la flessibilitร del prodotto, che รจ in grado di adattarsi a diverse situazioni.
A livello logico e linguistico controllare il flusso del programma equivale sostanzialmente alla formulazione di frasi di tipo โse a allora bโ. Allโinterno di un linguaggio di programmazione tale frase si puรฒ leggere come: se nel momento in cui il programma viene eseguito e si trova ad eseguire lโistruzione โse a allora bโ verifico la condizione a, allora eseguo anche lโistruzione b, altrimenti no.
Ad esempio, se una certa variabile di tipo numero intero (int) di nome test รจ uguale a 1 eseguo lโistruzione necessaria per visualizzare il messaggio: โTestโ, altrimenti no.
Ma quali sono gli elementi concreti del linguaggio di programmazione che consentono di realizzare unโistruzione di questo tipo, ad esempio in C++? Si tratta di strumenti davvero semplici ed intuitivi, riassunti di fatto, in prima battuta, dalla parola chiave (o keyword) if.
If
Immaginiamo di voler stampare un messaggio โAlzatiโ soltanto se una variabile booleana (cioรจ che puรฒ assumere valore โveroโ o โfalsoโ) di nome sveglia ha come valore โtrueโ, cioรจ vero. Lโistruzione che fa al caso nostro รจ la seguente:
if(sveglia==true) cout<<"Alzati";
L'operatore "==" consente infatti di confrontare due variabili, verificandone l'uguaglianza, mentre l'istruzione cout corrisponde alla stampa a video. Da notare come, per una corretta esecuzione, dato che la funzione cout non รจ sviluppata autonomamente dal programmatore ma risulta una funzione preprogrammata, cioรจ una funzione di libreria e in particolare appartenente alla libreria iostream, sarร necessario fare riferimento proprio a tale libreria all'inizio del nostro programma.
Ciรฒ verrร realizzato tramite la keyword include e per mezzo dell'istruzione:
#include <iostream.h>
Else
Nell'esempio sopra riportato, il flusso del programma รจ controllato in modo tale che un'istruzione venga eseguita o meno secondo il verificarsi di una o piรน condizioni. Spesso perรฒ puรฒ essere interessante definire due istruzioni alternative: una viene eseguita se sono verificate alcune condizioni, in caso contrario viene eseguita l'altra.
Per ottenere questo risultato in C++ sarร sufficiente utilizzare la keyword else:
if(sveglia==true) cout<<"Alzati" else cout<<"ZZZ...";
In questo caso se la variabile sveglia รจ uguale a true (cioรจ ha valore "vero") si stampa un messaggio "Alzati", in caso contrario stampiamo invece il messaggio "ZZZ...".
Else if
In modo analogo ma piรน completo รจ possibile servirsi anche del costrutto else if. Si defniscono in questo modo due istruzioni alternative ma in modo meno rigido, ciascuna di esse infatti viene eseguita comunque solo se sono verificate anche alcune particolari condizioni. Proseguendo con l'analisi dell'esempio fin qui trattato, alteriamo il codice in questo modo:
if(sveglia==true) cout<<"Alzati" else if (dormi==true) cout<<"ZZZ...";
La stampa del messaggio "Alzati" รจ, come in precedenza, condizionata al valore true della variabile sveglia. Con questa modifica perรฒ, la stampa del messaggio alternativo "ZZZ..." รจ a sua volta associata ad una condizione da verificare.
Non viene quindi effettuata ogni volta che la variabile sveglia non รจ uguale a true, ma soltanto se, oltre a questo, la variabile dormi (che immaginiamo booleana) รจ uguale a true.
Switch
In conclusione esaminiamo un caso particolare di controllo del flusso del programma, di grande interesse pratico. Immaginiamo di trovarci nelle condizioni di avere molte istruzioni alternative tra loro, tutte condizionate al valore della stessa variabile.
Formuliamo un esempio in cui la variabile sia di tipo numero intero (int), di nome prova e, a seconda del valore di n, si debbano impostare dieci istruzioni alternative tra loro.
Utilizzando gli strumenti sin qui esposti, si dovrebbe procedere alla scrittura di un'istruzione di tipo "if" e nove di tipo "else if", tutte condizionate a valori diversi della stessa variabile n. Esiste perรฒ uno strumento piรน specifico ed elegante per ottenere tale scopo con migliore leggibilitร del codice: l'istruzione switch. Ecco come utilizzarla:
switch(prova)
{
case 1: cout<<"A";
break;
case 2: cout<<"B";
break;
case 3: cout<<"C";
break;
case 4: cout<<"D";
break;
case 5: cout<<"E";
break;
case 6: cout<<"F";
break;
case 7: cout<<"G";
break;
case 8: cout<<"H";
break;
case 9: cout<<"I";
break;
default: cout<<"Prova";
break;
}
Questo codice consente di stampare la lettera dell'alfabeto corrispondente al valore di n se tale valore รจ compreso tra 1 e 9 o il messaggio "Prova", in caso contrario. La variabile su cui effettuare i controlli รจ inserita tra parentesi tonde, immediatamente dopo la keyword switch.
Le istruzioni alternative vanno specificate tutte tra le parentesi graffe che si aprono immediatamente dopo lo switch. Per indicare le condizioni, come si puรฒ notare nell'esempio sopra riportato, ci si serve della keyword case. Ad esempio "case 1", inserito tra le parentesi graffe che seguono lo switch, equivale a "if n==1" e cosรฌ via. Le diverse opzioni sono separate per mezzo della keyword break.
Proseguendo nell'analisi del codice che abbiamo preso ad esempio, osserviamo che l'ultima riga inizia con "default:" viene eseguita in caso nessuna delle condizioni precedentemente indicate sia stata verificata. In sostanza si tratta di un'istruzione di significato analogo a un else non seguito da if.
Anche nel caso di un else non seguito da if infatti l'istruzione che segue l'else viene eseguita solo se tutte le condizioni associate alle istruzioni di tipo if (o else if) che la precedono sono false.