#include <stdio.h> #define DIM_ORIZZ 80 #define P '*' typedef struct{ int etichetta; double valore; } coppia; // elemento base dell'array da cui tracciare l'istogramma int posMax(coppia *dati, int nDati); int posMin(coppia *dati, int nDati); void istogramma(coppia *dati, int nDati); /* * provaIsto.c * * Legge da file un array di coppie <etichetta,valore>, le carica in un array e * traccia un istogramma a barre orizzontali * */ #include <stdio.h> #define N 10 int main(){ coppia c[N]; // array delle coppie FILE *fp; int n; // conterra' il numero di coppie da tracciare char nFile[64]="dati.txt"; // printf("Inserire nome del file da leggere "); // togliere commento per acquisire da input // scanf("%s",nFile); if ((fp=fopen(nFile,"r"))==NULL){ printf("Impossibile aprire in lettura %s\n",nFile); return 1; } n=0; while(fscanf(fp,"%d %lf",&c[n].etichetta,&c[n].valore)!=EOF && n<N) n++; // al termine i contiene il numero di coppie lette istogramma(c,n); return 0; } // fine main /* * istogramma.c * * Created by Claudio Sartori * Copyright (c) 2004 __University of Bologna__. All rights reserved. * * riceve un array di coppie <label intera, valore> e produce un istogramma a barre orizzontali, * tracciando segni in modalità carattere; * viene tracciato in un'area di ampiezza DIM_ORIZZ caratteri: per il valore minimo viene tracciato * un segno, per il massimo un numero di segni tale da occupare tutto lo spazio * - calcola i valori minimo e massimo, la loro differenza e' l'intervallo su cui distribuire i segni * - calcola il valore di ogni segno, dividendo il numero di segni disponibili per la differenza * sopra calcolata * - ripeti per ogni coppia * - visualizza l'etichetta * - ripeti un numero di volte proporzionale al valore * - scrivi un segno * - vai a capo * */ void istogramma(coppia *dati, // array di coppie di valori int nValori // numero di coppie da usare ){ int i,j; // indici di coppia e di altezza istogramma double valChar, // valore di ogni segno tracciato maxValore,minValore; // minimo e massimo dei valori da tracciare maxValore = dati[posMax(dati,nValori)].valore; minValore = dati[posMin(dati,nValori)].valore; valChar = (DIM_ORIZZ-10)/((maxValore-minValore)+1); // valore di ogni segno printf("Etichetta %-10.2lf",minValore); for (i=0;i<DIM_ORIZZ-30;i++) printf("-"); printf("%10.2lf\n",maxValore); for (i=0;i<nValori;i++){ printf("%10d ",dati[i].etichetta); // scrive etichetta // il +1 nel ciclo sotto serve per tracciare un segno in corrispondenza del minimo for (j=0;j<(int)((dati[i].valore-minValore)*valChar)+1;j++) printf("%c",P); printf("\n"); // scrive linea e va a capo } // for (i=0;i<nValori;i++) } /* * fine istogramma */ /* * posMax * restituisce la posizione del massimo valore */ int posMax(coppia *dati, int nDati){ int i , pMax=0; for(i=1;i<nDati;i++) if(dati[i].valore>dati[pMax].valore) pMax=i; return pMax; } // posMax /* * posMin * restituisce la posizione del minimo valore */ int posMin(coppia *dati, int nDati){ int i , pMin=0; for(i=1;i<nDati;i++) if(dati[i].valore<dati[pMin].valore) pMin=i; return pMin; } // posMin