Linguaggio C++

Gestione Biblioteca

Gestione dinamica di una biblioteca in C++. Creazione di un archivio di libri con struct e memoria dinamica (new e delete[]).

Una biblioteca digitale deve poter gestire un numero di libri che può variare nel tempo. Poiché il numero totale di libri non è noto a priori, occorre utilizzare la memoria dinamica per creare un archivio flessibile e adattabile. In questa lezione imparerai a creare un vettore dinamico di struct e a gestirlo con new e delete[].


1️⃣ Modellazione del problema

Ogni libro ha alcune informazioni fondamentali:

  • Titolo
  • Autore
  • Anno di pubblicazione
  • Prezzo

Queste informazioni possono essere rappresentate da una struct:

struct Libro {
    string titolo;
    string autore;
    int anno;
    double prezzo;
};

Vogliamo creare dinamicamente un archivio di libri che l utente può popolare da tastiera.


2️⃣ Creazione dinamica dell archivio

Poiché non sappiamo quanti libri conterrà la biblioteca, chiediamo all utente il numero e usiamo new per creare l array dinamico.

int n;
cout << "Quanti libri vuoi inserire? ";
cin >> n;

Libro* archivio = new Libro[n]; // array dinamico di struct

Ogni elemento dell array sarà un libro diverso.


3️⃣ Inserimento dei dati

Popoliamo l archivio chiedendo i dati di ogni libro all utente:

for (int i = 0; i < n; i++) {
    cout << "\nLIBRO " << i + 1 << endl;
    cout << "Titolo: ";
    cin.ignore();
    getline(cin, archivio[i].titolo);

    cout << "Autore: ";
    getline(cin, archivio[i].autore);

    cout << "Anno: ";
    cin >> archivio[i].anno;

    cout << "Prezzo: ";
    cin >> archivio[i].prezzo;
}

4️⃣ Visualizzazione dei dati

Dopo aver riempito l archivio, stampiamo tutti i libri registrati:

cout << "\n--- ELENCO LIBRI ---" << endl;

for (int i = 0; i < n; i++) {
    cout << archivio[i].titolo << " - "
         << archivio[i].autore << " ("
         << archivio[i].anno << ") Prezzo: "
         << archivio[i].prezzo << "€" << endl;
}

5️⃣ Deallocazione della memoria

Al termine del programma, ricordati sempre di liberare la memoria allocata dinamicamente:

delete[] archivio;
archivio = nullptr;
cout << "\nMemoria liberata correttamente." << endl;

6️⃣ Riepilogo

  • new crea memoria dinamica nello heap.
  • delete[] libera la memoria di un array dinamico.
  • Le struct permettono di rappresentare oggetti complessi come i libri.
  • È buona norma impostare i puntatori a nullptr dopo la deallocazione.
LABORATORIO

Compito di Realtà: Gestione Dinamica di una Biblioteca

In questo laboratorio progetterai un piccolo sistema per gestire dinamicamente i libri di una biblioteca. Imparerai a utilizzare struct, new e delete[] per creare e liberare memoria nello heap.


1 Creazione dell archivio

Chiedi all utente quanti libri vuole inserire e crea un array dinamico di Libro.

int n;
cout << "Numero di libri: ";
cin >> n;
Libro* archivio = new Libro[n];

2 Inserimento dei dati

Acquisisci titolo, autore, anno e prezzo per ogni libro.

for (int i = 0; i < n; i++) {
    cout << "\nLIBRO " << i + 1 << endl;
    cout << "Titolo: ";
    cin.ignore();
    getline(cin, archivio[i].titolo);
    cout << "Autore: ";
    getline(cin, archivio[i].autore);
    cout << "Anno: ";
    cin >> archivio[i].anno;
    cout << "Prezzo: ";
    cin >> archivio[i].prezzo;
}

3 Visualizzazione e conteggio

Stampa la lista completa dei libri e il numero totale inserito.

cout << "\nElenco completo dei libri:" << endl;
for (int i = 0; i < n; i++) {
    cout << archivio[i].titolo << " - "
         << archivio[i].autore << " (" << archivio[i].anno << ")";
    cout << " Prezzo: " << archivio[i].prezzo << "€" << endl;
}
cout << "\nTotale libri: " << n << endl;

4 Deallocazione e chiusura

Alla fine, libera la memoria dinamica per evitare memory leak.

delete[] archivio;
archivio = nullptr;
cout << "Memoria liberata correttamente." << endl;

5 Estensioni possibili

  • Aggiungi una funzione per cercare un libro per titolo o autore.
  • Implementa un menu con switch per aggiungere, visualizzare o cancellare libri.
  • Calcola il prezzo medio dei libri in archivio.