#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