Testo:
Il mio codice ha il problema che dopo la prima interazione del ciclo in cui aumenta d esce dal programma perchè l'errore è maggiore di epsilon, qualcuno può aiutarmi a capire perchè?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define NMAX 1000000
#define NITER 15
#define EPSILON 0.01
#define G 9.80665
void inserimento(char *msg, char *fmt, void *v);
double Calotta(double R, double d);
void PrintResults(double v[][3], int size);
int main() {
srand(time(NULL));
double R, p, m, Vmc, incremento, d, Forza[NITER][3];
d = 0.0;
int fine = 0, n;
while (!fine) {
inserimento("Inserire il valore del raggio della sfera: ", "%lf", &R);
inserimento("Inserire il valore della massa della sfera: ", "%lf", &m);
inserimento("Inserire il valore della densita' della sfera: ", "%lf", &p);
if (R <= 0 || m <= 0 || p <=0) {
printf("ERRORE: le grandezze inserite devono essere positive!\n");
fine=0;
}
else
fine=1;
}
for (n = 0; n < NITER; n++) {
incremento = (0.8*R)*rand()/((double)RAND_MAX);
Vmc = Calotta(R,d);
Forza[n][0] = d;
Forza[n][1] = fabs(G*p*Vmc);
Forza[n][2] = m*G;
d += incremento;
}
PrintResults(Forza,NITER);
}
void inserimento(char *msg, char *fmt, void *v) {
int fine, res, c;
fine=0;
while (!fine) {
printf("%s", msg);
fine=1;
res=scanf(fmt, v);
if (ferror(stdin)||feof(stdin)) {
printf("\n");
clearerr(stdin);
fine=0;
continue;
}
if (res < 1) {
printf("Problema nella conversione\n");
fine=0;
}
while ((c=getchar())!='\n');
}
}
double Calotta(double R, double d) {
double Vparal, x, y, z, h, Vcalotta, Vmc;
unsigned long long int np = 0;
int i;
Vparal = (2*R * 2*R)*(R - d);
for (i = 0; i < NMAX; i++) {
x = (2*R) * rand()/((double)RAND_MAX) - R;
y = (2*R) * rand()/((double)RAND_MAX) - R;
z = (R - d) * rand()/((double)RAND_MAX) + d;
if ((x*x + y*y + z*z <= R*R))
np++;
}
Vmc = Vparal * np/NMAX;
h = R - d;
Vcalotta = M_PI*h*h*(R - h/3.0);
if (fabs(Vmc - Vcalotta)/(Vcalotta) > EPSILON) {
printf("Errore maggiore di epsilon\n");
exit(0);
}
else
return Vmc;
}
void PrintResults(double v[][3], int size) {
FILE *f;
int i;
f = fopen("Archimede.dat","w");
for (i = 0; i < size; i++) {
fprintf(f,"%10.4lf %10.4lf %10.4lf\n",v[i][0], v[i][1], v[i][2]);
}
fclose(f);
}