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

//STRUTTURA DATI----------------------------------------------------------------
typedef char string [20];
struct nodoP{
	string codice;
	float prezzo;
   int qnt;
   nodoP *next;
};
struct nodoL{
	string codice;
	int tot;
	nodoL *next;
   nodoP *acq;
};

struct articolo{
	string codice;
	float prezzo;
   int qnt;
};
typedef nodoL *lista;
typedef nodoP *pila;
//enum boolean {falso,vero};


//PROTOTIPI---------------------------------------------------------------------
int Menu();
void Riempi_File(string nomef);
void Stampa_File(string nomef);
lista Crea_Lista(string nomef);
lista Insersci_Nodo_in_Lista(articolo a, lista &l);
lista Ricerca_Nodo(lista l,string info);
void Inserisci_Nodo_in_Pila(articolo a,pila &p);
void Stampa_Lista(lista l);
float Vendita(lista l);


//MAIN--------------------------------------------------------------------------
void main(void){
	int sc;
   string file;
   lista l=NULL;

   strcpy(file,"FileListaPila");

   do{
      clrscr();
   	sc=Menu();
      switch(sc){
      	case 1:
         	Riempi_File(file);
            break;
         case 2:
         	clrscr();
	         cout<<"*** Stampa del file ***\n\n";
         	Stampa_File(file);
            getch();
            break;
         case 3:
         	l=Crea_Lista(file);
            break;
         case 4:
            clrscr();
	         cout<<"*** Stampa della lista ***\n\n";
         	Stampa_Lista(l);
            getch();
            break;
         case 5:
            clrscr();
            cout<<"*** Stampa dei prezzi ***\n\n";
         	cout<<"\nIl valore del magazzino e' "<<Vendita(l)<<" euro\n";
            getch();
      }

   }while(sc!=6);
}

//FUNZIONI&PROCEDURE------------------------------------------------------------
int Menu(){                                                              //MENU'
	int sc;

	cout<<"\n\n\t\t\t MENU'\n";
	cout<<"\n 1. Riempi il file";
	cout<<"\n 2. Stampa il file";
	cout<<"\n 3. Crea lista con articoli diversi";
	cout<<"\n 4. Stampa la lista";
   cout<<"\n 5. Spesa";
   cout<<"\n 6. Esci";
	do{
	  cout<<"\n\n scelta: ";
	  cin>>sc;
   }while((sc<0) || (sc>6));

	return sc;
}

void Riempi_File(string nome){                                     //RIEMPI_FILE
	FILE *f;
   articolo app;
   int risposta,risp;

   cout<<"Vuoi continuare il vecchio file (1) o crearne uno nuovo (0)?\n";
   do{
		cin>>risp;
   }while( (risp==0 || risp!=1) && (risp!=0 || risp==1));

   if(!risp)
		f=fopen(nome,"wb");
   else
		f=fopen(nome,"ab");
   do{
		cout<<"inserisci codice articolo:\n->";
	  	cin>>app.codice;
	  	cout<<"inserisci prezzo:\n->";
	  	cin>>app.prezzo;
      app.qnt=1;
	 	fwrite(&app,sizeof(articolo),1,f);
	 	cout<<"Elenco finito? (si'=1)\n";
		cin>>risposta;
   }while(!risposta);

   fclose(f);
}

void Stampa_File(string nomef){                                    //STAMPA_FILE
	FILE *f;
   articolo app;

   f=fopen(nomef,"rb");
   while( fread(&app,sizeof(articolo),1,f) ){
   	cout<<"Codice articolo: "<<app.codice<<endl;
      cout<<"Prezzo: "<<app.prezzo<<" euro"<<endl;
      cout<<"Quantita': "<<app.qnt<<" pezzo(i)"<<endl<<endl;
   }
   fclose(f);
}

lista Crea_Lista(string nomef){                                     //CREA_LISTA
	nodoL *p=NULL;
	lista l=NULL;
	FILE *f;
	articolo app;
   lista risp;

	f=fopen(nomef,"rb");
	while( fread(&app,sizeof(articolo),1,f) ){
      risp=Ricerca_Nodo(l,app.codice);
      if( risp==NULL )	risp=Insersci_Nodo_in_Lista(app,l);
      Inserisci_Nodo_in_Pila(app,risp->acq);
      risp->tot+=app.qnt;
	}
	fclose(f);

	return l;
}

lista Insersci_Nodo_in_Lista(articolo a, lista &l){    //INSERISCI_NODO_IN_LISTA
	nodoL *app;

   app=new(nodoL);
   strcpy(app->codice,a.codice);
   app->tot=0;
   app->next=l;
   app->acq=NULL;
   l=app;

   return l;
}

lista Ricerca_Nodo(lista l,string info){                          //RICERCA_NODO

	while(l!=NULL && (strcmp(l->codice,info)!=0))
		l=l->next;

      return l;

}

void Inserisci_Nodo_in_Pila(articolo a,pila &p){        //INSERISCI_NODO_IN_PILA
	nodoP *app;

   app=new(nodoP);
   strcpy(app->codice,a.codice);
   app->prezzo=a.prezzo;
   app->qnt=a.qnt;
   app->next=p;
   p=app;
}

void Stampa_Lista(lista l){                                       //STAMPA_LISTA

	if(l==NULL) cout<<"\aLista vuota"; 
	while(l!=NULL){
		cout<<"Codice articolo: "<<l->codice<<endl;
      cout<<"Quantita': "<<l->tot<<" articolo(i)"<<endl<<endl;
		l=l->next;
	}
}

float Vendita(lista l){                                                //VENDITA
   float app=0;

	while(l!=NULL){
   	app+=(l->acq->prezzo)*(l->tot);
      cout<<"Prezzo degli articoli "<<l->codice<<" e' "<<(l->acq->prezzo)*(l->tot)<<endl;
      l=l->next;
	}

   return app;
}


