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:
-
Le variabili vengono create all'inizio del blocco in cui sono definite.
Vengono distrutte quando si esce dal blocco. Ad esempio, mettendo sotto
osservazione col debugger la variabile media, Rhide potrebbe fornire
i seguenti valori:
-
not available (non disponibile) finché il programma non viene
eseguito
-
13121 (valore casuale) quando si oltrepassa l'inizio blocco (la
parentesi graffa)
-
19 (risultato del calcolo) dopo aver superato l'assegnamento
-
not available (non disponibile) quando si esce dal blocco (si oltrepassa
la parentesi graffa)
-
Il calcolo viene effettuato con una divisione intera, quindi il risultato
è approssimato. Anche definendo media di tipo float il
calcolo viene effettuato con divisione intera. Infatti, l'operatore di
divisione è sovraccaricato (overloaded): esso ha più significati
(divisione intera, divisione fra reali, ...). Quindi viene selezionato
l'operatore da usare in base al tipo degli argomenti, non di quello
del risultato. Quindi, per ottenere una divisione reale, si devono inserire
argomenti reali, ad esempio così:
float
media = (a+b+c)/3.0;
Esercizio 2
-
Progettare e Codificare in C (scrivendolo in voto1.c) un programma
che permetta il calcolo della media di tre voti dati in trentesimi. La
media deve essere fornita in centesimi o trentesimi a seconda del valore
assunto da una variabile scala di tipo carattere
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
-
Progettare e Codificare in C un programma che calcoli il valore assoluto
di un numero x.
main()
{ int x=10,val_ass;
val_ass = (x>0 ?
x : (-x));
}
Esercizio 4
-
Progettare e Codificare in C il programma che data una quantità
di soldi in lire restituisca la quantità corrispondente in euro
(/2000) o in dollari (/2500), a seconda del valore assunto da una variabile
moneta
di tipo char.
main()
{
int lire=18000,conv;
char moneta='e';
conv = (moneta=='e'
? lire/2000 : lire/2500);
}