Stampa di numeri decimali

SalvatCpo
Ho provato a compilare e l'eseguibile funziona correttamente fornendo le risposte giuste quando invento e inserisco dei dati.
Però quando stampa la media (la media goal) mi esce sempre 0.0000, anche quando il suo valore vero è 0.2 o poco più basso.
Anche dichiarando nella struct player le variabili goal e minuti come float (essendo questi due i valori usati per calcolare la media), il problema sussiste.
Grazie in anticipo. :D


#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//Crea un programma contenente una funzione che genera un elenco di calciatori ed una funzione che
//seleziona il migliore di loro in base alla media gol.
typedef struct player {
	char cognome[20];
	int goal;
	int minuti;
} player;
typedef player elenco[20];
void inserimento (elenco e, int *k);
void bestgoleador (elenco e, int k);
int main () {
elenco z;
int m=0;
int a=1;
while (a>0)
{
	inserimento (z, &m);
	printf ("digita 0 per terminare gli inserimenti, altrimenti digitare altro numero:  ");
	scanf ("%d", &a);
}
bestgoleador (z, m);
system ("PAUSE");
return 0;
}
void inserimento (elenco e, int *k)
{
	printf ("inserisci cognome: ");
	scanf ("%s", &e[*k].cognome);
	printf ("inserisci il numero di goal: ");
	scanf ("%f", &e[*k].goal);
	printf ("inserisci il numero di minuti giocati: ");
	scanf ("%f", &e[*k].minuti);
	*k=*k+1;
}
void bestgoleador (elenco e, int k)
{
	int i=0, s=0;
	float med, c;
	med=e[i].minuti/e[i].goal;
	i=1;
	while (i<k)
	{
		c=e[i].minuti/e[i].goal;
		if (c>med)
		{
			med=c;
			s=i;
		}
		i++;	
	}
	printf ("il miglior goleador è:  %s  ", e[s].cognome);
	printf ("con una media di %f goal al minuto\n");
}

Risposte
vict85
Devo dire che le conversioni automatiche del C/C++ creano molta confusione tra i neofiti.

Il problema è che il codice:
int numeratore = 1;
int denominatore = 2;
float divisione = numeratore/denominatore;
è equivalente a
int numeratore = 1;
int denominatore = 2;
int divisione_int = numeratore/denominatore;
float divisione = (float) divisione_int
e non a
int numeratore = 1;
int denominatore = 2;
float numeratore_float = (float) numeratore;
float denominatore_float = (float) denominatore;
float divisione = numeratore_float/denominatore_float;


Puoi risolvere semplicemente così:
int numeratore = 1;
int denominatore = 2;
float divisione = (float) numeratore/denominatore;
perché il cast ha precedenza rispetto alla divisione.

SalvatCpo
Ho ancora problemi. Mi stampa un numero ma è sbagliato. Divisore e dividendo sono dichiarati come interi.

void bestgoleador (elenco e, int k)
{
	int i=0, s=0;
	float med = (float) e[i].goal/e[i].minuti;
	i=1;
	while (i<k)
	{
		float c = (float) e[i].goal/e[i].minuti;
		if (c>med)
		{
			med=c;
			s=i;
		}
		i++;	
	}
	printf ("il miglior goleador è:  %s  ", e[s].cognome);
	printf ("con una media di %f goal al minuto\n", med);
}

Super Squirrel
Nella funzione inserimento() acquisisci goal e minuti come float e non come int.

SalvatCpo
Ok, ok, quello è un errorino di distrazione, ora va. Ho capito come funziona :).

Super Squirrel
Con un po' di debug l'errorino di distrazione l'avresti potuto trovare anche da solo! :roll:

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.