#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <math.h>

#define STRLEN    1024
#define FILEDIR   "./filetxt/"
#define FILEDIR_BIN "./filebin/"
#define FILENAME  "ciccio"
#define NUM_IN    2
#define NUM_OUT   3
#define PERC      80.0

#define MIN(A,B) (A<B)?A:B
#define MAX(A,B) (A<B)?B:A

typedef int*      pint;
typedef float*    pfloat;
typedef FILE*     pfile;
typedef FILE**    ppfile;

int main(void) 
  {
    ppfile ppfr,ppfw;
    unsigned nval,i,prova;
    char dati[STRLEN],s[STRLEN];
    float temp,sum,sumq,var,min1,max1,min2,max2,c,l;

    if ((ppfr=(ppfile)malloc(sizeof(pfile)*NUM_IN))==NULL) goto err_mem;
    if ((ppfw=(ppfile)malloc(sizeof(pfile)*NUM_OUT))==NULL) goto err_mem;

    for (i=nval=prova=0;i<NUM_IN;i++) /*apre file in lettura e legge il primo numero. lo somma a n_val che indica il numero totale di dati*/
      {
        sprintf(dati,"%s%s.%d.bin",FILEDIR_BIN,FILENAME,i);
        if ((ppfr[i]=fopen(dati,"rb"))==NULL) goto err_file;
        fread(&prova,sizeof(unsigned),1,ppfr[i]);
        nval+=prova;

        printf("File %u aperto in lettura\nval=%u, prova=%u\n",i,nval,prova);
      }
    for (i=0;i<NUM_OUT;i++)
      {
        sprintf(dati,"%s%s.%d.txt",FILEDIR,FILENAME,i);
        if ((ppfw[i]=fopen(dati,"w"))==NULL) goto err_file;
        printf("File %u aperto in scrittura\n",i);

      }
    printf("Misure:\n");
    for (i=0,sum=0,sumq=0,temp=0,min1=FLT_MAX,max1=FLT_MIN;i<nval;i++)
      {
        fread(&temp,sizeof(float),1,ppfr[i%NUM_IN]);
        sum+=temp;
        sumq+=(temp*temp);
        min1=MIN(temp,min1);
        max1=MAX(temp,max1);
        fprintf(ppfw[i%NUM_OUT],"%.1f",temp);
        printf("\t%u) %.1f debug, sum=%f, sumq=%f\n",i,temp,sum,sumq);
      }

      sum/=nval;
      var=(sumq/nval)-(sum*sum);
      c=(max1+min1)/2;
      printf("c %f\n",c);
      l=(max1-c)*(PERC/100);
      max2=c+l;
      min2=c-l;

      printf("Media: %.5f\nDevst: %.5f\nIntervallo 1 [%.2f,%.2f]\nIntervallo ridotto [%.2f,%.2f]\n",sum,sqrt(var),min1,max1,min2,max2);

    return 0;
    err_mem:
        printf("ERRORE: Memoria insufficiente.\n");
        return 1;
    err_file:
        printf("ERRORE: File non trovato\n");
        return 1;

  }