#include #include #include #include #define N_EXP 200 #define R_IN 3.0 #define DR_MIN 0.1 #define DR_MAX 0.2 double RandInInterval(double, double); double InitPosAndDist(void); double Passo(void); int WriteSuccess(int succ[]); void MinMaxDistFalliti(double distfalliti[], double MinMax[], int); main(){ int N_PASSI, i,j; int CountSteps, Nsuccess; double R_EXT, Dist; int successi[N_EXP]={0}; double distfalliti[N_EXP]={0.}; double MinMax[2]; srand48(time(0)); printf("\n\nIl programma studia il moto di 200 particelle che partono dall'interno di un cerchio di raggio R_IN=3\n" "e percorrono una traiettoria radiale stocastica. Scopo del programma e' determinare quante di loro raggiungono, in un numero\n" "di passi scelto dall'utente, una circonferenza di raggio R_EXT maggiore di R_IN e scelto anch'esso dall'utente. \n" " Si danno poi informazioni sul moto delle particelle che non hanno raggiunto la circonferenza esterna.\n\n"); printf("Inserire il numero di passi per ogni particella \n"); do{ scanf("%d",&N_PASSI); if(N_PASSI<50 || N_PASSI>100) printf("Il numero dei passi deve essere in [50,100]. Inserire un nuovo valore\n"); }while(N_PASSI<50 || N_PASSI>100); printf("Inserire il valore di R_EXT \n"); do{ scanf("%lf",&R_EXT); if(R_EXT<6. || R_EXT>10.) printf("R_EXT deve essere nell'intervallo [6.0,10.0]. Inserire un nuovo valore\n"); }while(R_EXT<6. || R_EXT>10.0); j=0; for(i=1;i<=N_EXP;i++){ CountSteps=0; Dist=InitPosAndDist(); do{ CountSteps++; Dist=Dist+Passo(); Dist=fabs(Dist); }while(Dist=R_EXT){ // printf("j=%d i=%d\n",j,i); successi[j++]=i; }else{ distfalliti[i-1]=Dist; // printf("Fallimento numero %d, dist=%lf\n",i,Dist); } } Nsuccess=WriteSuccess(successi); MinMaxDistFalliti(distfalliti,MinMax,N_EXP-Nsuccess); printf("Il numero degli esperimenti falliti e' %d\n\n", N_EXP-Nsuccess); printf("La distanza minima raggiunta e' %lf\n\n\n", MinMax[0]); } double InitPosAndDist(void){ double x,y; double dist; do{ x=RandInInterval(0.,R_IN); y=RandInInterval(0.,R_IN); dist=sqrt(x*x+y*y); }while(dist>=R_IN); return dist; } double Passo(void){ double coin, step; coin=RandInInterval(0.,1.); if(coin>0.5){ step=RandInInterval(DR_MIN,DR_MAX); }else{ step=-RandInInterval(DR_MIN,DR_MAX); } return step; } double RandInInterval(double A, double B){ double r; r=(double)lrand48()/RAND_MAX*(B-A)+A; return r; } int WriteSuccess(int Data[]){ int CountSuccess=0; FILE *Write; if((Write = fopen("successi.dat","w")) == NULL){ printf("Non e' stato possibile aprire il file \n"); exit(EXIT_FAILURE); } fprintf(Write, "Gli esperimenti che hanno avuto successo sono quelli dei numeri seguenti:\n"); while(Data[CountSuccess]!=0){ fprintf(Write, "%d\n", *(Data+CountSuccess)); CountSuccess++; } fclose(Write); return CountSuccess; } void MinMaxDistFalliti(double Data[],double MinMax[2],int N){ int i; double min,max; min=Data[0]; max=min; for(i=1;iData[i])min=Data[i]; if(max