sabato 23 febbraio 2008

Statistiche....passo dopo passo...

/*
* Descrizione : Programma che acquisisce una sequenza di numeri casuali
* da un file e scrive su due file l'istogramma in frequenza
* dei numeri stessi nonche' la loro sequenza ordinata in maniera
* decrescente.
*
* Input : dati_in.dat
*
* Output : histo_freq.dat, sort.dat
*
*/

#include
#include
#include

#define N 15000 /* numero max di dati: determinato da shell col comando "wc -l dati_in.dat" */
#define MAX_BIN 1000 /* numero max di bin */

int main(void) {

register int i,j;
int numero_dati; /* numero effettivo di dati letti */
char linea[128]; /* usata da fgets */
double tmp;
double max, min, media, media2, dev_std;
int n_bin_freq; /* numero di bin effettivi usati per l'istogramma */
double dx; /* larghezza bin */
double histo_freq[MAX_BIN];
double Dati[N]; /* dati da trattare */

FILE *fp_in, *fp_freq, *fp_sort; /* dichiarazione degli streams di input/output */

/* inizializzazione degli stream mediante associazione con un file */

if(!(fp_in = fopen("dati_in.dat", "r"))) {
fprintf(stderr,"Errore nella apertura input file di dati\n");
/* Messaggio di errore in accesso lettura (il file non esiste) */
exit(1);
}
if(!(fp_freq = fopen("histo_freq.dat", "w"))) {
fprintf(stderr,"Errore nella apertura file di output 1\n");
/* Messaggio di errore in accesso scrittura */
exit(1);
}
if(!(fp_sort = fopen("sort.dat", "w"))) {
fprintf(stderr,"Errore nella apertura file di output 2\n");
/* Messaggio di errore in accesso scrittura */
exit(1);
}


/********************************************************/
/* Lettura dati e immagazzinamento nel vettore Dati */

i=j=0;
while(1) { /* ciclo infinito da terminare con break */
++j; /* conteggio numero di linee lette */
fgets(linea, 128, fp_in);
if(feof(fp_in)) break;
/* interruzione del ciclo quando si e' raggiunta la fine del file */
if(sscanf(linea, "%lf", &Dati[i])==1) ++i;
/* i conta il numero di dati letti, saltando le linee vuote */
else printf("Attenzione: dato sospetto alla linea %d\n", j);
}

numero_dati = i; /* numero effettivo di dati letti */
printf("Numero totale di dati letti: %u\n", numero_dati);
/********************************************************/


/********************************************************/
/* determina max, min, media e deviazione standard */

media = max = min = Dati[0]; /* inizializzazione con il primo dato */
media2 = Dati[0] * Dati[0]; /* inizializzazione con il primo dato */
for(i=1;imax) max=tmp; /* determinazione del massimo */
if(tmp < min="tmp;"> */
media2 /= numero_dati; /* calcolo della media dei quadrati */
dev_std = sqrt(media2 - media*media); /* calcolo della deviazione standard sqrt( - ^2) */

printf("Media: %f Dev.Std.: %f Max: %f Min: %f\n",
media, dev_std, max, min); /* stampa dei risultati */

/********************************************************/


/********************************************************/
/* istogramma */
/* Lettura numero di bin dall'esterno */

do {
printf("Scegli il numero dei bin per l'istogramma in frequenza (<= %d):", MAX_BIN); fgets(linea, sizeof(linea), stdin); /* scelta del numero di bin da usare per l'istogramma */ sscanf(linea, "%d", &n_bin_freq); } while(n_bin_freq <1> MAX_BIN);

/* Inizializzazione istogrammi */

dx = 1.0001*(max - min) / n_bin_freq; /* Larghezza bin */
for (i = 0; i < x =" min" x =" max." x =" max" i="0;" normalizzazione="" con="" il="" numero="" dei="" dati="" i="0;">< i="0;" f="" n="" stampa="" risultati="" su="" due="" colonne="" che="" contengono="" la="" coordinata="" centro="" del="" bin="" dx="" il="" valore="" di="" ordinamento="" decrescente="" dei="" dati="" algoritmo="" for="" i="1;">< tmp =" Dati[i];" j =" i-1;">=0 && tmp>Dati[j]) {
Dati[j+1] = Dati[j];
--j;
}
Dati[j+1]=tmp;
}
/* scrittura dei dati ordinati sul file sort.dat */

for(i=0; i
fprintf(fp_sort, "%f\n",Dati[i]);
fclose(fp_sort);

/********************************************************/


return 0;
}

Nessun commento: