next up previous contents index
Next: Costrutti ciclici: for Up: Costrutti condizionali e iterativi Previous: Gli operatori logici   Indice   Indice analitico

La scelta condizionata

In ogni linguaggio di programmazione ha una importanza fondamentale la struttura di scelta condizionata, cioè un costrutto che permetta di discriminare una condizione, di effettuare delle scelte: ``se tale condizione è vera, allora esegui tale operazione, altrimenti esegui tale altra''; in C++ il costrutto di scelta condizionata ha la seguente sintassi:
if (condizione) statement
else statement
ove la clausola else è opzionale; si noti che uno statement può essere costituito anche da un numero consistente di statement, racchiusi in un blocco dalle parentesi graffe.


//ex3_2_1.cpp
#include <iostream.h>
void main() {
   bool t = true, f = false;
   if (t && f)     // condizione falsa
      cout << "pessimo";
   else
      cout << "buon";
   if (t || f)     // condizione vera
      cout << " giorno";
}

output:
buon giorno

Una importanza notevole ha nelle espressioni condizionali un nuovo gruppo di operatori, gli operatori di confronto, che sono in C++ i seguenti, tutti binari:

> maggiore
>= maggiore o uguale
< minore
<= minore o uguale
== uguale
!= diverso

Si noti che il C++, per evitare ambiguità sintattiche, distingue l'operatore di assegnamento (=) dall'operatore che valuta l'uguaglianza tra due espressioni (==); tale differenza simbolica sottile porta spesso ad errori banali, eppure difficili da eliminare perché non rilevati dal compilatore: si provi il seguente esempio


// ex3_2_2.cpp
// errore tipico
#include <iostream.h>
void main() {
   int a = 1;
   if (a = 2)
      cout << "cattivo!";
   else
      cout << "bravo!";
}

ebbene l'output di tale programma non è, come ci si potrebbe aspettare, ``bravo!'' bensì ``cattivo!'', perché la variabile a, che vale inizialmente $1$ viene modificata all'interno dell'espressioni condizionale dell'if; tale assegnamento per il compilatore viene valutato come una espressione vera, per un motivo che vedremo in seguito. Si presti dunque molta attenzione ad utilizzare il giusto operatore ove richiesto.

Riportiamo ora una serie di esempi commentati, i quali serviranno a meglio comprendere l'utilizzo del costrutto if.


// ex3_2_3.cpp
// calcola il quoziente tra due numeri
#include <iostream.h>
void main() {
   double x, y, q;
   cout << "x = "; cin >> x;
   cout << "y = "; cin >> y;
   if (y != 0) {
      q = x / y;
      cout << x << " : " << y << " = " << q;
   }
   else
      cout << "non si puo' dividere un numero per 0";
}

Questo esempio mostra una rudimentale tecnica di controllo dei dati in entrata: siccome se l'utente immettesse il numero $0$ come divisore avremmo dei problemi in fase di esecuzione (si provi con una qualunque calcolatrice tascabile a dividere un numero per 0, si otterrà sicuramente un errore di overflow), possiamo controllare il dato utente prima di eseguire la divisione e, se necessario, evitare tale operazione e tornare un messaggio di errore.

Il costrutto if può essere nidificato: è possibile inserire un costrutto if all'interno di un altro un numero arbitrario di volte, come vediamo nel seguente


// ex3_2_4.cpp
// risolve una eq. di II grado
#include <iostream.h>
#include <math.h>
void main() {
   double a, b, c;
   // sono i coefficienti dei termini di grado II, I e 0
   // del trinomio associato alla equazione
   cout << "a = "; cin >> a;
   cout << "b = "; cin >> b;
   cout << "c = "; cin >> c;
   if (a == 0) {              // equazione di grado I
      double x = -c / b;
      cout << "l'eq. e' di primo grado e ha come"
         " soluzione: \t" << x;
   }
   else {                     // eq. di grado II non degenere
      double delta;           // discriminante
      delta = b * b - 4 * a * c;
      if (delta == 0) { // soluzioni coincidenti
         double x = -b / (2 * a);
         cout << "l'eq. ha due soluzioni coincidenti: \t" << x;
      }
      else if (delta < 0)     // soluzioni immaginarie
         cout << "l'eq. non ha soluzioni reali";
      else {                  // soluzioni reali distinte
         double x1 = (-b + sqrt(delta)) / (2 * a);
         double x2 = (-b - sqrt(delta)) / (2 * a);
         cout << "l'eq. ha due soluzioni reali distinte:"
            "\t" << x1 << "\t" << x2;
      }  // chiude il blocco dell'else piu' vicino
   }     // chiude il blocco del primo else
}        // chiude il corpo principale

Abbiamo utilizzato la funzione (vedremo in seguito cosa essa sia esattamente) sqrt, la quale è contenuta nella libreria math.h, che abbiamo incluso ad inizio programma insieme alla iostream.h.


// ex3_2_5.cpp
// calcola la media geometrica tra due numeri reali positivi
#include <iostream.h>
#include <math.h>
void main() {
   double a, b;
   cout << "a = "; cin >> a;
   cout << "b = "; cin >> b;
   // rendiamo positivi a e b nel caso non lo fossero
   if (a < 0)
      a = -a;
   if (b < 0)
      b = -b;
   double media = sqrt(a * b);
   cout << "media = " << media;
}


// ex3_2_6.cpp
// valuta il maggiore tra tre numeri interi
#include <iostream.h>
void main() {
   int a, b, c;
   cout << "a = "; cin >> a;
   cout << "b = "; cin >> b;
   cout << "c = "; cin >> c;
   int maggiore;
   if ( (a >= b) && (a >= c) )
      maggiore = a;
   else if ( (b >= a) && (b >= c) )
      maggiore = b;
   else   // per esclusione
      maggiore = c;
   cout << "maggiore = " << maggiore;
}

ex-2
Si scriva un programma che risolva una disequazione di grado II a coefficienti reali; per semplicità si può supporre che i coefficienti del trinomio associato siano tutti non nulli.
ex-3
Si scriva un programma che accetti tre numeri interi e calcoli la media aritmetica tra i due numeri più piccoli.


next up previous contents index
Next: Costrutti ciclici: for Up: Costrutti condizionali e iterativi Previous: Gli operatori logici   Indice   Indice analitico
Claudio Cicconetti
2000-09-06