struct punto {
float x;
float y;
};
Dopo aver definito questa struttura, noi possiamo definire delle variabili
di tipo punto ed accedere alla loro struttura interna, ad esempio:
struct punto XY1, *XY2; // dichiarazione una variabile e di
// un puntatore alla struttura
XY1.x=1.; // inizializzazione di XY1
XY1.y=2.;
XY2 = (struct punto *)malloc(sizeof(struct punto));
// L'operatore sizeof funziona anche sulle strutture. Ricordarsi di
// fare il cast di malloc
*XY2 = XY1; // esiste l'operatore di assegnazione di strutture
// (copia membro a membro)
printf("Le coordinate del punto 2 sono: (%f,%f)\n",XY2->x,XY2->y);
// per i puntatori l'operatore per accedere alle variabili
// e' "->" invece di "."
Il tutto e' molto piu' snello se usiamo un typedef per abbreviare
la definizione:
typedef struct punto PUNTO;In tal caso le istruzioni diventano semplicemente
PUNTO XY1, *XY2; // dichiarazione una variabile e di
// un puntatore alla struttura
XY1.x=1.; // inizializzazione di XY1
XY1.y=2.;
XY2 = (PUNTO *)malloc(sizeof(PUNTO));
// L'operatore sizeof funziona anche sulle strutture. Ricordarsi di
// fare il cast di malloc
*XY2 = XY1; // esiste l'operatore di assegnazione di strutture
// (copia membro a membro)
printf("Le coordinate del punto 2 sono: (%f,%f)\n",XY2->x,XY2->y);
// per i puntatori l'operatore per accedere alle variabili
// e' "->" invece di "."
Le strutture permettono solamente di raccogliere un insieme di dati, lasciando
agli utenti la massima liberta' (ovvero, nessuna protezione) nella loro
gestione. I linguaggi di programmazione piu' recenti (C++, Java...) tendono
ad enfatizzare delle altre entita' dette oggetti. Mentre una struttura
pone l'enfasi sui dati, gli oggetti pongono l'enfasi sul
comportamento:
un oggetto e' caratterizzato da un insieme di funzioni, dette metodi, attraverso
le quali puo' operare. La sua struttura interna contiene dei dati che pero'
non sono accessibili all'utente: quello che importa sono solo le azioni
che l'oggetto puo' compiere.
TRandom gen;
int i;
for (i=0; i<100; i++) {
printf (" %d \n",gen.Poisson(3.));
}
Come vedete noi possiamo utilizzare gen per fare quello che vogliamo (generare
numeri casuali di diverso tipo) senza sapere niente della sua struttura
interna (enfasi sul comportamento e non sui dati).
Una macro puo' anche contenere la definizione di una nuova funzione,
come la macro randread.c che definisce
una funzione TH1F randread(char*). In tal caso non ha senso eseguire
direttamente la macro (come facciamo a passare i parametri giusti alla
funzione?). Si puo' pero' caricarla in memoria con il comando:
.L nomefile
A questo punto la nuova funzione e' nota a ROOT e puo' essere utilizzata
da linea di comando o da altre macro.
Se ci si accorge che la funzione ha degli errori e si vuole modificare
la macro, nelle versioni piu' recenti di ROOT, si puo':
Poiche' ROOT esegue automaticamente l'inclusione di molti degli include file di sistema, spesso non c'e' bisogno delle dichiarazioni di #include nel file contentente la macro.
Per aggiungere testi, frecce, disegni... sul grafico, e' sufficiente selezionare Editor dal menu Edit. Per visualizzare le coordinate del puntatore del mouse, selezionare Options -> Event Status.
Per modificare la presentazione grafica di un oggetto e' possibile selezionarlo posizionandoci sopra il cursore e schiacciando il bottone destro del mouse. Cio' fa comparire un menu che dipende dal tipo di oggetto selezionato ed indica le opzioni possibili. Particolarmente utili saranno il FitPanel o il DrawPanel per cambiare la rappresentazione degli istogrammi. Per spostare o ridimenzionare un oggetto, basta selezionarlo con il bottone sinistro del mouse.
Il puntatore del mouse cambia forma a seconda dell'oggetto che si sta selezionando, e questa caratteristica permette di facilitare molto la selezione. Puo' essere utile ricordare che il puntatore a croce di solito indica che si sta selezionando un'area di sfondo, la freccia un grafico o un istogramma.
Infine, se avete fatto un bel grafico e volete salvarlo, dal menu File selezionate Save As...
Tale teorema e' la base di tutto il trattamento statistico degli errori
e grosso modo puo' essere formulato:
Siano x1, x2, x3, ...xN numeri casuali tutti estratti da una stessa
distribuzione con valor medio Xm e r.m.s. S. Allorea, per N tendente all'infinito
la quantita' (x1+x2+...+xN)/N tendera' ad avere una distribuizione gaussiana
con valor medio Xm e sigma S/sqrt(N).
Il teorema di fatto dice che, se si fanno tante misure, anche con errori non gaussiani, la media alla fine avra' una distribuzione gaussiana ed una precisione migliore delle singole misure.
Verifichiamo empiricamente che questo succeda.