Salve a tutti
devo fare un esercizio su una gara di slalom.
questo è ciò che devo fare:
E' dato un file di testo "concorrenti.txt" contenente queste informazioni: N. Pettorale,Nome,Anno di nascita,Nazione, ciascuna su una riga di file.
il programma deve
1. caricare da file la lista dei concorrenti ordinata per numero di pettorale;
2.simulare la prima manche: ad ogni pressione di un tasto si fa partire un concorrente nell'ordine del numero di pettorale. il tempo di discesa viene calcolato con una funzione random che deve restituire un valore in centesimi di secondo (tra 6000 e 12000). i concorrenti che effettuano tempi superiori a 10000 centesimi di secondo sono considerati ritirati
per ogni discesa viene visualizzato il tempo realizzato dal concorrente nel formato mm:ss:cc (minuti:secondi:centesimi) e la classifica aggiornata dei primi sei concorrenti con i tempi migliori.
alla fine della prima manche si stampano i risultati e la lista di ritirati.
3. simulare la seconda manche dove partono i sei concorrenti con i tempi migliori in ordine inverso (prima il sesto poi il quinto ecc...),ed i restanti nell'ordine di arrivo della prima manche (settimo,ottavo...)
ad ogni discesa viene visualizzata la classifica dei primi sei concorrenti con i tempi migliori. anche la seconda manche resta valido il discorso che se si supera i 10000 centesimi di secondo è da considerarsi ritirato. se il tempo è valido va sommato a quello della prima manche
alla fine della seconda manche si stampano i risultati finali della prima manche e la lista dei ritirati.
io ho creato due file di intestazione uno che contiene:
#ifndef _TIPODATI
#define _TIPODATI
typedef struct{
int n_pet;
char nome[40];
int anno;
char naz[4];
int tempo;
}SInfo;
#endif
e l'altro :
// prototipi delle funzioni esportate
#ifndef _LISTE
#define _LISTE
#include "tipodati.h"
typedef struct _SNodo
{
SInfo info;
struct _SNodo* next;
}SNodo;
void InsOrdinato(SNodo** p, SNodo* n);
void InsTesta(SNodo** p, SNodo* n);
SNodo* EstraiTesta(SNodo** p);
void InsCoda(SNodo** p, SNodo** u, SNodo* n);
#endif
poi ho creato 2 file di origine
il primo:
#include "liste.h"
void InsOrdinato(SNodo** p, SNodo* n)
{
if (*p==0)
InsTesta(p, n);
else
if((*p)->info.n_pet > n->info.n_pet)
InsTesta(p, n);
else
{
SNodo* cor= (*p)->next;
SNodo* prec = *p;
while(cor)
{
if(cor->info.n_pet > n->info.n_pet)
break;
prec=cor;
cor=cor->next;
}
InsTesta(&prec->next, n);
}
}
void InsTesta(SNodo** p, SNodo* n)
{
n->next = *p;
*p = n;
}
SNodo* EstraiTesta(SNodo** p)
{
SNodo* app=*p;
if(*p)
*p = (*p)->next;
return app;
}
void InsCoda(SNodo** p, SNodo** u, SNodo* n)
{
if(*p==0)
*p=n;
else
(*u)->next=n;
*u=n;
n->next=0;
}
e il secondo:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include "tipodati.h"
#include "liste.h"
#include<time.h>
#include<memory.h>
int LeggiFile(char*nomefile,SNodo**p,SNodo*rit);
SNodo* p;
SNodo* n;
SNodo* cor;
SNodo* rit;
SNodo* u;
//main
void main (void){
srand( (unsigned)time( NULL ) );
LeggiFile("concorrenti.txt",&p,&rit);
cor=p;
while(cor)
{
printf("%3i %-24s %4i %s %i \n",cor->info.n_pet,cor->info.nome,cor->info.anno,cor->info.naz,cor->info.tempo);
cor=cor->next;
}
printf("\n\n");
printf("I ritirati sono: \n\n");
cor=rit;
while(cor)
{
printf("%3i %-24s %4i %s %i\n",cor->info.n_pet,cor->info.nome,cor->info.anno,cor->info.naz,cor->info.tempo);
cor=cor->next;
}
system("pause");
}
//sottoprogramma
int LeggiFile(char*nomefile,SNodo**p,SNodo**rit)
{
SInfo x;
FILE*f;
int k;
SNodo* app;
f= fopen(nomefile,"r");
if(f==NULL)
return 0;
*p=0;
*rit=0;
app=0;
while((k=fscanf(f,"%i,%[^,],%i,%s",&x.n_pet,x.nome,&x.anno,x.naz)) > 0)
{
x.tempo=6000+(6000*rand()/RAND_MAX);
app = (SNodo*) malloc (sizeof(SNodo));
n = (SNodo*) malloc (sizeof(SNodo));
n->info=x;
app->info = x;
if(app->info.tempo > 10000)
InsOrdinato(rit,app);
InsOrdinato(p, n);
}
fclose(f);
return 1;
}
quindi ho ordinato concorrenti.txt per numero di pettorale e ho effettuato la funzione rand per il tempo (che non viene visualizzato con mm:ss;cc ma solo centesimi tipo 6532 ecc...)
per favore aiutatemi dandomi delle dritte