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!
