/* Inclusione delle librerie necessarie */ #include #include /* Definizione di alcune etichette */ #define EMAX 1000 /* Numero max di elementi che e' possibile inserire nella libreria*/ #define TMAX 100 /* Lunghezza max della stringa per il titolo */ #define AMAX 30 /* Lunghezza max della stringa per l'autore */ #define FMAX 30 /* Lunghezza max della stringa per i nomi dei file */ /* Struttura per rappresentare un singolo volume */ typedef struct s_volume { char isbn[14]; /* Codice ISBN (codice univoco assegnato ad ogni libro del mondo) */ char aut[AMAX]; /* Autore */ char tit[TMAX]; /* Titolo */ } volume; /* Struttura per ogni elemento della libreria */ typedef struct s_elemento { volume v; /* Volume */ int copie; /* Numero copie */ float costo; /* Costo del volume */ } elemento; /* Struttura per rappresentare la libreria */ typedef struct lib { elemento elenco[EMAX]; /* Array che contiene la libreria */ int ne; /* Numero effettivo di elementi presenti */ } libreria; /* Prototipi */ char gestM( void ); /* Stampa il menu', acquisisce e restituisce la scelta dell'utente */ void modE(elemento*); /* Permette di modificare numero copie e costo dell'elemento */ void insE(libreria*); /* Permette di aggiungere un nuovo elemento alla libreria */ void cercaT(libreria*, char[]); /* Permette di effettuare la ricerca per titolo stampando su video i risultati */ /* N.B. Nel caso ci siano piu' elementi con lo stesso titolo li stampa tutti */ void elimE(libreria*, int); /* Data una posizione, elimina l'elemento corrispondente */ void caricaL(libreria*, FILE*); /* Carica in una libreria i dati contenuti in un file */ void salvaL(libreria*, FILE*); /* Salva su un file i dati contenuti in una libreria */ void mostraE(elemento*); /* Mostra i dati dell'elemento corrispondente */ int main() { char s; /* Conterra' la scelta dell'utente */ FILE* fp; /* Puntatore a file */ char nomefile[FMAX], /* Conterra' il nome del file da aprire o creare */ tit[TMAX]; /* Conterra' il titolo da cercare */ int pos; libreria mialib; /* Variabile (strutturata) che rappresenta la libreria */ mialib.ne=0; /* Inizializzo la libreria: numero di volumi uguale a 0 */ /* Menu' principale */ do { s=gestM(); /* Acquisisce la scelta dell'utente */ switch(s) { /* Carica dati da file e li copia nella libreria in memoria centrale */ case '1' : printf("Inserisci il nome del file: \n"); gets(nomefile); fp = fopen( nomefile, "r"); if (fp!=0) {caricaL(&mialib, fp); fclose(fp);} else printf("Il file non esiste!\n"); break; /* Inserisce un nuovo elemento nella libreria in memoria centrale */ case '2' : if (mialib.ne >= EMAX) printf("La libreria e' piena!\n"); else insE(&mialib); break; /* Permette di modificare un elemento dellla libreria in memoria centrale (solo numero copie e costo) */ case '3' : printf("\nInserisci la posizione del volume da modificare: \n"); scanf("%d%*c", &pos); if ((pos<1)||(pos > mialib.ne)) printf("\nIl volume non esiste!\n"); else modE(&mialib.elenco[pos-1]); break; /* Permette di fare la ricerca per titolo in memoria centrale */ case '4' : printf("\nInserisci il titolo del volume da cercare.\n"); gets(tit); cercaT(&mialib, tit); break; /* Salva su file i dati di una libreria contenuta in memoria centrale */ case '5' : if (mialib.ne!=0) { printf("Inserisci il nome del file: \n"); gets(nomefile); fp = fopen( nomefile, "w"); if (fp!=0) {salvaL(&mialib, fp); fclose(fp);} else printf("Il file non e' stato creato correttamente!\n"); } else printf("Non ci sono dati da salvare!\n"); break; /* Permette di eliminare un elemento dalla libreria in memoria centrale */ case '6' : printf("\nInserisci la posizione dell'elemento da eliminare: \n"); scanf("%d%*c", &pos); if ((pos<1)||(pos > mialib.ne)) printf("\nIl volume non esiste!\n"); else elimE(&mialib, pos-1); break; /* Mostra su video il contenuto della libreria contenuta in memoria centrale*/ case '7' : if (mialib.ne!=0) for( pos=0; poscopie); printf("\nInserisci il costo in EURO\n"); scanf("%f%*c", &el->costo); printf("\nNuovi dati:\n"); mostraE(el); }; /* Aggiunge un elemento alla libreria */ void insE(libreria *mialib) { elemento temp; /* Elemento temporaneo */ printf("\nInserisci il codice ISBN.\n"); gets(temp.v.isbn); printf("\nInserisci l'autore.\n"); gets(temp.v.aut); printf("\nInserisci il titolo.\n"); gets(temp.v.tit); printf("\nInserisci il numero di copie.\n"); scanf("%d%*c", & temp.copie); printf("\nInserisci il costo in EURO.\n"); scanf("%f%*c", & temp.costo); /* Copia temp nella libreria nella prima posizione libera */ mialib->elenco[mialib->ne]=temp; /* Aumenta il contatore di element che fa anche da indice della prossima posizione libera */ mialib->ne++; }; /* Cerca un volume per titolo e stampa su video quelli trovati */ void cercaT(libreria *mialib, char tit[]) { int pos; /* strcmp() vale 0 se due stringhe sono uguali */ for(pos=0; posne; pos++) if( strcmp(mialib->elenco[pos].v.tit, tit) == 0 ) { printf("\nPosizione: %d\n", pos+1); mostraE(&mialib->elenco[pos]); } }; /* Elimina un volume copiando l'ultimo volume della libreria al suo posto e decrementando NE */ void elimE(libreria *mialib, int pos) { /* Se il libro da eliminare e' l'ultimo mi basta decrementare NE */ if (pos == mialib->ne-1) mialib->ne--; else { mialib->elenco[pos] = mialib->elenco[mialib->ne-1]; mialib->ne--; } }; /* Legge da file e riempie l'array di elementi */ void caricaL(libreria *mialib, FILE* fp) { elemento temp; /* Riazzero NE */ mialib->ne=0; /* NE conta i volumi ed e' anche usato come indice per l'array */ /* Lettura di test */ fgets(temp.v.isbn, 15, fp); /* Se la lettura e' andata a buon fine... */ while( feof(fp)==0 ) { /* Siccome fgets aggiunge il '/n' devo toglierlo "manualmente" */ temp.v.isbn[strlen(temp.v.isbn)-1]='\0'; fgets(temp.v.aut, AMAX, fp); /* Siccome fgets aggiunge il '/n' devo toglierlo "manualmente" */ temp.v.aut[strlen(temp.v.aut)-1]='\0'; fgets(temp.v.tit, TMAX, fp); /* Siccome fgets aggiunge il '/n' devo toglierlo "manualmente" */ temp.v.tit[strlen(temp.v.tit)-1]='\0'; /* Anche qui serve il %*c !!! */ fscanf( fp, "%d%*c", &temp.copie); /* Anche qui serve il %*c !!! */ fscanf( fp, "%f%*c", &temp.costo); mialib->elenco[mialib->ne]=temp; mialib->ne++; /* Nuova lettura di test */ fgets(temp.v.isbn, 15, fp); }; }; /* Copia l'array su file */ void salvaL(libreria *mialib, FILE* fp) { int i; /* Metto anche il \n cosi' il file è leggibile dall'utente ed e' compatibile con la procedura leggi */ for(i=0; ine; i++) { fprintf( fp, "%s\n", mialib->elenco[i].v.isbn); fprintf( fp, "%s\n", mialib->elenco[i].v.aut); fprintf( fp, "%s\n", mialib->elenco[i].v.tit); fprintf( fp, "%d\n", mialib->elenco[i].copie); fprintf( fp, "%f\n", mialib->elenco[i].costo); } }; /* Stampa su video un elemento */ void mostraE(elemento *el) { printf("\n%s", el->v.isbn); printf("\n%s", el->v.aut); printf("\n%s", el->v.tit); printf("\n%d", el->copie); printf("\n%f\n", el->costo); };