Stampa di numeri decimali

Messaggioda SalvatCpo » 17/08/2018, 19:32

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


Codice:
#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");
}
SalvatCpo
Average Member
Average Member
 
Messaggio: 154 di 726
Iscritto il: 30/12/2017, 17:55

Re: Stampa di numeri decimali

Messaggioda vict85 » 17/08/2018, 20:19

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

Il problema è che il codice:
Codice:
int numeratore = 1;
int denominatore = 2;
float divisione = numeratore/denominatore;
è equivalente a
Codice:
int numeratore = 1;
int denominatore = 2;
int divisione_int = numeratore/denominatore;
float divisione = (float) divisione_int
e non a
Codice:
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ì:
Codice:
int numeratore = 1;
int denominatore = 2;
float divisione = (float) numeratore/denominatore;
perché il cast ha precedenza rispetto alla divisione.
vict85
Moderatore
Moderatore
 
Messaggio: 9361 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Stampa di numeri decimali

Messaggioda SalvatCpo » 17/08/2018, 20:52

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

Codice:
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);
}
SalvatCpo
Average Member
Average Member
 
Messaggio: 155 di 726
Iscritto il: 30/12/2017, 17:55

Re: Stampa di numeri decimali

Messaggioda Super Squirrel » 18/08/2018, 11:34

Nella funzione inserimento() acquisisci goal e minuti come float e non come int.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 278 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Stampa di numeri decimali

Messaggioda SalvatCpo » 18/08/2018, 12:11

Ok, ok, quello è un errorino di distrazione, ora va. Ho capito come funziona :).
SalvatCpo
Average Member
Average Member
 
Messaggio: 156 di 726
Iscritto il: 30/12/2017, 17:55

Re: Stampa di numeri decimali

Messaggioda Super Squirrel » 18/08/2018, 15:28

Con un po' di debug l'errorino di distrazione l'avresti potuto trovare anche da solo! :roll:
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 279 di 1486
Iscritto il: 16/05/2013, 22:05


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite