#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