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.
Sito: 7ecnologie
Sezione: 08. C language
Capitolo: 05. Esercizi svolti
Paragrafo: 11. Tipo float
Indice dei capitoli: 00. Risorse - 01 Ambiente di sviluppo - 02. Introduzione al C - 03. Le librerie - 04. Tutorial - 05. Esercizi svolti - 98. Esercizi
Indice dei paragrafi: 01. printf e scanf - 02. Swap di variabili - 03. if - 04. Numeri pari - 05. if/else - 06. while - 07. Controllo dell'input - 08. for - 09. Operatore % - 10. Funzioni - 11. Tipo float - 12. Tipo char - 13. Stringhe - 14. File