*
* Viste le variabili, le stringhe e gli array, possiamo introdurre un nuovo
* tipo di dati, le STRUTTURE, che sono un conglomerato di dati.
* In altri termini, in C una struttura e' un insieme di variabili definito
* da un nome comune. Una struttura e' utile quando dobbiamo gestire un
* gruppo di dati diversi collegati tra loro, ad esempio le varie stringhe
* di testo che compongono un indirizzo: l'array di caratteri che contiene
* il nome, quello che contiene il cognome ecc.
* Nota: in Java non esistono strutture, ma solo classi (ossia oggetti),
* che vedremo nel C++. Comunque, dato che le classi "derivano" dalle
* strutture, e' bene conoscerle, anche se useremo in Java una loro versione
* estesa e object oriented.
* La parola chiave per la dichiarazione di una struttura e' "struct",
* vediamola all'opera:
*
* struct indirizzo {
* char nome[30];
* char via[60];
* char citta[20];
* char stato[2];
* int cap;
* };
*
* Le cose da notare sono 2: la prima e' che all'interno della struttura ci
* possono essere tipi di dati diversi (array char, int, ecc.), la seconda
* e' la sintassi: si mette un nome a piacere dopo "struct", poi si apre
* la parentesi { graffa, si immettono gli elementi terminati ognuno col
* punto e virgola, infine si chiude la parentesi graffa e si mette un punto
* e virgola finale.
* Comunque va notato che questa dichiarazione, in questa forma, non genera
* le variabili, ma la "forma" della struttura chiamata "indirizzo".
* Ossia definiamo un tipo di dati complesso, astrattamente.
* Per creare fisicamente una struttura del tipo descritto, occorre scrivere:
*
* struct indirizzo mioindirizzino;
*
* Soltanto ora abbiamo creato un esemplare della struttura indirizzo, che
* risponde al nome mioindirizzino.
* E' possibile creare subito uno o piu' esemplari di strutture subito, al
* momento della dichiarazione, basta mettere i nomi delle stesse tra la
* parentesi graffa } chiusa e il punto e virgola finale, separandoli con
* delle virgole:
*
* struct indirizzo {
* char nome[30];
* char via[60];
* char citta[20];
* char stato[2];
* int cap;
* } mioindirizzino, indirizzuccio, indirizzucolo;
*
* In questo modo, oltre a dichiarare la forma della struttura indirizzo,
* ne abbiamo creati subito 3 esemplari: mioindirizzino, indirizzuccio e
* indirizzucolo.
* Se si volesse creare una sola struttura, invece, l'indentificatore della
* struttura (in questo caso "indirizzo") sarebbe superfluo:
*
* struct {
* char nome[30];
* char via[60];
* char citta[20];
* char stato[2];
* int cap;
* } indirizzucolo;
*
* Abbiamo cosi' omesso l'identificatore "indirizzo", creando solamente
* l'esemplare unico e irripetibile "indirizzucolo".
* Ora sappiamo come creare strutture... ma come facciamo a leggere e
* scrivere nei suoi elementi?
* Esiste un operatore speciale, l'operatore punto ".", che si mette tra
* il nome della struttura e il nome dell'elemento, ad es:
*
* indirizzucolo.cap = 55100;
*
* Con questa istruzione scrivo nella variabile cap di indirizzucolo il
* valore 55100. Analogamente, con indirizzucolo.via e indirizzucolo.citta
* accedo a via e citta' nella struttura "indirizzucolo", sia in lettura che
* in scrittura. In altri termini, il nome della struttura, seguito da un
* punto e dal nome dell'elemento, e' un riferimento a quel singolo elemento
* della struttura. Visualiziamo il cap:
*
* printf("Il cap e' %d", indirizzucolo.cap);
*
* Allo stesso modo, possiamo scrivere nel nome con gets():
*
* gets(indirizzucolo.nome);
*
* Si puo' anche accedere ai singoli elementi degli array all'interno della
* struttura:
*
* indirizzucolo.nome[0] = "P";
* indirizzucolo.nome[1] = "i";
* indirizzucolo.nome[2] = "p";
* indirizzucolo.nome[3] = "p";
* indirizzucolo.nome[4] = "o";
*
* La notazione e' la consueta, a parte quel "indirizzucolo." iniziale.
* Vediamo ora un utilizzo semplice e compilabile.
*/
#include <stdio.h> /* Includiamo la libreria standard */
struct indirizzo { /* Definiamo e creiamo una struttura */
char nome[30];
char via[60];
char citta[20];
};
/* Funzione principale e inizio del programma */
int main(void) /* Funzione principale, eseguita per prima */
{ /* Inizio della funzione main() */
struct indirizzo indirizzucolo; /* Creiamo 1 esemplare della struttura
indirizzo di nome indirizzucolo */
printf("Scrivi il tuo nome: ");
gets(indirizzucolo.nome); /* Mi prendo una stinga con gets */
printf("Scrivi la via: ");
gets(indirizzucolo.via); /* Mi prendo una stinga con gets */
printf("Citta': ");
gets(indirizzucolo.citta); /* Mi prendo una stinga con gets */
/* Stampiamo le stringhe dalla struttura (usare %s nel printf!!) */
printf("\n\nTi chiami %s", indirizzucolo.nome);
printf("\nStai in via %s", indirizzucolo.via);
printf("\nDella meravigliosa citta' di %s", indirizzucolo.citta);
/* Stampiamo un carattere solamente di un array nella struttura */
printf("\n\nE Il nome comincia per %c.\n", indirizzucolo.nome[0]);
/* Stampiamo un messaggio umoristico finale... */
printf("\n\nTi chiederai come ho fatto a saperlo...\n\n");
return(0); /* la funzione main restituisce uno 0 intero */
} /* Fine della funzione main() */
/* Ora vi chiederete: ma non si faceva prima a farsi semplicemente questi
* 3 array e usarli senza doversi fare la struttura? Ebbene si.
* Ma nella prossima lezione vedremo quanto le strutture possano essere
* utili, se riunite in array.
* Notate comunque che in una struttura possiamo inserie anche altre
* strutture, oltre a int, char, float...
*/
