Lezione 5 – Istruzioni di Condizione



By admin on febbraio 7, 2010


Iniziamo, con questa lezione, ad entrare nel vivo del linguaggio C/C++. Al termine della lezione saremo in grado di far prendere al programma delle semplici decisioni deterministiche ovvero delle scelte fatte sulla base della risoluzione di una espressione logica di controllo.

 

Istruzione if-else
Nella precedente lezione si è gia potuto osservare una esempio di istruzione decisionale:

d = (x==3) ? 4 : 5;

nella quale se x vale 3 allora alla variabile d viene dato il valore 4 altrimenti gli viene assegnato 5. Notare la terminologia utilizzata nella frase precedente: Se 'espressione' allora 'espressione1' altrimenti 'espressione2'. Una istruzione if-else funziona allo stesso modo, con l'unica differenza che al posto delle espressione1 e 2 ci sono 2 gruppi di istruzioni. La sintassi di questa istruzione è la seguente:

if(espressione)
{
//istruzioni separate da ;
}
else
{
//istruzioni separate da ;
}

Schematicamente questa istruzione può essere rappresentata nel modo che seguente e proprio per questa schematizzazione si parla spesso di ramo if e ramo else:

La valutazione della condizione tra parentesi tonde, in generale, deve tornare un valore del tipo bool che assume quindi i valori true o false. Se la condizione è vera viene eseguito il primo blocco di istruzioni racchiuse tra le parentesi graffe, se la condizione e falsa vengono eseguite le istruzioni del secondo blocco.
Vediamo subito qualche esempio:

#include <iostream.h>

int main()
{
    int anni;
    
    cout << "Inserire l'et&agrave;: ";  //Stampa a video la stringa tra gli apici
    cin >> anni; //Legge da tastiera un  numero e lo memorizza nella var. anni
    if(anni >= 18)
    {
        cout << "Puoi prendere la patente  B." << endl;
    }
    else
    {
        cout << "Sei troppo giovane per  portare l'auto!!!" << endl;
        cout << "L'et&agrave; minima e 18.  " << endl;
    }
    return 0;
}

In questo semplice esercizio viene stampato prima un messaggio, subito dopo il programma si mette in attesa di un input da tastiera e finalmente viene eseguito il controllo sulla variabile anni. Se quest'ultima è maggiore o uguale a 18 viene eseguita la stampa a video "Puoi...", altrimenti vengono eseguite le altre 2 stampe del ramo else.
Quando il ramo if o quello else o entrambi contengono una sola istruzione, le parentesi graffe possono essere omesse:

...

if(anni >= 18)
	cout << "Puoi prendere la patente  B." << endl;
else
{
    cout << "Sei troppo giovane per  portare l'auto!!!" << endl;
    cout << "L'et&agrave; minima e 18.  " << endl;
}
  ...

Inoltre il ramo else non è obbligatorio. Ad esempio:

#include <iostream.h>

int main()
{
    int anni;
    
    cout << " Inserire l'et&agrave;: "; 
    cin >> anni;
    if(anni >= 18)
    {
        cout << "Puoi prendere la  patente B." << endl;
        return;
    }
    cout << "Sei troppo giovane per  portare l'auto!!!" << endl;
    cout << "L'et&agrave; minima e 18. "  << endl;
    return 0;
}

Istruzioni if-else annidate
Sia il ramo if che il ramo else possono contenere altre istruzioni if-else, in questi casi si parla di istruzioni if-else annidate. Valgono le stesse regole viste in precedenza, ovvero else non obbligatorio e parentesi graffe eliminabili se il ramo in considerazione contiene una sola istruzione.

#include <iostream.h> 

#define MyAge 21

main()
{
    int anni;
    
    cout <<"Indovina la mia et&agrave;:  ";
    cin >> anni;
    if(anni == MyAge)
    {
        cout << endl <<  "BRAVISSIMO, ai indovinato!"<< endl;
    }
    else
    {
        if(anni <  MyAge)
        {
            cout << "No, sono pi&ugrave;  vecchio." << endl;
        }
        else
        {
            cout << " No, sono pi&ugrave; giovane  " << endl;
        }
    }
    return 0;
}

 

Istruzione switch-case

Ci sono casi in cui è necessario annidare molte istruzioni if-else:

resto = a % b;
if(resto==0) cout << "Resto nullo" << endl;
else
if(resto==1) cout << "Resto = uno" << endl;
else
if(resto==2) cout << "Resto = due" << endl;
else
if(resto==3) cout << "Resto = tre" << endl;
...

 

In simili situazioni la lettura del codice diventa anche più complicata, specialmente se le istruzioni nei rami if ed else sono molte. Per fortuna il linguaggio C/C++ mette a disposizione una istruzione equivalente che permette di evitare di dover annidare tanti if-else, tale istruzione è lo switch-case:

switch(espressione)
{
    case val1:  //istruzioni
        break;
    case val2: //istruzioni
        break;
    …
    case valn:  //istruzioni
        break;
    default: //istruzioni
}

L'espressione tra le parentesi tonde dello switch deve avere come risultato un valore (di tipo int, float, char,…) che sarà poi confrontato con tutti i valori costanti valn dei diversi case. Il primo valore che risulterà uguale con quello tornato dall'espressione iniziale causerà l'esecuzione delle istruzioni che seguono i ':' del relativo case. Se nessuno dei case soddisfa l'espressione dello switch allora saranno eseguite le istruzioni della sezione default. Quest'ultima sezione è opzionale.

Vediamo qualche esempio:

switch(a % b)
{
    case 0: cout << "Resto nullo"  << endl;
        break;
    case 1: cout << "Resto uno"  << endl;
        break;
    ...
    case 9: cout  << "Resto  nove"  << endl;
        break;
}

 

switch(nome[i])
{
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u': cout << "La  lettera" << i << "del nome è una vocale." <<  endl;
        break;
    default : cout << "La  lettera" << i << "del nome è una consonante."  << endl;
}

Osserviamo l'ultimo esempio. Se ci sono due o più case per i quali si deve eseguire la stessa o le stesse istruzioni è possibile utilizzare la forma abbreviata, ovvero mettere le istruzioni solo nell'ultimo case e lasciare vuoti tutti quelli precedenti.

Esempio completo:

#include <iostream.h> 
#include <stdlib.h>
int main()
{
    char choice;
    
    cout <<  "FLIGHT BOOKING SYSTEM" << endl << endl;
    cout <<  "1..New York to London Heathrow" << endl;
    cout <<  "2..New York to Vancouver" << endl;
    cout <<  "3..New York to Sydney" << endl;
    cout <<  "4..New York to Cape Town" << endl;
    cout << "Q..Quit"  << endl;
    cout <<  endl << endl << "Enter your choice : ";
    cin >> choice;
    
    switch(choice)
    {
        case '1': cout << endl << "New York to London booked" << endl << endl;
            break;
        case '2': cout << endl << "New York to Vancouver booked" << endl  << endl;
            break;
        case '3': cout << endl << "New York to Sydney booked" << endl << endl;
            break;
        case '4': cout << endl << "New York to Cape Town booked" << endl << endl;
            break;
        case 'Q':
        case 'q':  exit(0);
        default: cout  << endl << "Bad choice!" <<  endl << endl; 
    }
    return 0;
}




Lascia un Commento