PROGRAMMIAMO
C++ - Struct definizione
Strutture (struct)

In C una struttura (structure abbreviato in struct in inglese) è un gruppo di variabili, anche di tipo diverso, aggregate insieme con un unico nome. In questo le struct assomigliano ai vettori, ma a differenza di questi le variabili non sono ordinate e possono avere anche tipo diverso.

Per comprendere meglio il concetto facciamo subito un semplice esempio di programma che usa le strutture per acquisire due orari (espressi in ore e minuti) e quindi calcolare la differenza in minuti fra gli stessi:

#include <cstdlib>
#include <iostream>

using namespace std;

struct orario {
int ora;
int min;
};

int main(int argc, char *argv[])
{
int dif;
orario ora1, ora2;

cout<<"Fornisci l'orario iniziale (ore e minuti): ";
cin>>ora1.ora;
cin>>ora1.min;

cout<<"Fornisci l'orario finale (ore e minuti): ";
cin>>ora2.ora;
cin>>ora2.min;

dif = (ora2.ora*60+ora2.min) - (ora1.ora*60+ora1.min);

cout<<"La differenza fra le "<<ora1.ora<<":"<<ora1.min<<" e le "<<ora2.ora<<":"<<ora2.min<<" e' "<<dif<<" minuti\n";

system("PAUSE");
return EXIT_SUCCESS;
}

La figura successiva mostra una schermata del programma in esecuzione:

Definizione del tipo di struttura

Osserviamo anzitutto la dichiarazione:

struct orario {
int ora;
int min;
};

Questa istruzione definisce le proprietà di un tipo di oggetto di nome orario. Questo oggetto è composto di due variabili intere, ora e min, dette campi della struttura. In pratica orario è una specie di etichetta (tag) assegnata a un gruppo di due variabili intere.

La cosa più difficile da capire per chi inizia a usare le struct è il fatto che la definizione non crea un nuova super-variabile di nome orario, ma ne definisce semplicemente il modello, cioè come è fatta. In altre parole, il C non alloca nessuno spazio di memoria per l'oggetto orario: questo è come un nuovo tipo di variabile definito dall'utente. Vedremo fra poco come si può usarlo.

Per adesso osserviamo che la definizione di com'è fatta la struttura è terminata da un punto e virgola finale (importante non dimenticarselo!).

Inoltre essa è stata scritta prima e fuori dal programma principale main, sebbene possa in generale essere usata ovunque, anche dentro il programma, purché prima che il tipo corrispondente venga utilizzato.

Se, come nel precedente esempio, i campi della struttura sono tutti dello stesso tipo (int, nel nostro caso) č anche possibile scrivere cosė:

struct orario {
int ora, min;
};

 

Dichiarazione di un oggetto struttura

Osserviamo ora la dichiarazione di variabili posta all'inizio del main:

int main(int argc, char *argv[])
{
int dif;
orario ora1, ora2;

Osserviamo che orario viene usata come se fosse un tipo del C, come la parola chiave int, per dichiarare due nuove variabili (ora1 e ora2). In pratica ora1 e ora2 sono due "variabili" (il termine tecnico è oggetti) di tipo orario.

Uso di una struttura

La struttura è composta di variabili dette campi o membri della struttura. Nel nostro esempio i campi della struttura sono le due variabili intere ora e min.

I campi di una struttura possono essere utilizzati come normali variabili dello stesso tipo. Per accedere e utilizzare i campi di una struttura, bisogna usare l'operatore '.' (punto), come mostrano i seguenti esempi di acquisizioni:

cout<<"Fornisci l'orario iniziale (ore e minuti): ";
cin>>ora1.ora;
cin>>ora1.min;

cout<<"Fornisci l'orario finale (ore e minuti): ";
cin>>ora2.ora;
cin>>ora2.min;

e l'istruzione:

dif = (ora2.ora*60+ora2.min) - (ora1.ora*60+ora1.min);

Nelle precedenti istruzioni ora1.ora, ora1.min, ora2.ora e ora2.min sono usate esattamente come delle normali variabili di tipo int.

La sintassi per usare il campo di una struttura è la seguente:

nome_struttura.nome_campo

Si noti, a scanso di equivoci, che nome_struttura è il nome dell'oggetto struct (ora1 e ora2 nel nostro esempio) e non del tipo corrispondente (orario).

 

Vantaggi delle strutture

Qualcuno potrebbe lecitamente domandarsi se non sarebbe stato possibile scrivere il nostro programma senza usare le struct. La risposta è ovviamente sì!

Avremmo potuto dichiarare semplicemente quattro variabili int in questo modo:

int ora1_ora, ora1_min, ora2_ora, ora2_min;

Si noti però che la dichiarazione precedente è stata fatta in modo da "assomigliare" a una struttura. Infatti l'uso dell'underscore '_' per separare le due parti del nome delle variabili serve proprio per imitare l'operatore '.' delle struct.

In pratica c'è comunque la necessità di distinguere fra la variabile ora del primo orario e la variabile ora del secondo orario, ad esempio. L'uso delle struct risolve questo problema in modo elegante, raggruppando insieme le variabili che appartengono logicamente allo stesso oggetto. Il programma in questo modo ne guadagna senz'altro in leggibilità.

Vedremo nel seguito altri vantaggi nell'uso delle struct.

 

successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it