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

#define NOMEFILEEQS "eqs.txt"
#define NOMEFILELIM "lim.txt" 
#define STRLEN   256
#define STEPS    1000

typedef struct _eq
 {float v1;
  float v2;
  float v3;
  char  tipo;
  char  sign;
 } eq;

typedef eq*   peq;
typedef char* pchar;
typedef FILE* pfile;

int main(void)
 {char s[STRLEN];
  float xmin,ymin,xmax,ymax,dx,dy,x,y,v,as,v1,v2,v3; 
  pfile f;
  peq   pe,pe2;
  int   i,neqs,np=0;
  char  c;
  
  if ((f=fopen(NOMEFILELIM,"r"))==NULL) goto file_err;
  fscanf(f,"%s",s); xmin=atof(s);
  fscanf(f,"%s",s); ymin=atof(s);
  fscanf(f,"%s",s); xmax=atof(s);
  fscanf(f,"%s",s); ymax=atof(s);
  fclose(f);
  printf("Dominio: (%.2f,%.2f)-(%.2f,%.2f) As=%.2f\n",xmin,ymin,xmax,ymax,as=(xmax-xmin)*(ymax-ymin));
 

  if ((f=fopen(NOMEFILEEQS,"r"))==NULL) goto file_err;
  fscanf(f,"%s",s); neqs=atoi(s);
  printf("Acquisisco le %d disequazioni:\n",neqs);
  if ((pe=(peq)malloc(sizeof(eq)*neqs))==NULL) goto mem_err;
  for(i=0,pe2=pe;i<neqs;i++,pe2++)
   {fscanf(f,"%s",s); v1=pe2->v1=atof(s);
    fscanf(f,"%s",s); v2=pe2->v2=atof(s);
    fscanf(f,"%s",s); v3=pe2->v3=atof(s);
    fscanf(f,"%s",s); pe2->tipo=s[0];
    fscanf(f,"%s",s); pe2->sign=s[0];
    printf("Eq n.%d: ",i+1);
    if ((pe2->tipo)=='c') printf("(x-%.2f)^2+(y-%.2f)^2-%.2f",v1,v2,v3);
    else                  printf("%.2fx+%.2fy+%.2f"          ,v1,v2,v3);
    if ((pe2->sign)=='+') printf(">"); else printf("<");
    printf("=0\n");
   }
  fclose(f);
  
  dx=(xmax-xmin)/STEPS;
  dy=(ymax-ymin)/STEPS;
 
  for (x=xmin;x<=xmax;x+=dx)
   for (y=ymin;y<=ymax;y+=dy)
    {for (i=0,pe2=pe;i<neqs;i++,pe2++)
      {v1=pe2->v1;v2=pe2->v2;v3=pe2->v3;
       if (pe2->tipo=='c') {v1=x-v1; v2=y-v2; v=v1*v1+v2*v2-v3*v3;} 
       else                 v=v1*x+v2*y+v3;
       if (((pe2->sign=='+')&&(v<0.0))||((pe2->sign=='-')&&(v>0.0))) break;
      }
     if (i==neqs) np++;
    }

  printf("Area stimata=%.5f\n",np*as/((STEPS+1)*(STEPS+1)));
  return EXIT_SUCCESS;

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