Hinamarth

Buffon's needle

Dec 12th, 2011
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.65 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4.  
  5. int incrocio(double, double, double);
  6.  
  7. void media_pi(double [], double []);
  8.  
  9. int incrocio(double O, double x, double l){
  10.   int y;
  11.   if(x<=((l/2)*sin(O))){
  12.     return y=1;
  13.   }
  14.   else{
  15.     return y=0;
  16.   }
  17. }
  18.  
  19. void media_pi(double pi[], double media[]){
  20.   int i;
  21.   double med;
  22.   FILE *fp;
  23.   fp=fopen("pi.dat", "w");
  24.   if((fp=fopen("pi.dat","w"))==NULL){
  25.     printf("Errore nell'apertura del file pi.dat.\n");
  26.     exit(EXIT_FAILURE);
  27.   }
  28.   fprintf(fp, " I valori di pi greco calcolati come pi = (2*l*n)/(t*h), sono:\n ");
  29.   fprintf(fp, "\n");
  30.   for(i=0; i<10; i++){
  31.     media[i]=pi[i];
  32.     fprintf(fp, "%lf ", pi[i]);
  33.   }
  34.   fprintf(fp, "\n");
  35.   fprintf(fp, "La media dei valori è:\n");
  36.   fprintf(fp, "\n");
  37.   for(i=0; i<9; i++){
  38.     media[9]+=media[i];
  39.   }
  40.   med=media[9]/10;
  41.   fprintf(fp, "%lf \n", med);
  42. }
  43.  
  44. main(){
  45.   double l, t, x, O, y, pi[10], media[10];
  46.   int n, h, i, j;
  47.   srand48(time(0));
  48.   printf("Il programma prende come argomento l'ago di Buffon, ovvero, dato un ago di lungezza l e un piano percorso da linee parallele a distanza t>l, si vuole calcolare la probabiltà che l'ago tocchi una di queste rette.\n");
  49.   printf("Per fare questo ho bisogno che tu inserisca i valori di t e l - che vanno espressi in cm e devono essere minori di 3.0 - e anche n, il numero di lanci, minore di 3000.\n");
  50.   printf("Inserisci la lunghezza dell'ago l:\n l = ");
  51.   scanf("%lf", &l);
  52.   while(l<0 || l>=2.9999999 ){
  53.     printf("Il valore di l è sbagliato! Ricorda l deve essere positivo e minore di 3 cm.\n");
  54.     printf("Reinserisci la lunghezza dell'ago l:\n l = ");
  55.     scanf("%lf", &l);
  56. }
  57.   printf("Inserisci la distanza tra le rette t:\n t = ");
  58.   scanf("%lf", &t);
  59.   while(t<0 || t<=l || t>=3){
  60.     printf("Il valore di t è sbagliato! Ricorda t deve essere positivo, minore di 3 cm e maggiore di l.\n");
  61.     printf("Reinserisci la distanza tra le rette t:\n t = ");
  62.     scanf("%lf", &t);
  63.   }
  64.   printf("Inserisci il numero di lanci n:\n n = ");
  65.   scanf("%d", &n);
  66.   while(n<0 || n>=3000){
  67.     printf("Il valore di n è sbagliato! Ricorda n deve essere positivo e minore di 3000.\n");
  68.     printf("Reinserisci il numero di lanci n:\n n = ");
  69.     scanf("%d", &n);
  70.   }
  71.   for(j=0; j<10; j++){
  72.     h=0;
  73.     for(i=0; i<n; i++){
  74.       O=((double)lrand48()/RAND_MAX)*1.74;
  75.       x=((double)lrand48()/RAND_MAX)*t;
  76.       y=incrocio( O, x, l);
  77.       if(y==1){
  78.     h++;
  79.       }
  80.     }
  81.     printf("h = %d \n", h);
  82.     pi[j]=(2*l*(double)n)/(t*(double)h);
  83.   }
  84.   media_pi(pi, media);
  85.   printf("E' stato appena creato un file pi.dat nel quale viene calcolato pi greco come pi=(2*l*n)/(t*h)!\n");
  86. }
  87.  
Advertisement
Add Comment
Please, Sign In to add comment