Salta ai contenuti
Manuale LogoManuale Logo

Strutture (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.

struct NomeStruttura {
tipo1 campo1;
tipo2 campo2;
// ...
}; // nota il punto e virgola finale!

Esempio concreto:

struct Studente {
string nome;
int eta;
double media;
};
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; // Alice
cout << s1.media << endl; // 8.5

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 campi
Studente s2 = {.nome = "Bob", .eta = 17, .media = 7.2};

Le strutture possono essere passate alle funzioni come le altre variabili:

struct Punto {
double x;
double y;
};
// Calcola la distanza tra due punti
double 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;
}

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;
}

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;
}

In C++, struct e class sono quasi identiche. L’unica differenza:

  • In struct tutto è pubblico per default
  • In class tutto è 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.

#include <iostream>
#include <string>
using namespace std;
struct Studente {
string nome;
int eta;
double voto;
};
// Passa per const & per leggere senza copiare
void 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.5
Bob (17 anni) - Voto: 7
Carlo (16 anni) - Voto: 9.2
Media della classe: 8.23333