Buongiorno, ho creato questo post perchè proprio non capisco cosa è che ho sbagliato nel codice. Non so magari è un errore di struct visto che faccio un pò fatica a comprendere come strutturarle di solito.
Testo esercizio: "Un insegnante di un liceo memorizza in un file tutti i voti conseguiti dai suoi studenti nelle verifiche dell’anno scolastico in corso. Il formato del file può essere dedotto dall’esempio a fianco. I nomi possono essere costituiti da più parole separate da uno spazio. Il numero massimo di voti per studente è 50 e il numero massimo di studenti è 100. Scopo dell’esercizio è generare un file di testo contenente, per ogni studente, l’elenco dei voti conseguiti e la media (arrotondata alla prima cifra decimale), nel formato che si può dedurre dall’esempio a fianco (attenzione al formato della data!). Gli studenti in tale file devono comparire nell’ordine in cui compaiono per la prima volta nel file di ingresso. Anche i voti devono
comparire nell’ordine in cui si trovano nel file di ingresso. Al termine dell’elenco dei voti di ogni studente deve essere scritta la media e una riga bianca di separazione dallo studente successivo (o dalla fine del file, nel caso dell’ultimo studente). Si scriva un programma in linguaggio C che riceva sulla linea di comando il nome di un file di ingresso e di un file di uscita e scriva nel file di uscita l’elenco dei voti conseguiti e la media come sopra descritto."
Formato file di input:
"Degli Specchi, Paola, 10/11/2020, 8.
Vignoni, Pier Paolo, 8/1/2021, 6.
Vai, Ugo, 10/11/2020, 10.
Degli Specchi, Paola, 7/12/2020, 9.
Vai, Ugo, 10/11/2020, 3.
Della Valle Di Sotto, Luigi, 7/12/2020, 5."
Formato file output:
"Paola Degli Specchi
2020-11-10 8
2020-12-7 9
MEDIA: 8.5
Pier Paolo Vignoni
2021-1-8 6
MEDIA: 6.0
Ugo Vai
2020-11-10 10
2020-11-10 3
MEDIA: 6.5
Luigi Della Valle Di Sotto
2020-12-7 5
MEDIA: 5.0MEDIA: 5.0
Codice scritto da me:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max_studenti 100
#define max_voti 50
struct _studente{
char nome[20];
char cognome[30];
int cnt_voti;
double media;
struct _voto{
int voto;
struct _data{
int giorno;
int mese;
int anno;
} data;
}voto[max_voti];
}studente[max_studenti];
int main (int argc, char *argv[])
{
//argc di 3 file
if(argc != 3)
{
printf("Inserire file di input e file di output");
exit(EXIT_FAILURE);
}
//apertura file
FILE *fp;
fp = fopen(argv[1], "r");
int j, i;
char TempStringCognome[60];
char TempStringNome[60];
char ch, ca;
int token;
char cognome[30];
char nome[40];
ch=getchar();
ca=getchar();
for(j=0; j<max_studenti; j++)
{
studente[j].cnt_voti = 0;
fgets(TempStringCognome, 60, fp);
int N=0;
int M=0;
while (ch!=',')
{
ch=TempStringCognome[N];
cognome[N]=ch;
N++;
ch=getchar();
}
cognome[N]='\0';
//nome
while (ca!=',')
{
ca = TempStringNome[M];
nome[M]=ca;
M++;
ca = getchar();
}
nome[M]='\0';
//verifica se cognome già presente
token =0;
for (i=0; i<max_studenti; i++)
{
if (strcmp(cognome, studente[i].cognome) == 0)
{
strcpy(studente[i].cognome, cognome);
strcpy(studente[i].nome, nome);
fscanf(fp,"%d %d %d %d", &studente[i].voto->data.giorno, &studente[i].voto->data.mese,
&studente[i].voto->data.anno, &studente[i].voto->voto);
token = 1;
studente[i].cnt_voti = studente[i].cnt_voti + 1;
}
}
if(token == 0)
{
strcpy(studente[j].cognome, cognome);
strcpy(studente[i].nome, nome);
fscanf(fp, "%d %d %d %d", &studente[j].voto->data.giorno, &studente[j].voto->data.mese,
&studente[j].voto->data.anno, &studente[j].voto->voto);
studente[j].cnt_voti = 1;
}
}
fclose(fp);
//calcolo media
for(j=0; j<max_studenti; j++)
{
for(i=0; i<max_voti; i++)
{
studente[j].media = studente[j].media +studente[j].voto[i].voto;
}
studente[j].media = (studente[j].media/studente[j].cnt_voti);
}
//scrittura file in uscita
fp = fopen(argv[2], "w");
for (i=0; i<max_studenti; i++)
{
fprintf(fp, "%s %s \n", studente[i].nome, studente[i].cognome);
for(j=0; j<studente[i].cnt_voti; j++)
{
fprintf(fp, "%d-%d-%d %d\n", studente[i].voto[j].data.anno, studente[i].voto[j].data.mese, studente[i].voto[j].data.giorno,
studente[i].voto[j].voto);
}
fprintf(fp,"MEDIA: %.1f", studente[i].media);
}
fclose(fp);
return(EXIT_SUCCESS);
}
Se qualcuno riuscisse ad aiutarmi magari dandomi qualche consiglio o dirmi dove sbaglio ne sarei molto grato.
Grazie in anticipo!