back to top

Controllare il flusso di un programma C++: if, else e switch

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.

Altri contenuti interessanti

Pubblicitร 

Leggi anche...

Radice quadrata in C: vediamo come calcolarla in diversi modi

La radice quadrata è un'operazione matematica piuttosto comune (in...

Sperimentare la sequenza di Collatz in C++

Vediamo come verificare la congettura di Collatz con C++....

Calcolare la radice quadrata con Python

In Python è possibile calcolare la radice quadrata usando...

12 film che ogni programmatore dovrebbe guardare (per trovare ispirazione e creatività)

Molti ragazzi hanno deciso di intraprendere una carriera da...

Cartonizzare una foto con Python e la libreria OpenCV

La cartoonization è una procedura grafica che consente di...

Creare flowchart (diagrammi di flusso) online: 5 strumenti gratuiti

Hai bisogno di realizzare una flow chart ma non...
Pubblicitร