if (condizione) statement
else statement
|
//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 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 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; }