Advertisement
Irma16

6luglio17

Dec 6th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define FILE_IN "hits1.bin"
  6. #define STRLEN 256
  7. #define ALPHA_MIN -0.5*M_PI // alpha va da -pigreco mezzi (incluso) a pigreco mezzi (escluso)
  8.  
  9. typedef FILE* pfile;
  10. typedef struct _hit
  11.   {
  12.     double x;
  13.     double y;
  14.   }hit;
  15. typedef hit* phit;
  16.  
  17. int get_int_from_file(pfile pf)
  18.   {
  19.      int n_h;
  20.     fread(&n_h, sizeof(int), 1, pf);
  21.     return n_h;
  22.   }
  23. hit get_double_from_file(phit ph, int n_h, pfile pf)
  24.   {
  25.      int i;
  26.     fread(ph, sizeof(hit), n_h, pf);
  27.     return ph[i];
  28.   }
  29.  
  30.  int main(void)
  31.    {
  32.      pfile pf;
  33.      phit ph;
  34.      int n_h, n_r, i, j;
  35.      char s[STRLEN];
  36.      double alpha, d, dmin=0.0, alphamin=ALPHA_MIN, dmed, m;
  37.      
  38.      pf=fopen(FILE_IN, "rb");
  39.      if(pf==NULL)
  40.        {
  41.          printf("errore di lettura file\n");
  42.          return EXIT_FAILURE;
  43.        }
  44.      n_h=get_int_from_file(pf);
  45.      //printf("il numero di hits è %d\n", n_h);
  46.      
  47.      ph=(phit)malloc(sizeof(hit)*n_h); //perchè ci sono coppie di dati (di dim hit) quindi 8 dati per 4 punti in questo file
  48.      if(ph==NULL)
  49.        {
  50.          printf("errore di memoria\n");
  51.          return EXIT_FAILURE;
  52.        }
  53.      ph[i]=get_double_from_file(ph, n_h, pf);//acquisisco su array i punti
  54.      /*for(i=0; i<n_h; i++)
  55.        {
  56.          printf("i dati sono: %f, %f\n", ph[i].x, ph[i].y);
  57.        }*/
  58.      fclose(pf);
  59.      
  60.      printf("Ciao, sono il programma che fa il best fit dei tuoi dati, dammi il numero nr (intero!) di rette con le quali approssimare i dat\n");
  61.      scanf("%s", s);
  62.      n_r=atoi(s); //si potrebbe fare un controllo per essere sicuri che sia un intero
  63.      if(n_r<=0) return EXIT_FAILURE;
  64.      //printf("Il numero di rette che mi hai richiesto è %d\n", n_r);
  65.      
  66.      //generiamo i valori di alpha dentro un intervallo
  67.      for(i=0; i<n_r; i++) //usiamo l'indice i per le rette
  68.        {
  69.          alpha=(-(double)(n_r/2)/n_r)+((double)i)/(n_r); //è la formuletta che proviene dall'esempio del compito per n_r=8 che si hanno 8 valori di alpha
  70.          alpha*=M_PI; //questo per imporre che il numero sia moltiplicato per pigreco mezzi
  71.          //printf("alpha è: %f\n", alpha);
  72.          for(j=0, dmed=0.0; j<n_h; j++)//usiamo l'indice j per i punti: facciamo la distanza punto retta per la retta i-esima e per i j punti
  73.            {
  74.              m=tan(alpha);
  75.              d=abs((m*ph[j].x)-ph[j].y)/sqrt((m*m)+1);//distanza punto retta
  76.              dmed+=d;
  77.              if(d<dmin)
  78.                {
  79.                  dmin=dmed;//nel caso in cui siamo in presenza della retta migliore ci serve la distanza media dei punti
  80.                  alphamin=alpha;
  81.                }
  82.            }
  83.        }
  84.      free(ph);
  85.      printf("La retta migliore e':    ");
  86.      if(alphamin==ALPHA_MIN)
  87.        printf("x=0\n");
  88.      else printf("y=%fx\n", alphamin);
  89.      printf("La distanza media dalla retta e' %f", dmin/n_h);      
  90.      
  91.      return EXIT_SUCCESS;
  92.    }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement