- Codice: Seleziona tutto
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLAPFILE 20
#define MAXLN 80
#define MAXPLACE 3
typedef struct laps
{
int lap;
char lapfile[MAXLAPFILE];
}laps;
typedef struct readlap
{
int drivenum;
char drivename[MAXLAPFILE];
char team[MAXLAPFILE];
int laptime;
}readlap;
typedef struct pilot_t
{
int lap;
int drivenum;
char drivename[MAXLAPFILE];
char team[MAXLAPFILE];
int laptime;
struct pilot_t *next;
}pilot_t;
pilot_t *charge_list(int lap, FILE *fp, pilot_t *head);
void print_fastest(pilot_t *head);
void print_three_bests(pilot_t *head);
pilot_t *take_out(pilot_t *head, char drivename);
int main()
{
char fpIN[MAXLN];
FILE *fp, *fp2;
laps *tmp;
pilot_t *head=NULL;
printf("Inserire nome file input:");
scanf("%s", fpIN);
if((fp=fopen(fpIN,"r"))==NULL)//controllo apertura file
{
printf("Errore apertura file");
return EXIT_FAILURE;
}
if((tmp=(laps *)malloc(sizeof(laps)))==NULL)//allocazione dinamica struct per primo file
{
printf("Errore allocazione memoria");
return EXIT_FAILURE;
}
while(!feof(fp))
{
fscanf(fp, "%d %s", &(*tmp).lap,(* tmp).lapfile);
if((fp2=fopen((*tmp).lapfile,"r"))==NULL)
{
printf("Errore apertura file");
return EXIT_FAILURE;
}
while(!feof(fp2))
head=charge_list((*tmp).lap, fp2, head);//caricamento lista
}
free(tmp);//rimozione struct primo file, è inutile dopo aver caricato la lista
fclose(fp);//chiusura file, è inutile dopo aver caricato la lista
fclose(fp2);//come sopra
print_fastest(head);//giro più veloce
print_three_bests(head);//tre piloti più veloci
return EXIT_SUCCESS;
}
pilot_t *charge_list(int lap, FILE *fp, pilot_t *head)//carica lista
{
pilot_t *tmp;
readlap tmplap;
if((tmp=(pilot_t *)malloc(sizeof(pilot_t)))==NULL)
{
printf("Errore allocazione memoria");
exit(1);
}
fscanf(fp, "%d %s %s %d", &tmplap.drivenum, tmplap.drivename, tmplap.team, &tmplap.laptime);
tmp->lap=lap;
tmp->drivenum=tmplap.drivenum;
strcpy(tmp->drivename, tmplap.drivename);
strcpy(tmp->team, tmplap.team);
tmp->laptime=tmplap.laptime;
tmp->next=head;
head=tmp;
return head;
}
void print_fastest(pilot_t *head)//cerca e stampa a video il giro più veloce
{
pilot_t *s, *t;
s=head;
t=head;
while(s!=NULL)
{
if(s->laptime < t->laptime)
t=s;
s=s->next;
}
printf("Giro veloce: %s, %s, %d secondi, giro %d", t->drivename, t->team, t->laptime, t->lap);
}
void print_three_bests(pilot_t *head)
{
pilot_t *s, *temp=NULL, *ctemp, *t;
int i;
s=head;
while(s!=NULL && s->lap==1)//crea lista temporanea primo giro
{
if((ctemp=(pilot_t *)malloc(sizeof(pilot_t)))==NULL)
{
printf("Errore allocazione memoria");
exit(1);
}
ctemp->lap=s->lap;
ctemp->drivenum=s->drivenum;
strcpy(ctemp->drivename, s->drivename);
strcpy(ctemp->team, s->team);
ctemp->laptime=s->laptime;
ctemp->next=temp;
temp=ctemp;
s=s->next;
}
t=temp;
while(t!=NULL)//somma tempi complessivi
{
t->laptime=0;
while(s!=NULL)
{
if(strcmp(s->drivename, t->drivename)==0)
t->laptime+=s->laptime;
s=s->next;
}
t=t->next;
}
s=temp;
for(i=0;i<MAXPLACE;i++)
{
while(s!=NULL)//cerca il più piccolo
{
if(s->laptime < t->laptime)
t=s;
s=s->next;
}
printf("%d %s, %s, %d secondi", i+1, t->drivename, t->team, t->laptime);
temp=take_out(temp, t->drivename);
}
}
pilot_t *take_out(pilot_t *head, char drivename)
{
pilot_t *s, *t;
if(strcmp((*head).drivename, drivename)==0)
{
s=head;
head=head->next;
free(s);
}
else
{
s=head;
while(s!=NULL)
if(strcmp(drivename, (*s).drivename)==0)
{
t=s->next;
free(s);
}
}
return head;
}
questo programma legge da un primo file strutturato come nella struct laps, che contiene per ogni giro il nome di un file da aprire strutturato come la struct readlap.
Deve stampare a video il pilota più veloce in uno specifico giro e i tre piloti complessivamente più veloci..
mi da dei warning di troppo che credo siano la causa del segmentation fault che ottengo in esecuzione...
vi prego aiutatemi!




