Advertisement
Guest User

15_07_15_2_CORRETTO

a guest
May 21st, 2019
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.60 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_RETTE  "rette.bin"
  8. #define CONST       2.829
  9.  
  10. typedef struct _dot
  11.   {
  12.     int x,y;
  13.   }dot;
  14.  
  15. typedef struct _retta
  16.   {
  17.     float a,b,c;
  18.   }retta;
  19.  
  20. typedef float* pfloat;
  21. typedef dot*   pdot;
  22. typedef retta* pretta;
  23. typedef FILE*  pfile;
  24.  
  25. int main (void)
  26.   {
  27.     int    i, j, n_r,n_d,n1=0,n2=0;
  28.     dot    d;
  29.     float  min1=FLT_MAX,min2=FLT_MAX;
  30.     pfloat p_dist;
  31.     pretta p_r;
  32.     pfile  pf;
  33.    
  34.     /*Immagino che i punti siano troppi per essere acquisiti con un fread tutti in una volta*/
  35.     /*Apro file rette, acquisisco numero rette, faccio malloc per contenere le retta, le acquisisco e chiudo il file*/
  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.  
  48.     /*Apro file punti, acquisisco il numero di punti*/
  49.     if((pf=fopen(FILE_PUNTI,"rb"))==NULL)                      goto fopen_err;
  50.     if((fread(&n_d,sizeof(int),1,pf))!=1)                      goto fread_err;
  51.  
  52.     /*Faccio malloc per contenere le distanze rette-punti*/
  53.     if((p_dist=(pfloat)malloc(sizeof(float)*n_r))==NULL)       goto mem_err;
  54.    
  55.     /*Inizializzo vettore distanze a zero*/
  56.     for(i=0;i<n_r;i++)
  57.       p_dist[i]=0;
  58.  
  59.     printf("Ti stampero' le rette la cui distanza media dai punti sia < %f\n",CONST);
  60.  
  61.     /*Ciclo grosso per leggere i punti uno alla volta, ciclo piccolo (che scorre fra le rette) per calcolare le distanze fra punto appena acquisito e le varie rette, metto le varie distanze nell'array p_dist sommandoci sopra, chiudo file rette*/
  62.     for(i=0;i<n_d;i++)
  63.       {
  64.         if((fread(&d,sizeof(dot),1,pf))!=1)                      goto fread_err; //AVEVAMO SCRITTO (fread(&d,sizeof(int),1,pf))!=1)
  65.         for (j=0;j<n_r;j++)
  66.           {
  67.             p_dist[j]+=fabs((p_r[j].a*d.x)+(p_r[j].b*d.y)+(p_r[j].c))/(sqrt((p_r[j].a)*(p_r[j].a)+(p_r[j].b)*(p_r[j].b)));
  68.           }
  69.       }
  70.      
  71.     fclose(pf);
  72.    
  73.     /*Ciclo per calcolare distanza media retta-punti che metto sempre in p_dist, con un if controllo p_dist<soglia in tal caso stampo retta e distanza, dentro cerco primo e secondo minimo*/
  74.    
  75.     for(i=0;i<n_r;i++)
  76.       {
  77.         p_dist[i]/=n_d;
  78.         if (p_dist[i]<CONST)
  79.           {
  80.             printf("La retta %d:(%f)x+(%f)y+(%f)=0 ha distanza %f\n",(i+1),p_r[i].a,p_r[i].b,p_r[i].c,p_dist[i]);
  81.             if (p_dist[i]<min1)
  82.               {
  83.                 min2=min1;
  84.                 n2=n1;
  85.                 min1=p_dist[i];
  86.                 n1=i;
  87.               }
  88.             else
  89.               if(p_dist[i]<min2)
  90.                 {
  91.                   min2=p_dist[i];
  92.                   n2=i;
  93.                 }
  94.           }  
  95.       }
  96.      
  97.     printf ("La retta che meglio approssima i nostri dati e' %d\nseguita dalla %d\n",n1+1,n2+1);
  98.  
  99.     free(p_r);
  100.     free(p_dist);
  101.     return EXIT_SUCCESS;
  102.  
  103.     fopen_err: printf("C'e' un problema nell'apertura del file.\n");              return EXIT_FAILURE;
  104.     fread_err: printf("Il numero acquisito non coincide con quello inserito.\n"); return EXIT_FAILURE;
  105.     mem_err:   printf("Non c'e' abbastanza spazio in memoria.\n");                return EXIT_FAILURE;
  106.    
  107.   }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement