11. Tipo float

Esercizio

Acquisire ciclicamente dei numeri decimali positivi (numeri con la virgola) e stamparne la somma e la media.

Terminare l'acquisizione in corrispondenza del primo numero negativo.

Esempio di esecuzione n. 1:


Inserire una serie di numeri decimali. Terminare con -1

5.1 4.9 6.2 3.80 -1

media=5.00

totale=20.00


Esempio di esecuzione n. 2:


Inserire una serie di numeri decimali. Terminare con -1

-1

Non e' stato inserito nessun numero

media=0

totale=0


Svolgimento


#include <stdio.h>

#include <stdlib.h>

int main()

{

int n;

float tot, x, media;

printf("Inserire una serie di numeri decimali. Terminare con -1\n");

n=0;

tot=0.0;

scanf("%f", &x);

while (x>=0) {

n++;

tot=tot+x;

scanf("%f", &x);

}

if (n==0)

printf("Non e' stato inserito nessun numero\nmedia=0\ntotale=0\n");

else {

media=tot/n;

printf("media=%.2f\n", media); //%.2f limita a 2 cifre la parte decimale

printf("totale=%.2f\n", tot);

}

return 0;

}

Commento

Prestare attenzione all'allineamento del programma (il termine corretto è indentazione), cioè agli spazi inseriti prima delle istruzioni per rendere più leggibile il programma.

Il tipo float è un tipo numerico decimale (numero con la virgola).

Il separatore per la parte decimale è il punto (".") e non la virgola (",").

Nella scanf e nella printf per indicare una variabile di tipo float si usa %f , al posto del %d utilizzato per i numeri interi.

Nella printf è possibile indicare il numero di cifre decimali che si vogliono visualizzare: ad esempio printf("%.2f", x) stampa 2 cifre decimali mentre printf("%.3f", x) stampa 3 cifre decimali.

Nel programma l'istruzione tot=0.0; inizializza a zero la variabile tot assegnando un numero decimale (0.0 è un numero decimale).

Se avessimo utilizzato tot=0; l'effetto sarebbe stato lo stesso, ma formalmente avremmo assegnato un numero intero (0 è un numero intero) ad una variabile di tipo float costringendo il compilatore ad "aggiustare" i tipo (cioè a fare un'operazione di cast).

Notare che nel caso non sia inserito nessun numero positivo non viene calcolata la media ma il valore è predefinito. Si ricorda infatti che la divisione per 0 darebbe luogo ad un errore di esecuzione e il il programma si bloccherebbe.


────══════♦☆♦══════────


Esercizio

Acquisire ciclicamente i numeri di alunni presenti nelle classi di una scuola e stampare la somma degli alunni e la media per classe.

Terminare l'acquisizione in corrispondenza del primo numero negativo.

Esempio di esecuzione n. 1:


Inserire il numero di alunni per ogni classe. Terminare con -1

22 25 23 27 18 -1

media=23.00

totale=115


Esempio di esecuzione n. 2:


Inserire il numero di alunni per ogni classe. Terminare con -1

-1

Non e' stato inserito nessun numero

media=0

totale=0


Svolgimento


#include <stdio.h>

#include <stdlib.h>

int main()

{

int n, x, tot;

float media;

printf("Inserire il numero di alunni per ogni classe. Terminare con -1\n");

n=0;

tot=0;

scanf("%d", &x);

while (x>=0) {

n++;

tot=tot+x;

scanf("%d", &x);

}

if (n==0)

printf("Non e' stato inserito nessun numero\nmedia=0\ntotale=0\n");

else {

media=(float)tot/n; //poiché la divisione tra interi dà un intero occorre il cast

printf("media=%.2f\n", media); //%.2f limita a 2 cifre la parte decimale

printf("totale=%d\n", tot);

}

return 0;

}

Commento

Prestare attenzione all'allineamento del programma (il termine corretto è indentazione), cioè agli spazi inseriti prima delle istruzioni per rendere più leggibile il programma.

Ricordiamo che la divisione tra interi dà un intero pertanto un'operazione del tipo media=tot/n; non opera nel modo atteso. Essendo le variabili tot ed n di tipo intero, il risultato tot/n dà un intero; ad esempio se tot=7 e n=3 il risultato è 2 (senza parte decimale). Anche se la variabile media è di tipo float, alla variabile è assegnato il valore 2.

Per evitare questo problema, è necessario utilizzare l'operatore di cast (float).

Quando si effettua la divisione (float)tot/n; viene prima convertita la variabile tot nel tipo float e poi si effettua la divisione. In questo modo la divisione non avviene tra interi e pertanto dà luogo anche alla parte decimale e il risultato è quello atteso.


────══════♦☆♦══════────


Esercizio

Definire la funzione

float media(int n, int m)

che restituisce la media dei numeri interi n ed m.

Scrivere un programma per verificare il corretto comportamento della funzione.

Svolgimento


#include <stdio.h>

#include <stdlib.h>

float media(int a, int b)

{

int tot;

float m;

tot=a+b;

m=(float)tot/2;

return m;

}

int main()

{

int a, b;

float m;

a=-5;

b=6;

m=media(a,b);

printf("Valore atteso: 0.500\nValore calcolato: %.3f\n\n", m);

a=5;

b=6;

m=media(a,b);

printf("Valore atteso: 5.500\nValore calcolato: %.3f\n\n", m);

a=-5;

b=-6;

m=media(a,b);

printf("Valore atteso: -5.500\nValore calcolato: %.3f\n\n", m);

a=0;

b=0;

m=media(a,b);

printf("Valore atteso: 0.000\nValore calcolato: %.3f\n\n", m);

return 0;

}

Esecuzione


Valore atteso: 0.500

Valore calcolato: 0.500

Valore atteso: 5.500

Valore calcolato: 5.500

Valore atteso: -5.500

Valore calcolato: -5.500

Valore atteso: 0.000

Valore calcolato: 0.000

Commento

Prestare attenzione all'allineamento del programma (il termine corretto è indentazione), cioè agli spazi inseriti prima delle istruzioni per rendere più leggibile il programma.


────══════♦☆♦══════────

Esercizio

Definire la funzione

int arrotondamento(float f)

che riceve un numero in virgola mobile di tipo float e restituisce un numero intero arrotondato.

Ad esempio in corrispondenza di 3.2 restituisce l'intero 3 mentre nel caso di 3.5 restituisce 4.

Scrivere un programma per verificare il corretto comportamento della funzione.

Svolgimento


#include <stdio.h>


int arrotondamento(float f)

{

int n;

n = (int)(f+0.5);

return n;

}


int main()

{

int n;


n=arrotondamento(3.2);

printf("arrotondamento di 3.2; atteso 3; esito: %d\n", n);


n=arrotondamento(3.5);

printf("arrotondamento di 3.5; atteso 4; esito: %d\n", n);


n=arrotondamento(3.0);

printf("arrotondamento di 3.0; atteso 3; esito: %d\n", n);


return 0;

}


Esecuzione


arrotondamento di 3.2; atteso 3; esito: 3

arrotondamento di 3.5; atteso 4; esito: 4

arrotondamento di 3.0; atteso 3; esito: 3


Commento

L'operazione di cast ad intero applicato ad un float effettua un troncamento.

E' sufficiente incrementare do 0.5 il valore di partenza per ottenere l'arrotondamento richiesto.

Ad esempio 3.6+0.5 vale 4.1 che troncato da 4 mentre 3.2+0.5 vale 3.7 che troncato da 3.