#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>

struct dati{   			//struttura dati contenente i dati di ogni misurazione
	char Luogo[20];      //Luogo della misurazione
	int Data[3];         //data della misurazione ( Data[0] = giorno, Data[1] = mese, Data[2] = anno )
	int Ora[2];          //ora della misurazione ( Ora[1] = Ora, Ora[2] = minuti )
	int Misurazione;     //valore della misurazione
};

void Reg_Luogo(dati*, char*);  //Verifica se una registrazione è avvenuta nel luogo inserito
void Reg_Mis(dati*, int);		 //Verifica se una registrazione ha valore uguale a quello inserito
int Del_Reg(dati*, int*);		 //cancella una registrazione eseguita nella data inserita
void Vis_Misurazione(dati*);   //Visualizza i dati di una misurazione

void main(){
	int inseriti=0;             //flag per controllare se i dati sono stati inseriti
	int cont_del=0;             //contatore delle registrazioni cancellate utilizzando la funzione Del_Reg
	int esci=0;						 //flag che controlla l'uscita dal programma
	dati Misurazioni[10];       //array di strutture di tipo dati
	while(esci==0){

	/* Visualizzazione menu di scelta */
	clrscr();
	cout<<"MENU DI SCELTA:\n"<<endl;
	cout<<"1. Inserimento dati"<<endl;
	cout<<"2. Visualizzazione Precipitazioni di un determinato luogo"<<endl;
	cout<<"3. Visualizzazione Precipitazioni con misurazione maggiore di quella inserita"<<endl;
	cout<<"4. Eliminazione registrazioni relative alla data inserita"<<endl;
	cout<<"5. Esci dal Programma"<<endl;
	int scelta;
	cin>>scelta;
	switch(scelta){
		case 1:		//inserimento dati
			int i;
			clrscr();
			for(i=0; i<10; i++){
				clrscr();
				cout<<(i+1)<<"° REGISTRAZIONE\n"<<endl;
				cout<<"Inserire il luogo della registrazione: ";
				gets(Misurazioni[i].Luogo);
				cout<<"Inserire la data della misurazione: "<<endl;
				cout<<"Giorno: "; cin>>Misurazioni[i].Data[0];
				cout<<"Mese: "; cin>>Misurazioni[i].Data[1];
				cout<<"Anno: "; cin>>Misurazioni[i].Data[2];
				cout<<"Inserire l'ora della misurazione: "<<endl;
				cout<<"Ora: "; cin>>Misurazioni[i].Ora[0];
				cout<<"Minuti: "; cin>>Misurazioni[i].Ora[1];
				cout<<"Inserire il valore della misurazione effettuata: ";
				cin>>Misurazioni[i].Misurazione;
			}
			inseriti=1;
		break;
		case 2:
			if(inseriti==1){    //controlla se sono già stati inseriti i dati delle registrazioni
			clrscr();
			char Luogo[20];
			cout<<"Inserire il luogo da ricercare:";
			gets(Luogo);

			/* per ogni registrazione, richiama la funzione Reg_Luogo passando l'indirizzo di inizio della struttura dati e
			l'indirizzo della stringa contenente il luogo da ricercare*/

			for(i=0; i<10; i++){
				Reg_Luogo(&Misurazioni[i], Luogo);
			}
			cout<<"\nNon sono stati trovate altre registrazioni.\nPremere un tasto per continuare...";
			getch();
			}
			else{
				cout<<"\nNon sono ancora stati inseriti i dati"<<endl;
				cout<<"Premere un tasto per continuare...";
				getch();
			}
		break;
		case 3:
			if(inseriti==1){    //controlla se sono già stati inseriti i dati delle registrazioni
			clrscr();
			int Misurazione;
			cout<<"Inserire il valore da ricercare: ";
			cin>>Misurazione;
			/* per ogni registrazione, richiama la funzione Reg_Mis passando l'indirizzo di inizio della struttura dati e
			il valore della misurazione da ricercare*/
			for(i=0; i<10; i++){
				Reg_Mis(&Misurazioni[i], Misurazione);
			}
			cout<<"\nNon sono stati trovate altre registrazioni.\nPremere un tasto per continuare...";
			getch();
			}
			else{
				cout<<"\nNon sono ancora stati inseriti i dati"<<endl;
				cout<<"Premere un tasto per continuare...";
				getch();
			}
		break;
		case 4:
			if(inseriti==1){       //controlla se sono già stati inseriti i dati delle registrazioni
			int Data[3];
			cout<<"Inserisci la data da ricercare:"<<endl;
			cout<<"Giorno: "; cin>>Data[0];
			cout<<"Mese: "; cin>>Data[1];
			cout<<"Anno: "; cin>>Data[2];
			/* per ogni registrazione, richiama la funzione Del_Reg passando l'indirizzo di inizio della struttura dati e
			l'indirizzo di inizio dell'array contenente la data da ricercare*/
			for(i = 0; i<10; i++)
				if( Del_Reg(&Misurazioni[i], Data)) cont_del++;
			cout<<"Sono state cancellate "<<cont_del<<" misurazioni"<<endl;
			cout<<"Premere un tasto per continuare...";
			getch();
			}
			else{
				cout<<"\nNon sono ancora stati inseriti i dati"<<endl;
				cout<<"Premere un tasto per continuare...";
				getch();
			}
		break;
		case 5:      //esce dal programma
			esci=1;
		break;
		default:
			cout<<"\nScelta non valida! Premi un tasto e rieffettua la scelta...";
			getch();
	}
	}
}

void Reg_Luogo(dati* Mis, char *Luogo){
	//controlla se il campo "luogo" della struttura puntata da Mis è uguale alla stringa "Luogo" passata
	if( strcmp(Mis -> Luogo, Luogo) == 0){
		Vis_Misurazione(Mis); //in  caso affermativo richiama la funzione che visualizza i dati della registrazione
	}
}

void Reg_Mis(dati* Mis, int Misurazione){
	//controlla se il campo "Misurazione" della struttura puntata da Mis è maggiore del valore "Misurazione" passato
	if(Mis -> Misurazione > Misurazione){
		Vis_Misurazione(Mis);  //in  caso affermativo richiama la funzione che visualizza i dati della registrazione
	}
}

int Del_Reg(dati* Mis, int* data){
	//controlla se gli elementi del campo "Data" della struttura puntata da Mis sono uguali a quelli contenuti nell'array puntato da "data"
	if(data[0] == Mis -> Data[0] && data[1] == Mis -> Data[1] && data[2] == Mis -> Data[2]){
		Mis -> Data[0] = 0;		//in caso affermativo azzera tutti i campi della struttura
		Mis -> Data[1] = 0;
		Mis -> Data[2] = 0;
		Mis -> Ora[0] = 0;
		Mis -> Ora[1] = 0;
		for(int i=0; i<10; i++)
			Mis -> Luogo[i]='\0';
		Mis -> Misurazione = 0;
		return 1;        			//se la struttura è stata cancellata, ritorna il valore 1 (servirà per incrementare il contatore cont_del)
	}
	else
		return 0;               //altrimenti ritorna 0
}

void Vis_Misurazione(dati* Mis){  //visualizza i dati di una misurazione
	cout<<endl;
	cout<<"Data: "<<Mis -> Data[2]<<"\\"<<Mis -> Data[1]<<"\\"<<Mis -> Data[0]<<endl;
	cout<<"Ora: "<<Mis -> Ora[0]<<":"<<Mis -> Ora[1]<<endl;
	printf("Luogo: %s\n", Mis -> Luogo);
	cout<<"Misurazione: "<<Mis -> Misurazione<<endl;
	getch();
}


