Stampa di numeri decimali
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.
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.
#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
Devo dire che le conversioni automatiche del C/C++ creano molta confusione tra i neofiti.
Il problema è che il codice:
Puoi risolvere semplicemente così:
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_inte 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.
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);
}
Nella funzione inserimento() acquisisci goal e minuti come float e non come int.
Ok, ok, quello è un errorino di distrazione, ora va. Ho capito come funziona
.
Con un po' di debug l'errorino di distrazione l'avresti potuto trovare anche da solo!