* 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;i
if(tmp < min="tmp;"> */
media2 /= numero_dati; /* calcolo della media dei quadrati
dev_std = sqrt(media2 - media*media); /* calcolo della deviazione standard sqrt(
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:
Posta un commento