Advertisement
Guest User

prova

a guest
May 20th, 2019
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.01 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <float.h>
  5.  
  6. #define FILE_PUNTI  "hits.bin"
  7. #define FILE_PUNTI2 "nostro.bin"
  8. #define FILE_RETTE  "rette.bin"
  9. #define CONST       2.829
  10.  
  11. typedef struct _dot
  12.   {
  13.     int x,y;
  14.   }dot;
  15.  
  16. typedef struct _retta
  17.   {
  18.     float a,b,c;
  19.   }retta;
  20.  
  21. typedef float* pfloat;
  22. typedef dot*   pdot;
  23. typedef retta* pretta;
  24. typedef FILE*  pfile;
  25.  
  26. int main (void)
  27.   {
  28.     int    i, j, n_r,n_d;
  29.     dot    d;
  30.     float  a,b,c,min1=FLT_MAX,min2=FLT_MAX;
  31.     pfloat p_dist;
  32.     pretta p_r;
  33.     pfile  pf,pf2;
  34.    
  35.    /*Immagino che i punti siano troppi per essere acquisiti con un fread tutti in una volta*/  
  36.     if((pf=fopen(FILE_RETTE,"rb"))==NULL)                      goto fopen_err;
  37.     if((fread(&n_r,sizeof(int),1,pf))!=1)                      goto fread_err;
  38.     if((p_r=(pretta)malloc(sizeof(retta)*n_r))==NULL)          goto mem_err;
  39.     if((fread(p_r,sizeof(retta),n_r,pf))!=n_r)                 goto fread_err;
  40.     fclose(pf);
  41. /*
  42.     for(i=0;i<n_r;i++)
  43.       {
  44.         printf("La retta %d e': (%f)x+(%f)y+(%f)=0\n",(i+1),p_r[i].a,p_r[i].b,p_r[i].c);
  45.       }
  46. */    
  47.     if((pf=fopen(FILE_PUNTI,"rb"))==NULL)                      goto fopen_err;
  48.     if((fread(&n_d,sizeof(int),1,pf))!=1)                      goto fread_err;
  49.     if((pf2=fopen(FILE_PUNTI2,"wb"))==NULL)                    goto fopen_err;
  50.     for (i=0;i<n_d;i++)
  51.       {
  52.         if((fread(&d,sizeof(dot),1,pf))!=1)                    goto fread_err;      
  53.         fwrite(&d,sizeof(dot),1,pf2);
  54.       }
  55.    
  56.     fclose(pf);
  57.     fclose(pf2);
  58.      
  59.     if((p_dist=(pfloat)malloc(sizeof(float)*n_r))==NULL)       goto mem_err;
  60.    
  61.     for(i=0;i<n_r;i++)
  62.       p_dist[i]=0;
  63.  
  64.     printf("Ti stampero' le rette la cui distanza media dai punti sia < %f\n",CONST);
  65.  
  66.     for (i=0;i<n_r;i++)
  67.       {
  68.         if((pf=fopen(FILE_PUNTI2,"rb"))==NULL)                 goto fopen_err;
  69.         a=p_r[i].a; /*vengono richiamate tante volte*/
  70.         b=p_r[i].b;
  71.         c=p_r[i].c;
  72.         for (j=0;j<n_d;j++)
  73.           {
  74.             if((fread(&d,sizeof(dot),1,pf))!=1)                goto fread_err;
  75.             p_dist[i]+=fabs((a*d.x)+(b*d.y)+c)/(sqrt((a*a)+(b*b)));
  76.           }
  77.         p_dist[i]/=n_d;  /*media distanze*/
  78.         if(p_dist[i]<CONST)
  79.           printf ("La retta %dĀ°: (%f)x+(%f)y+(%f)=0  con distanza %f\n",(i+1),a,b,c,p_dist[i]);
  80.         fclose(pf);
  81.       }
  82.          
  83.     for (i=0;i<n_r; i++)
  84.       {
  85.         if(p_dist[i]<min1)
  86.           {
  87.             min2=min1;
  88.             min1=p_dist[i];
  89.           }
  90.       }
  91.  
  92.     printf ("Il primo minimo e' %f\nIl secondo minimo e'%f\n",min1,min2);
  93.     free(p_r);
  94.     free(p_dist);
  95.     return EXIT_SUCCESS;
  96.  
  97.     fopen_err: printf("C'e' un problema nell'apertura del file.\n");              return EXIT_FAILURE;
  98.     fread_err: printf("Il numero acquisito non coincide con quello inserito.\n"); return EXIT_FAILURE;
  99.     mem_err:   printf("Non c'e' abbastanza spazio in memoria.\n");                return EXIT_FAILURE;
  100.  
  101.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement