/* soluzione compito Fondamenti di Informatica (Ambiente e Territorio), 15-1-99 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 60
#define L 30

typedef enum {uno=1,due=2,tre=3} rilgio; /* per numerare le rilevazioni giornaliere */

struct el {
	unsigned short numero;
	char data[9];
	rilgio numrilgio;
	float temp,press,umid;
	struct el *pross;
};

typedef struct el elem;

/* prototipi */
	FILE *ApriFile(char *, char *);
	unsigned short Temp2Indice(float);
	void InserisciInTesta(elem *, elem **);
	void CostruisciVettore(char *, elem *[]);
	void CostruisciFile(char *, elem *[], float);
	void LeggiStringa(char *, char *);
	void StampaStruttura(elem *);
	void StampaTutto(elem *[]);


FILE *ApriFile(char *nome, char *modo)
{
	FILE *f;
	f=fopen(nome,modo);
	if(f==NULL) {
		fprintf(stderr,"Errore apertura file %s in modalita` %s. Programma terminato.\n",nome,modo);
		exit(2);
	}
	return f;
}


unsigned short Temp2Indice(float t)
/* trasforma una temperatura nell'indice corripondente nel vettore */
{
	unsigned short i;
	i=t;
	if(t<0)
		i=i-1;
	/* equivalentemente, i=floor(t), includendo <math.h> */
	
	return i;
}


void InserisciInTesta(elem *nuovo, elem **testa)
{
	nuovo->pross=*testa;		
	*testa=nuovo;
	return;
}


void CostruisciVettore(char *nomefile, elem *vett[])
/* domanda 1.2 */
{
	FILE *inputfile;
	unsigned short i,numril;
	rilgio nrilgio;
	float t,p,u; /* per leggere temperatura, pressione e umidita` da file */
	char d[9];
	int z;
	elem *nuovo;
	
	/* inizializza vettore a NULL */
	for(i=0; i<N ; i=i+1)
		vett[i]=NULL;
	
	inputfile=ApriFile(nomefile,"r");
	
	while(!feof(inputfile)) {
		z=fscanf(inputfile,"%hu %s %d %f %f %f\n", &numril, d, &nrilgio, &t, &u, &p);
		if(z==EOF)
			break;
		if(z!=6) {
			printf("Errore nel formato del file %s. Programma terminato.\n",nomefile);
			exit(1);
		}
		nuovo=malloc(sizeof(elem));
		nuovo->numero=numril;;
		strcpy(nuovo->data,d);
		nuovo->numrilgio=nrilgio;
		nuovo->temp=t;
		nuovo->press=p;
		nuovo->umid=u;
		/* inutile inizializzare a NULL il campo pross */
				
		i=Temp2Indice(t);
		InserisciInTesta(nuovo,vett+i);
		/* vett+i e` eguale a &vett[i], per l'aritmetica dei puntatori */
	}
	
	fclose(inputfile);
	return;
}



void CostruisciFile(char *nomefile, elem *vett[], float t)
/* domanda 1.3 */
{
	FILE *outputfile;
	unsigned short i;
	elem *scorri;
	
	outputfile=ApriFile(nomefile,"w");
	i=Temp2Indice(t);
	scorri=vett[i];
	while(scorri!=NULL) {
		if(scorri->temp>=t)
			fprintf(outputfile,"%s\n",scorri->data);
		scorri=scorri->pross;
	}
	for(i=Temp2Indice(t)+1; i<N; i=i+1) {
		scorri=vett[i];
		while(scorri!=NULL) {
			fprintf(outputfile,"%s\n",scorri->data);
			scorri=scorri->pross;
		}
	}
	
	fclose(outputfile);
	return;
}


void LeggiStringa(char *st, char *messaggio)
{
	printf("%s", messaggio);
	gets(st);
	return;
}


void StampaStruttura(elem *s)
{
	printf("[%hu %s %d %f %f %f] ",s->numero,s->data,s->numrilgio,s->temp,s->umid,s->press);
	return;
}

void StampaTutto(elem *vett[])
/* usata per il debugging */
{
	unsigned short i;
	elem *scorri;
	for(i=0; i<N ; i=i+1) {
		printf("\nComponente #%hu: ",i);
		scorri=vett[i];
		while(scorri!=NULL) {
			StampaStruttura(scorri);
			scorri=scorri->pross;
		}
	}

	return;
}

main(void)
{
	elem *vett[N];
	char nomefile[L];
	float t;
	
	LeggiStringa(nomefile,"Nome file di input: ");
	CostruisciVettore(nomefile,vett);
	
StampaTutto(vett);
	printf("Inserisci temperatura per costruire file di output: ");
	scanf("%f",&t);
	getchar(); /* legge il newline in avanzo */
	LeggiStringa(nomefile,"Nome file di output: ");
	CostruisciFile(nomefile, vett, t);
	
	return 0;
}