Strutture (struct)
Cos’è una struct?
Section titled “Cos’è una struct?”Immagina di dover tenere traccia di 30 studenti. Ogni studente ha un nome, un’età e un voto. Potresti usare tre array separati — ma è un disastro da gestire.
Una struttura (struct) ti permette di raggruppare tutte le informazioni di uno studente in un unico “pacchetto”. Così hai un array di studenti, non tre array separati.
Definire una struttura
Section titled “Definire una struttura”struct NomeStruttura { tipo1 campo1; tipo2 campo2; // ...}; // nota il punto e virgola finale!Esempio concreto:
struct Studente { string nome; int eta; double media;};Creare e usare una struttura
Section titled “Creare e usare una struttura”Studente s1; // crea una variabile di tipo Studente
// Accedi ai campi con il punto .s1.nome = "Alice";s1.eta = 16;s1.media = 8.5;
cout << s1.nome << endl; // Alicecout << s1.media << endl; // 8.5Inizializzazione rapida
Section titled “Inizializzazione rapida”Puoi impostare tutti i valori in una sola riga:
Studente s1 = {"Alice", 16, 8.5}; // ordine: nome, eta, media
// C++11: puoi anche specificare il nome dei campiStudente s2 = {.nome = "Bob", .eta = 17, .media = 7.2};Strutture come parametri di funzioni
Section titled “Strutture come parametri di funzioni”Le strutture si passano alle funzioni esattamente come le variabili normali:
struct Punto { double x; double y;};
// Calcola la distanza tra due puntidouble distanza(Punto p1, Punto p2) { double dx = p1.x - p2.x; double dy = p1.y - p2.y; return sqrt(dx*dx + dy*dy);}
int main() { Punto a = {0.0, 0.0}; Punto b = {3.0, 4.0};
cout << "Distanza: " << distanza(a, b) << endl; // 5 return 0;}Per modificare una struttura dentro una funzione, passa per riferimento (&):
struct Contatore { int valore; int passi;};
void incrementa(Contatore& c, int n) { c.valore += n; // modifica l'originale, non una copia c.passi++;}
int main() { Contatore c = {0, 0}; incrementa(c, 10); incrementa(c, 5); cout << "Valore: " << c.valore << ", Passi: " << c.passi << endl; // Valore: 15, Passi: 2 return 0;}Array di strutture
Section titled “Array di strutture”Puoi creare array di strutture per gestire più elementi dello stesso tipo:
struct Prodotto { string nome; double prezzo; int quantita;};
int main() { Prodotto magazzino[3] = { {"Mela", 0.50, 100}, {"Banana", 0.30, 150}, {"Arancia", 0.80, 80} };
cout << "Prodotti in magazzino:" << endl; for (int i = 0; i < 3; i++) { cout << magazzino[i].nome << " - " << magazzino[i].prezzo << " euro" << " (quantita: " << magazzino[i].quantita << ")" << endl; }
// Calcola il valore totale double totale = 0; for (int i = 0; i < 3; i++) { totale += magazzino[i].prezzo * magazzino[i].quantita; } cout << "Valore totale: " << totale << " euro" << endl;
return 0;}Strutture annidate
Section titled “Strutture annidate”Una struttura può contenere un’altra struttura come campo:
struct Indirizzo { string via; string citta; string cap;};
struct Persona { string nome; int eta; Indirizzo indirizzo; // struttura dentro struttura};
int main() { Persona p; p.nome = "Alice"; p.eta = 16; p.indirizzo.via = "Via Roma 10"; p.indirizzo.citta = "Milano"; p.indirizzo.cap = "20100";
cout << p.nome << " vive a " << p.indirizzo.citta << endl; return 0;}Differenza tra struct e class
Section titled “Differenza tra struct e class”In C++, struct e class sono quasi identiche. L’unica differenza:
- In
structtutto è pubblico per default - In
classtutto è privato per default
Nella pratica, si usa struct per raggruppare dati semplici senza logica, e class per oggetti più complessi con comportamenti e dati protetti.
Esempio pratico: registro studenti
Section titled “Esempio pratico: registro studenti”#include <iostream>#include <string>using namespace std;
struct Studente { string nome; int eta; double voto;};
// Passa per const & per leggere senza copiarevoid stampa(const Studente& s) { cout << s.nome << " (" << s.eta << " anni) - Voto: " << s.voto << endl;}
int main() { const int N = 3; Studente classe[N] = { {"Alice", 16, 8.5}, {"Bob", 17, 7.0}, {"Carlo", 16, 9.2} };
cout << "=== Registro ===" << endl; double somma = 0; for (int i = 0; i < N; i++) { stampa(classe[i]); somma += classe[i].voto; }
cout << "Media della classe: " << somma / N << endl;
return 0;}Output:
=== Registro ===Alice (16 anni) - Voto: 8.5Bob (17 anni) - Voto: 7Carlo (16 anni) - Voto: 9.2Media della classe: 8.23333