Corso di Laboratorio di Informatica

Espressioni semplici e condizionali


Esercizio 1

Progettare un algoritmo che dati tre numeri (voti) a, b, c che possono assumere i valori interi da 18 a 30, calcoli la loro media.

main()

{
    int a,b,c,media;
    a=18;
    b=19;
    c=22;
    media = (a+b+c)/3;
}
 
Provando poi ad eseguire il programma con il debugger (modificando il valore attribuito inizialmente alle variabili), si potevano fare le seguenti osservazioni:
float media = (a+b+c)/3.0;

Esercizio 2

main()
{
    int a,b,c,media;
    a=18; b=19; c=22;
    char scala='t';
    media = (scala=='t' ? (a+b+c)/3 : (a+b+c)/3*100/30);
}


Nota: Si sconsiglia la seguente soluzione (che pure in C funziona):

main()

{
    int a,b,c,media;
    a=18; b=19; c=22;
    char scala='t';
    (scala=='t' ? media=(a+b+c)/3 : media=(a+b+c)/3*100/30);
}
 
In questo caso, gli assegnamenti vengono effettuati come effetti collaterali all'interno della valutazione di un'espressione; il risultato dell'espressione viene poi scartato. Ovvero:  (Cond ? RisTrue : RisFalse) è un operatore ternario (che ha 3 argomenti) e restituisce un valore. Se la condizione Cond è vera, restituisce il risultato dell'espressione RisTrue, altrimenti restituisce il risultato dell'espressione RisFalse. Quindi viene effettuato il confronto scala=='t', se questo è vero viene valutata l'espressione media=(a+b+c)/3, che calcola la media dei 3 numeri, effettua come effetto collaterale l'assegnamento e restituisce il valore. Questo valore viene poi scartato. Come paragone, si pensi al seguente programma (corretto, in C):
 
main()
{int a,b;
(a=3) * (b=5);}
 
viene effettuato l'assegnamento a=3, che restituisce 3, poi viene effettuato b=5, che restituisce 5, poi viene effettuato il prodotto (15), che viene scartato.

Esercizio 3

main()
{   int x=10,val_ass;
    val_ass = (x>0 ? x : (-x));
}

Esercizio 4

main()
{
    int lire=18000,conv;
    char moneta='e';
    conv = (moneta=='e' ? lire/2000 : lire/2500);
}