Strutture (struct)
Cos’è una struct?
Sezione intitolata “Cos’è una struct?”Per registrare 30 studenti potresti usare tre array separati per nomi, età e voti, ma dovresti mantenerli sincronizzati.
Una struttura (struct) raggruppa queste informazioni in un unico tipo. Puoi così creare un array di studenti.
Definire una struttura
Sezione intitolata “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
Sezione intitolata “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
Sezione intitolata “Inizializzazione rapida”Puoi inizializzare tutti i campi 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
Sezione intitolata “Strutture come parametri di funzioni”Le strutture possono essere passate alle funzioni come le altre variabili:
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
Sezione intitolata “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
Sezione intitolata “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
Sezione intitolata “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
Sezione intitolata “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