*
 * Ora parleremo di un modo per sostituire numeri con nomi, tramite le
 * funzionalita' del #define, un comando del preprocessore.
 * Il C in un primo passaggio di compilazione svolge le attivita' del
 * preprocessore, che si occupa di eseguire le direttive #include e #define.
 * Abbiamo gia' visto che #include serve per includere nel listato dei
 * file header, che non sono altro che altri pezzi di listato con delle
 * cose a noi utili, con delle costanti, strutture o funzioni gia' definite.
 * Possiamo definire anche dei nostri file header e includerli.
 * Il comando #define invece serve per operare delle sostituzioni di parole
 * con altre, prima della compilazione vera e propria. Ad esempio:
 *
 * #define PI_GRECO 3.1415
 *
 * Permette di scrivere PI_GRECO nel listato al posto di 3.1415, e badate
 * bene che non definiamo una variabile! Semplicemente c'e' uno scambio di
 * testi, in modo analogo alle funzioni "replace" dei text editor.
 * Operazioni di sostituzione di questo tipo possono essere utili per rendere
 * piu' leggibile un listato, sostituendo i numeri con parole che si
 * riferiscono al significato di tale numero.
 * Da notare che la prassi vuole che gli identificatori, ossia le stringhe
 * sostituite col define, siano a caratteri MAIUSCOLI, a differenza delle
 * variabili, e cio' contribuisce a distinguere variabili da identificatori.
 * Inoltre, se dovessimo mettere lo stesso numero in un sacco di punti
 * del listato, e poi un giorno dovessimo modificare quel valore, dovremmo
 * ricercarlo e cambiarlo in tutti i punti del listato, mentre se lo
 * definiamo con #define, bastera' cambiare il #define e cambieremo
 * automaticamente quel valore in tutto il listato.
 * La sintassi e' questa: si mette il #define, poi il testo che vogliamo
 * usare nel listato, infine il testo con cui sara' scambiato al momento
 * del preprocessing. Questi due testi devono essere separati da uno spazio.
 * Vediamo alcuni esempi:
 *
 * #define NUM_PAGINE 400
 * #define NOME_AUTORE Dante
 * #define TITOLO Divina_Commedia
 *
 * A questo punto, quando scriviamo nel listato:
 *
 * NUM_PAGINE
 * NOME_AUTORE
 * TITOLO
 *
 * Il preprocessore sostituira' i testi prima di iniziare, ottendendo:
 *
 * 400
 * Dante
 * Divina_Commedia
 *
 * Con il #define si possono definire anche MACRO piu' complicate, ma
 * vedremo al momento opportuno.
 * Da notare che le sostituzioni non avvengono nelle stringhe di testo
 * racchiuse tra "".
 * Gia' che ci siamo, facciamo una precisazione sulla dichiarazione delle
 * variabili. Abbiamo gia' detto che vanno dichiarate prima di essere
 * usate. Ad esempio:
 *
 *	int pluto;
 *
 * Comunque, e' possibile inizializzarla nella dichiarazione stessa,
 * dandogli un valore:
 *
 *	int pluto = 1000;
 *
 * In questo modo la variabile e' dichiarata ed ha gia' il valore di 1000.
 * Cio' e' equivalente a questo:
 *
 *	int pluto;
 *	pluto = 1000;
 *
 * Poi la variabile puo' essere cambiata in qualsiasi momento, normalmente.
 * A questo punto dovrebbe essere chiara la differenza:
 *
 * #define GIORNI 365
 * int pluto = 1000;
 *
 * Il #define permette solamente di scrivere GIORNI al posto di 365, mentre
 * l' "int pluto=1000;" e' una dichiarazione di variabile, la quale potra'
 * essere usata nel programma e potra' assumere qualsiasi valore.
 * Vediamo un listato di esempio, ricavato dal precedente:
*/


#include <stdio.h>	/* Includiamo la libreria standard */


#define VALORE1 500	/* Quando scrivo VALORE1 nel listato ottengo 500,
			 * dato che sara' scambiato col testo "500". */

#define VAL_TO 21.06	/* definisco VAL_TO = 21.06 */

#define PI_GRECO 3.1415	/* definisco PI_GRECO = 3.1415 */


int pluto = 1000;	/* Dichiaro una variabile intera dandogli subito
			 * il valore 1000 */

int pippo;		/* Dichiaro una variabile di tipo int */

float topo, papero;	/* Dichiaro 2 variabili di tipo float */


main()			/* Funzione principale, eseguita per prima */

{			/* Inizio della funzione main() */

	pippo = pluto + VALORE1; /* Assegno a pippo il val. di pluto + 500 */

	topo = VAL_TO;	/* Assegno a topo il valore 21,06 */

	papero = PI_GRECO; /* Assegno a papero il valore 3.1415 */


/* Stampo il valore di 2 variabili di tipo INT con un solo printf() */

	printf("Pluto = %d , Pippo = %d\n", pluto, pippo);

/* Stampo il valore di 2 variabili di tipo FLOAT con un solo printf() */

	printf("Topo = %f , Papero = %f\n", topo, papero);

/* Stampo il valore di tutte le 4 variabili con un solo printf() */


 printf("Pluto=%d ,Pippo=%d ,Topo=%f ,Papero=%f\n",pluto,pippo,topo,papero);


}			/* Fine della funzione main() */


/* Questo listato fa esattamente le stesse cose del precedente, solo che
 * e' stato introdotto il #define e si e' inizializzata una variabile
 * dandogli subito un valore.
 * Da notare che in Java il #define e' assente.
*/