Advertisement
elelomb

17luglio2015

Jun 17th, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.61 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 il 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.  
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement