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


#define STRLEN 256

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

int get_positive_int(pchar txt)
 {char s[STRLEN];
  int n;
  do 
   {printf("%s: ",txt);
    scanf("%s",s);
   }  
  while ((n=atoi(s))<=0);
  return n;
 }

float get_float(pfile pf)
 {char s[STRLEN];
  fscanf(pf,"%s",s);
  return atof(s);
 }

void get_str(pchar txt,pchar s)
 {do 
   {printf("%s: ",txt);
    scanf("%s",s);
   }
  while(!s[0]);
 }

int main(void)
 {int    i_f,i_v,n_files,n_vals;
  char   basename[STRLEN],all_ext[STRLEN],filtered_ext[STRLEN],s[STRLEN];
  ppfile ppf;
  pfile  ff,fa;
  float  tm,tm1,tm2,vm,vm1,vm2;
  
  n_files=get_positive_int("Num files");
  if ((ppf=(ppfile)malloc(sizeof(pfile)*n_files))==NULL) goto mem_err;
  n_vals= get_positive_int("Num vals ");
  get_str("Base name",basename);
  get_str("All ext",all_ext);
  get_str("Filtered ext",filtered_ext);
  for(i_f=0;i_f<n_files;i_f++)
   {sprintf(s,"%s.%d",basename,i_f);
    if ((ppf[i_f]=fopen(s,"r"))==NULL) goto file_err;
   }
  sprintf(s,"%s.%s",basename,all_ext);
  if ((fa=fopen(s,"w"))==NULL) goto file_err;
  sprintf(s,"%s.%s",basename,filtered_ext);
  if ((ff=fopen(s,"w"))==NULL) goto file_err;
  for(i_v=0,vm1=vm=tm1=tm=-1.0;i_v<n_vals;i_v++)
   {vm2=vm1;vm1=vm;tm2=tm1;tm1=tm;
    for(tm=vm=0.0,i_f=0;i_f<n_files;i_f++) {tm+=get_float(ppf[i_f]); vm+=get_float(ppf[i_f]);}
    fprintf(fa,"%.2f %.2f\n",tm/=n_files,vm/=n_files);
    if ((i_v>1)&&(vm2<vm1)&&(vm1<vm)&&(tm2<tm1)&&(tm1<tm)) fprintf(ff,"%.2f %.2f\n",tm1,vm1);
    if ((i_v==0)||(i_v==n_vals-1))                         fprintf(ff,"%.2f %.2f\n",tm,vm); 
   }
  fclose(ff); fclose(fa); for(i_f=0;i_f<n_files;i_f++) fclose(ppf[i_f]); free(ppf);
  return EXIT_SUCCESS;

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

