Esercizi di Laboratorio

Da consegnare elettronicamente entro il 02-07-2003


Esercizio 7: Database dei libri

Si realizzi un programma che permette di creare e gestire un archivio di libri con le operazioni elementari di inserimento, ricerca e cancellazione.


REALIZZAZIONE: Si definiscano i tipi:

typedef enum {OK, ERROR} status;

Il tipo status viene utilizzato per indicare esecuzione corretta o anomala delle varie funzioni. Il database dei cd è un puntatore ad struttura contendente un array dinamico di puntatori a records della forma:

typedef struct {
        char titolo[80];
        char autore[80];
        char editore[80];
        int anno;}  datilibri;

e altre due informazioni: la dimensione del array dinamico e la prima posizione della prima cella libera del array. Conseguentemente un database dei Libri ha il sequente tipo:

typedef struct databaseModello{
        datilibri **arrayLIBRI;
        int dimensione;
        int primalibera;}  *databaseLIBRI;

Si realizzino le seguenti funzioni:

databaseLIBRI makedatabase(int n)

Crea un database vuoto che può contenere n libri. La funzione restituisce NULL se non riesce ad allocare la struttura o le sue componenti.

status inserisci(databaseLIBRI db, datilibri* dato)

Il parametro dato è un puntatore ad un record i cui campi sono già stati inizializzati. La funzione inserisce il puntatore nel database. Restituisce OK se l'operazione è andata a buon fine, ERROR se si sono verificati errori (ad esempio il database è pieno)

void ordinaPERAUTORE(databaseLIBRI db)

ordina mediante SELECTIONSORT il database in ordine alfabetico per autore. Fare una funzione separata di ordinamento per il vettore di puntatori e richiamarla opportunamente sul campo della struttura

int cerca(databaseLIBRI db, char* nomeautore, int start)

Restituisce la posizione della prima occorrenza di un record con autore=nomeautore a partire dalla posizione start del array dei libri. Se un tale record non esiste, restituisce -1. (L' uso di start è necessario per cercare altri libri dello stesso autore).

status mostra_dati(databaseLIBRI b, char nomeautore, int start)

stampa i dati del primo libro con autore=nomeautore a partire dalla posizione start. Restituisce OK se un record con tale autore esiste, ERROR altrimenti.

status stampa_tutti_libri(databaseLIBRI b, nomeautore)

stampa tutti i libri con autore=nomeautore. Restituisce OK esiste almeno un autore con tale nome, ERROR altrimenti

void stampa(databaseLIBRI db)

Stampa la sequenza dei record contenuti in db. Si consiglia di definire una funzione ausiliaria

void stampa_record(datilibri* dato)

che verrà iterata opportunamente su tutto il array dei libri.

status  cancella(databaseLIBRI db, int i)

Cancella il record alla posizione i del array dei libri, purché questa esista. Se non esiste la funzione restituisce ERROR.

void distruggi(databaseLIBRI *db)

Dealloca completamente il database db. Osservare che db è passato per riferimento. Al termine dell'esecuzione di distruggi varrà db=NULL

Per leggere i records da tastiera si consiglia di utilizzare la funzione

void leggi_libri(datilibri *dato)
{
                char s[8];                    
                printf("inserisci autore:\n");
                gets(dato->autore);
                printf("inserisci titolo:\n");
                gets(dato->titolo);
                printf("inserisci editore:\n");
                gets(dato->editore);
                printf("inserisci anno:\n");
                gets(s);
                dato->anno = strtoul(s, NULL,10);}

la funzione ha come parametro un puntatore a datilibri che deve essere già allocato.

 

Il main deve:

  1. consentire all'utente di costruire un database delle dimensioni volute,
  2.  consentire all'utente di svolgere le seguenti operazioni presentando un menu a opzioni:

(i): inserisci nuovo libro

(s): stampa tutti i libri del database

(t): stampa tutti i libri di un autore

(d): cancella il primo libro di un autore

(o): ordina il database per autore

(?): stampa il menu

(x): esci dal menu

 Il main deve concludersi con la distruzione (deallocazione) del database.