#include <stdio.h>
#include <stdlib.h>

#define FILE_IN      "dati.bin"
#define FILE_OUT     "dati_filtrati.txt"
#define FILE_OUT2    "dati_normalizzati.txt"
#define FILEBASENAME "hist"
#define TH_MIN       0.0
#define FACT_MAX     2.0
#define MAXSTRLEN    256

typedef FILE*   pfile;
typedef pfile*  ppfile;
typedef double* pdouble;
typedef char*   pchar;

int main(void)
 {pfile    pf;
  ppfile   ppf;
  unsigned n,i,n1,nfiles;
  double   v,s,vmn,vmx;
  pdouble  pm;
  char     str[MAXSTRLEN];

  if ((pf=fopen(FILE_IN,"rb"))==NULL) goto file_err;
  fread(&n,sizeof(unsigned),1,pf);
  if((pm=(pdouble)malloc(sizeof(double)*n))==NULL) goto mem_err;   
  if (fread(pm,sizeof(double),n,pf)!=n) goto file_err;
  fclose(pf);  

  for(i=0,s=0.0;i<n;i++) s+=pm[i];
  printf("La media del file %s e' pari a %.3f\n",FILE_IN,s/=n);
  for(n1=i=0,vmn=s,vmx=-1.0,s*=FACT_MAX;i<n;i++) 
   {v=pm[i]; 
    if ((v>=0)&&(v<=s)) 
     {pm[n1++]=v;
      if (v<vmn) vmn=v;
      if (v>vmx) vmx=v;
     }
   }
  printf("min=%.3f max=%.3f\n",vmn,vmx); 
 
  if ((pf=fopen(FILE_OUT,"w"))==NULL) goto file_err;
  fprintf(pf,"%u\n",n1);
  for(i=0;i<n1;i++) fprintf(pf,"%.3f\n",pm[i]);
  fclose(pf);

  if ((pf=fopen(FILE_OUT2,"w"))==NULL) goto file_err;
  fprintf(pf,"%u\n",n1);
  for(i=0,v=1.0/(vmx-vmn);i<n1;i++) fprintf(pf,"%.3f\n",pm[i]=(pm[i]-vmn)*v);
  fclose(pf);
  
  printf("Quanti files dobbiamo produrre? ");
  scanf("%s",str);
  nfiles=atoi(str);
  
  if((ppf=(ppfile)malloc(sizeof(pfile)*nfiles))==NULL) goto mem_err;   
  for(i=0;i<nfiles;i++)
   {sprintf(str,"%s%u.txt",FILEBASENAME,i);
    if((ppf[i]=fopen(str,"w"))==NULL) goto file_err;
   }

  for(i=0;i<n1;i++)
   {v=pm[i];
    n=v*nfiles;
    printf("n=%d\n",n);
    if (n>=nfiles) n=nfiles-1;
    printf("v=%f file=%d\n",v,n); fflush(stdout);
    fprintf(ppf[n],"%.3f\n",v);
   }
  for(i=0;i<nfiles;i++) fclose(ppf[i]); 

  free(pm);

  return EXIT_SUCCESS;

  file_err: printf("Problema coi files!!\n");      return EXIT_FAILURE;
  mem_err:  printf("Problema con la memoria!!\n"); return EXIT_FAILURE;
 }
