DOMANDA Linguaggio C,ho un problema nel 4 e 5 punto nel testo che posterò di seguito

Davide9898

Nuovo Utente
17
0
Creare un programma che, attraverso la dichiarazione di una struttura opportuna, permetta di
gestire i dati relativi a giocatori di calcio. Ogni struttura comprenderà valori relativi a nome,
numero di titoli conseguiti, percentuale di realizzazione. Il programma deve permettere di:

Inserire un nuovo giocatore
Stampare i dati in ordine di immissione
C:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define V_DIM 1000
#define MAXLEN 255

struct calciatore{

   char nome[MAXLEN];
   int titoli, soglia;
   float goal;
};

void print_calc(struct calciatore c);
void salva_su_file(struct calciatore nuovo_calc[V_DIM],int n_calc,char file_name[]);

int main(){

  struct calciatore nuovo_calc[V_DIM];
  int n_calc=0, count=0;
  float media;
  FILE *fp;
  char my_line[100];
 
  while(1)
{
   printf("Inserisci il nome: ");
   scanf("%s",nuovo_calc[n_calc].nome);

   if(strcmp(nuovo_calc[n_calc].nome,"fine")==0)
      break;
  
    printf("Inserisci il numero di titoli vinti: ");
    scanf("%d",&nuovo_calc[n_calc].titoli);

   printf("Inserisci la percentuale di realizzazione in goal: ");
   scanf("%f",&nuovo_calc[n_calc].goal);

   print_calc(nuovo_calc[n_calc]);
 
   float soglia=nuovo_calc[n_calc].goal;

   if(soglia>= 8)
   {
      salva_su_file(nuovo_calc,n_calc,"file_calc.txt");
      
    }
    

   count+=nuovo_calc[n_calc].titoli;
    
    n_calc++;

    if(n_calc==V_DIM)
    break;
  
}
    fp = fopen("file_calc.txt","r");

    while (fscanf(fp, "%s", my_line)>0)
    {
        printf("%s\n", my_line);

    }


    fclose(fp);



   media=(float)count/n_calc;
   printf("La media dei titoli vinti e':%.3f\n",media);


return 0;
}

void print_calc(struct calciatore c)
{
   printf("%s\t",c.nome);
   printf("%d\t",c.titoli);
   printf("%.3f\t\n",c.goal);

}

void salva_su_file(struct calciatore nuovo_calc[V_DIM],int n_calc,char file_name[])
{
    FILE *fp;
    int i;
  
    fp=fopen(file_name,"w");
    if(fp==NULL)
    {
       printf("Impossibile aprire il file %s\n",file_name);
       return;
     }

      for(i=0;i<n_calc;i++)
     {
        fprintf(fp, "%s %d %f\n",nuovo_calc[i].nome,nuovo_calc[i].titoli,nuovo_calc[i].goal);
     }
    
    fclose(fp);

}
Calcolare il numero medio di titoli per i giocatori immessi
Salvare su un file tutte i giocatori con percentuale maggiore di una soglia<<--
Leggere i dati da file<<--

Allego il codice di seguito,di fatto il programma non da errori e compila a dovere,tuttavia non mi stampa nel file.txt i valori che superano una certa 'soglia'(vedi codice)-->
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,944
11,580
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
il n. di goal è un intero (hai mai visto un calciatore che segna 3,14 goal?), invece la soglia, in quanto percentuale, è un numero in virgola mobile (meglio double che float)
 
  • Mi piace
Reazioni: Sysken

Sysken

Nuovo Utente
51
20
Ciao @Davide9898,
Ti consiglio di gestire il tutto mediante un menù, simulato da uno switch (È l'utente a decidere quale operazione compiere). Il while true non è una scelta molto elegante, tanto meno quel break che viola le "regole di buona programmazione".
Per quanto riguarda la gestione dei dati ti consiglio l'utilizzo di una struttura dati dinamica, in questo modo non sei vincolato da una dimensione massima e la stampa di per sè viene semplificata, questo perché inserendo sempre i dati da testa la stampa avviene già nell'ordine richiesto, ossia quello di immissione.
Ovviamente nel menù non dovràeessere presente la scelta di poter salvare dati ne file. Questo perchè l'inserimento nel file dovrà avvenire durante l'inserimento nella struttura dinamica.
Quoto inoltre quello che già ti è stato riferito da Bat.

Apportando queste migliorie sarà più semplice apportare modifiche e scovare errori.
 
Ultima modifica:
  • Mi piace
Reazioni: Davide9898

Andretti60

Utente Èlite
6,440
5,091
Il programma non funziona perché tutte le volte che scrivi nel file lo apri in modo scrittura, quindi cancellandolo prima di scrivere un record.
Hai alternative per esempio
1) fai tutto in memoria, e salva il file solo alla fine (la mia preferita)
2) apri il file solo una volta e chiudilo alla fine (non mi piace perché non mi piace tenere risorse aperte)
3) apri il file tutte le volte, la prima volta in modo scrittura, le altre in modo "append".
 
  • Mi piace
Reazioni: Davide9898

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili