*
 * ARRAY DI STRUTTURE.
 * Per definire un array di strutture e' necessario definire una struttura
 * e poi dichiarare una array di quel tipo. Ad es:
 *
 * struct indirizzo {	    ; Definiamo una struttura "indirizzo"
 *	 char nome[30];
 *	 char via[60];
 *	 char citta[20];
 *       };		    ; Senza crearne fisicamente ancora nessuna.
 *
 * struct indirizzo moltindiriz[100];
 *
 * Come si vede, con l'ultima istruzione abbiamo creato un array di 100
 * strutture di tipo "indirizzo", il cui nome e' moltindirizz, utilizzabile
 * come un'agenda contenente max 100 indirizzi.
 * A questo punto, per accedere ad un certo elemento di un certo indirizzo
 * all'interno dell'agenda, si puo' fare cosi':
 *
 *	printf("%s", moltindirizzi[3].nome);	* Stampa il nome
 *	printf("%s", moltindirizzi[8].citta);	* Stampa la citta'
 *
 * Queste due istruzioni stampano rispettivamente il nome del quarto
 * indirizzo e la citta' del nono (gli array partono da 0).
 * Ora alcune note:
 * 1) Se due variabili struttura sono del medesimo tipo, e' possibile
 *    assegnare l'una all'altra (ossia copiare l'una nell'altra). Es:
 *
 *	struttura1 = struttura2;       ; essendo dello stesso tipo le copio!
 *	moltindirizzi[3] = moltindirizzi[8];     ; Idem.
 *
 * 2) Gli elementi di una struttura possono essere di qualsiasi tipo di
 *    dati valido in C, inclusi array e strutture. Quindi e' possibile
 *    creare anche delle STRUTTURE NIDIFICATE, ossia delle strutture
 *    all'interno di altre strutture. Vediamo un esempio:
 *
 *	struct berlusconi {
 *			    struct indirizzo dovestai;
 *			    int soldiposseduti;
 *			    int retipossedute;
 *			    int votipresi;
 *			    char ultimodiscorso[300];
 *			   };
 *
 * In questo caso notiamo che la struttura contiene un'altra struttura
 * tra i suoi elementi. Per accedere a elementi come interi, float o array
 * basta usare la solita sintassi col punto:
 *
 *	berlusconi.ultimodiscorso = "Mi consenta";
 *
 * Per accedere agli elementi nidificati della struttura indirizzo, invece:
 *
 *	berlusconi.dovestai.citta = "Milano";
 *
 * Ossia, ci si riferisce agli elementi di ciascuna struttura a partire
 * da sinistra verso destra e dall'esterno all'interno ricordandosi di
 * separare con l'operatore "." punto.
 *
 * Vediamo di mettere in pratica le ultime cose dette:
 */

#include 	/* Includiamo la libreria standard */

 struct indirizzo {	    /* Definiamo una struttura "indirizzo" */
	 char nome[30];
	 char via[60];
	 char citta[20];
       };		    /* Senza crearne fisicamente ancora nessuna */


 struct dativari {
		    struct indirizzo dovestai;
		    char frasefamosa[60];
		   };


/* Funzione principale e inizio del programma */

int main(void)		/* Funzione principale, eseguita per prima */
{			/* Inizio della funzione main() */

   int i;
   struct dativari moltindirizz[4]; /* Array di 4 strutture dativari */

   for(i=0; i<3; i++) {				/* Con il for richiedo 3
						   indirizzi da riempire */
	printf("\nIndirizzo n.%d:",i);
	printf("\nScrivi il tuo nome: ");
	gets(moltindirizz[i].dovestai.nome);	/* strutt. nidificata! */
	printf("Scrivi la via: ");
	gets(moltindirizz[i].dovestai.via);	/* idem */
	printf("Citta': ");
	gets(moltindirizz[i].dovestai.citta);	/* idem */
	printf("Una frase famosa: ");
	gets(moltindirizz[i].frasefamosa);	/* array non nidificato */
      }

/* Il quarto indirizzo lo ottengo copiandoci il primo: */

	moltindirizz[3] = moltindirizz[0];	/* Copia di strutture! */

/* Stampiamo qualche dato qua' e la' per verifica: */

 printf("\n\nNome primo indirizzo: %s", moltindirizz[0].dovestai.nome);
 printf("\nVia secondi indirizzo: %s", moltindirizz[1].dovestai.via);
 printf("\nCitta' terzo indirizzo: %s", moltindirizz[2].dovestai.citta);
 printf("\nFrase famosa primo indirizzo: %s", moltindirizz[0].frasefamosa);

	return(0);	/* la funzione main restituisce uno 0 intero */
} 			/* Fine della funzione main() */


/* Per programmi che devono gestire molti dati questo sistema a strutture
 * puo' essere molto vantaggioso, sia per la leggibilita' del listato che
 * per l'economia generale.
 */