#include typedef enum {OK, ERROR} status; typedef struct { char titolo[80]; char autore[80]; char editore[80]; int anno;} datilibri; typedef struct databaseModello{ datilibri **arrayLIBRI; int dimensione; int primalibera;} *databaseLIBRI; databaseLIBRI makedatabase(int n) { databaseLIBRI db; if (!(db=(databaseLIBRI) malloc(sizeof(struct databaseModello)))) return NULL; if (!(db->arrayLIBRI=(datilibri**) malloc(n*sizeof(datilibri*)))) return NULL; db->dimensione=n; db->primalibera=0; return db; } status inserisci(databaseLIBRI db, datilibri* dato) { if (db->primalibera==db->dimensione) return ERROR; db->arrayLIBRI[db->primalibera]=dato; db->primalibera++; return OK; } datilibri* creaLibro() { return (datilibri*) malloc(sizeof(datilibri)); } status stampa_tutti_libri(databaseLIBRI db,char* nomeautore){ int i=0; for(;iprimalibera;i++) if((strcmp(db->arrayLIBRI[i]->autore,(char*)nomeautore)==0)) { stampa_record(db->arrayLIBRI[i]); } } void stampa_record(datilibri* dato) { printf("\nAutore: %s\n",dato->autore); printf("Titolo: %s\n",dato->titolo); printf("Editore: %s\n",dato->editore); printf("Anno: %d\n",dato->anno); } void stampa(databaseLIBRI db) { int i=0; if (db->primalibera==0) printf("\nIl database e' vuoto\n"); for (i=0; iprimalibera; i++) { if(db->arrayLIBRI[i]!=NULL) stampa_record(db->arrayLIBRI[i]); } } status mostra_dati(databaseLIBRI db, char* nomeautore, int start){ int i=start; for(;iprimalibera;i++) if((strcmp(db->arrayLIBRI[i]->autore,(char*)nomeautore)==0)){ stampa_record(db->arrayLIBRI[i]); return OK; } return ERROR; } int cerca(databaseLIBRI db, char* nomeautore, int start){ int i=start; for(;iprimalibera;i++) if((strcmp(db->arrayLIBRI[i]->autore,nomeautore)==0)) return i; return -1; } status stampaAutore(databaseLIBRI db){ char aut[10]; printf("\nInserisci l'autore "); scanf("%s",&aut); if(stampa_tutti_libri(db,aut)=='OK') return OK; return ERROR; } void ordinaArray(datilibri **arrayLIBRI, int n) { int i,j; for(i=0;i 0 && strcmp(arrayLIBRI[j-1]->autore, arrayLIBRI[j]->autore) > 0) { scambia (j-1, j, (char**)arrayLIBRI); j--; } } } void scambia (int i, int j, char* v[]) { char *temp; temp = v[j]; v[j] = v[i]; v[i] = temp; } void ordina (char *v[], int n) { int i; int j; for (i=1; i 0 && strcmp(v[j-1], v[j]) > 0) { scambia (j-1, j, v); j--; } } } void ordinaPERAUTORE(databaseLIBRI db) { ordinaArray(db->arrayLIBRI,db->primalibera); } void leggi_libri(datilibri *dato) { char s[8]; printf("inserisci autore: "); gets(dato->autore); printf("inserisci titolo: "); gets(dato->titolo); printf("inserisci editore: "); gets(dato->editore); printf("inserisci anno: "); gets(s); dato->anno = strtoul(s, NULL,10); } status cancella(databaseLIBRI db, int i) { int j; if(i>db->primalibera) { printf("Quella posizione non esiste"); return ERROR; } else { db->arrayLIBRI[i]=NULL; return OK; } } void distruggi(databaseLIBRI *db) { free(db); } main() { databaseLIBRI db; datilibri *nuovo; int n=0; printf("\n"); printf(" +-+-+-+-+-+-+-+-+ DATABASE DEI LIBRI +-+-+-+-+-+-+-+-+\n"); printf("\n"); printf(" Quanti records vuoi creare? --> "); scanf("%d",&n); db=makedatabase(n); printf("\n"); printf(" MENU DEI COMANDI:\n"); printf("\n"); printf(" i): inserisci nuovo libro\n"); printf(" s): stampa tutti i libri del database\n"); printf(" t): stampa tutti i libri di un autore \n"); printf(" d): cancella il libro di un autore\n"); printf(" o): ordina il database per autore\n"); printf(" ?): stampa il menu\n"); printf(" x): esci dal menu\n"); printf("\n"); printf("Scelta: \n"); char ris; int canc; int durata=0; char nome; while (durata==0) { scanf("%s",&ris); switch(ris) { case 'i': nuovo=creaLibro(); if (nuovo) {leggi_libri(nuovo); inserisci(db,nuovo); printf("Libro inserito\n"); } else printf("Errore"); printf(" Sono in attesa... \n"); break; case 's': stampa(db); printf(" Sono in attesa... \n"); break; case 't': stampaAutore(db); printf(" Sono in attesa... \n"); break; case 'd': printf("Quale posizione vuoi cancellare?\n"); scanf("%d", &canc); cancella(db,canc); printf("Record cancellato\n"); printf(" Sono in attesa... \n"); break; case 'o': ordinaPERAUTORE(db); printf("Ordinamento eseguito\n"); printf(" Sono in attesa... \n"); break; case '?': printf("\n"); printf(" MENU DEI COMANDI:\n"); printf("\n"); printf(" i): inserisci nuovo libro\n"); printf(" s): stampa tutti i libri del database\n"); printf(" t): stampa tutti i libri di un autore \n"); printf(" d): cancella il libro di un autore\n"); printf(" o): ordina il database per autore\n"); printf(" ?): stampa il menu\n"); printf(" x): esci dal menu\n"); printf("\n"); printf(" Sono in attesa... \n"); break; case 'x': printf(" +-+-+-+-+-+-+-+-+-+ - Fine Programma - +-+-+-+-+-+-+-+-+-+\n"); durata=1; distruggi(db); break; default: printf(" Scelta non prevista \n"); printf(" Sono in attesa... \n"); break; } } getch (); }