#include #include #include #include "listalibri2.h" void LeggeLineaComando (int argc, char *argv[], char *BiblioFile, char *RecordFile); listalibri CaricaBiblioteca (char *BiblioFile); void EsegueMovimenti (char *RecordFile, listalibri Scaffale, listalibri Prestati, listalibri Resi); void RiponeLibri (listalibri Scaffale, listalibri Resi); poslibro TrovaLibro (char *AutoreTitolo, listalibri L); void StampaListaLibri (listalibri L); int main(int argc, char *argv[]) { char BiblioFile[RIGA], RecordFile[RIGA]; listalibri Scaffale; listalibri Prestati; listalibri Resi; // 1) Interpretazione della linea di comando LeggeLineaComando(argc,argv,BiblioFile,RecordFile); // 2) Caricamento dei dati Scaffale = CaricaBiblioteca(BiblioFile); // 3) Allocazione delle strutture dati ausiliarie Prestati = crealista(); Resi = crealista(); // 4a) Algoritmo 1 (registrazione di prestiti e rese) EsegueMovimenti(RecordFile,Scaffale,Prestati,Resi); // 6a) Stampa dei libri rimasti StampaListaLibri(Scaffale); // 4b-6b) Algoritmo 2 (riordino della biblioteca) e stampa delle istruzioni RiponeLibri(Scaffale,Resi); // 5) Deallocazione delle strutture dati ausiliarie distruggelista(&Prestati); distruggelista(&Resi); // 6c) Stampa dei libri rimasti StampaListaLibri(Scaffale); // 7) Deallocazione dei dati distruggelista(&Scaffale); return EXIT_SUCCESS; } void LeggeLineaComando (int argc, char *argv[], char *BiblioFile, char *RecordFile) { if (argc != 3) { printf("Il formato della linea di comando e' errato!\n"); exit(EXIT_WRONGCOMMANDLINE); } strcpy(BiblioFile,argv[1]); strcpy(RecordFile,argv[2]); } listalibri CaricaBiblioteca (char *BiblioFile) { FILE *fBiblioFile; char Riga[RIGA]; listalibri Scaffale; fBiblioFile = fopen(BiblioFile,"r"); if (fBiblioFile == NULL) { printf("Errore nell'apertura del file %s!\n",BiblioFile); exit(EXIT_OPENFILE); } Scaffale = crealista(); fgets(Riga,RIGA,fBiblioFile); while (strcmp(Riga,"FINE\n") != 0) { // Elimina l'a capo dalla stringa Riga[strlen(Riga)-1] = '\0'; // Inserisce il nuovo libro in coda allo scaffale inslista(Riga,succlista(ultimolista(Scaffale),Scaffale),Scaffale); fgets(Riga,RIGA,fBiblioFile); } fclose(fBiblioFile); return Scaffale; } void EsegueMovimenti (char *RecordFile, listalibri Scaffale, listalibri Prestati, listalibri Resi) { FILE *fRecordFile; char Comando[RIGA], Riga[RIGA]; poslibro p; fRecordFile = fopen(RecordFile,"r"); if (fRecordFile == NULL) { printf("Errore nell'apertura del file %s!\n",RecordFile); exit(EXIT_OPENFILE); } fscanf(fRecordFile,"%s ",Comando); while (strcmp(Comando,"FINE") != 0) { fgets(Riga,RIGA,fRecordFile); Riga[strlen(Riga)-1] = '\0'; if (strcmp(Comando,"PRESTITO") == 0) { // Cerca il libro sullo scaffale e lo cancella p = TrovaLibro(Riga,Scaffale); if (p != NO_ELEMENT) canclista(&p,Scaffale); // Inserisce il nuovo libro in coda alla lista dei prestiti inslista(Riga,succlista(ultimolista(Prestati),Prestati),Prestati); } else if (strcmp(Comando,"RESTITUZIONE") == 0) { // Cerca il libro nella lista dei prestiti e lo cancella p = TrovaLibro(Riga,Prestati); if (p != NO_ELEMENT) canclista(&p,Prestati); // Inserisce il libro in cima alla lista dei resi inslista(Riga,primolista(Resi),Resi); } fscanf(fRecordFile,"%s ",Comando); } fclose(fRecordFile); } void RiponeLibri (listalibri Scaffale, listalibri Resi) { poslibro p, q; char Riga[RIGA]; printf("ISTRUZIONI\n"); for (p = primolista(Resi); !listavuota(Resi); canclista(&p,Resi)) { strcpy(Riga,leggilista(p,Resi)); // Cerca dove mettere il libro e lo inserisce for (q = primolista(Scaffale); (strcmp(leggilista(q,Scaffale),Riga) < 0) && (!finelista(q,Scaffale)); q = succlista(q,Scaffale)); if (q == primolista(Scaffale)) printf("METTERE %s PER PRIMO\n",Riga); else printf("METTERE %s DOPO %s\n",Riga, leggilista(preclista(q,Scaffale),Scaffale)); inslista(Riga,q,Scaffale); } printf("FINE\n"); } poslibro TrovaLibro (char *AutoreTitolo, listalibri L) { poslibro p; for (p = primolista(L); !finelista(p,L); p = succlista(p,L)) if (strcmp(leggilista(p,L),AutoreTitolo) == 0) return p; return NO_ELEMENT; } void StampaListaLibri (listalibri L) { poslibro p; printf("SCAFFALE\n"); for (p = primolista(L); !finelista(p,L); p = succlista(p,L) ) printf("%s\n",leggilista(p,L)); printf("FINE\n"); }