Mi potete aiutare con questo esercizio?

di il
4 risposte

Mi potete aiutare con questo esercizio?

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

4 Risposte

  • Re: Mi potete aiutare con questo esercizio?

    Sinceramente non ho capito in cosa potrei aiutarti visto che hai ben chiaro il meccanismo di come dovrebbe funzionare il programma.
    immetti una funzione di conversione dei tempi nel formato classico mm:ss:cc
    ricordati quando fai la funzione che 100 centesimi = 1 secondo e 60 secondi = 1 minuto.
    comunque se vuoi essere aiutato scrivi dove hai il problema.
  • Re: Mi potete aiutare con questo esercizio?

    Salve
    grazie per la risposta
    il mio problema consiste nel non saper svolgere il punto 3 fondamentalmente, non capisco come riuscirci!
  • Re: Mi potete aiutare con questo esercizio?

    Per i primi 6 gli dai un ciclo for al contrario con N=5 che scende di uno a ogni passaggio.
    Sempre nel ciclo for immetti un altro ciclo annidato con magari un vettore che confronta i tempi e poi li stampa a schermo.
  • Re: Mi potete aiutare con questo esercizio?

    Grazie mille! ora so come procedere !
Devi accedere o registrarti per scrivere nel forum
4 risposte