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
newcrea 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
nullptrdopo 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.
- Ambiente di sviluppo C++ (Code::Blocks, Dev-C++, Visual Studio Code...)
- Console per l inserimento dei dati dei libri
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
switchper aggiungere, visualizzare o cancellare libri. - Calcola il prezzo medio dei libri in archivio.