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

#define FILE_IN_DOTS     "dots.bin"
#define FILE_IN_CIRCLES  "circles.bin"
#define FILE_OUT_RMSE    "rmse.txt"

typedef struct _dot    {double x,y;}    dot;
typedef struct _circle {float xc,yc,r;} circle;
typedef dot*                            pdot;
typedef circle*                         pcircle;
typedef FILE*                           pfile;

int main(void)
 {
  pdot    pd,pdtmp;
  circle  c;
  pfile   fi,fo;
  int     nd,nc,ic,id,minic;
  double  dx,dy,d,sumd,minsumd=DBL_MAX;
  
  if ((fi=fopen(FILE_IN_DOTS,"rb"))==NULL)      goto file_err;
  if ((fread(&nd,sizeof(int),1,fi))!=1)         goto file_err;
  if ((pd=(pdot) malloc(sizeof(dot)*nd))==NULL) goto mem_err;
  if ((fread(pd,sizeof(dot),nd,fi))!=nd)        goto file_err;
  fclose(fi);

  if ((fo=fopen(FILE_OUT_RMSE,"w"))==NULL)      goto file_err;
  if ((fi=fopen(FILE_IN_CIRCLES,"rb"))==NULL)   goto file_err;
  if ((fread(&nc,sizeof(int),1,fi))!=1)         goto file_err;
  for(ic=0;ic<nc;ic++)
   {if ((fread(&c,sizeof(circle),1,fi))!=1)     goto file_err;
    for(id=0,sumd=0.0,pdtmp=pd;id<nd;id++,pdtmp++)
     {dx=c.xc-pdtmp->x;dy=c.yc-pdtmp->y;
      d=sqrt(dx*dx+dy*dy)-c.r;
      sumd+=d*d;
     }
    sumd=sqrt(sumd);
    fprintf(fo,"%.2lf\n",sumd);
    if (sumd<minsumd) {minsumd=sumd;minic=ic;}
   }
  fclose(fi);
  fclose(fo);
  printf("Al cerchio num %d corrisponde la rmse min pari a %.2lf\n",minic+1,minsumd);
  return EXIT_SUCCESS;

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