#include #include #include #define REARTH 6371 #define HDEBRIS 400 #define SIGMADEBRIS 150 float readFloat(float min, float max); float randomGauss(float average, float sigma); int main() { /* fase di input da parte dell'utente */ float t = 0; printf("Inserisci il valore dell'incremento del parametro angolare [0,2PI]: "); float dt = readFloat(0, 2*M_PI); /* chiamata alla funzione che legge un float da tastiera */ char filename[255] = ""; printf("Inserisci il nome del file: "); scanf("%s", filename); FILE *fbp = fopen(filename, "wb"); /* distribuisce uniformemente i detriti lungo l'orbita */ while (t < 2.*M_PI) { /* il raggio dell'orbita ha valor medio pari al raggio della Terra + 400 km, e deviazione standard di 150 km */ float R = randomGauss(REARTH + HDEBRIS, SIGMADEBRIS); float x = R*cos(t); float y = R*sin(t); /* scrive le coordinate su un file */ fwrite(&x, sizeof(x), 1, fbp); fwrite(&y, sizeof(y), 1, fbp); /* incrementa il parametro angolare */ t += dt; } fclose(fbp); } float readFloat(float min, float max) { /* funzione per leggere un float da tastiera. La funzione controlla che l'input sia positivo e che non contenga caratteri non ammessi */ float x; int n; do { n = scanf("%f", &x); if ((n != 1) || (x < min) || (x > max)) { printf(" Input inappropriato. Ripetere l'inserimento: "); char s[255]; scanf("%s", s); } } while ((n != 1) || (x < min) || (x > max)); return x; } float randomGauss(float average, float sigma) { /* funzione che genera un numero distribuito come una Gaussiana di media nulla e varianza unitaria */ float u1 = (float)lrand48()/RAND_MAX; float u2 = (float)lrand48()/RAND_MAX; return average + sigma * sqrt(-2.*log(u1))*cos(2.*M_PI*u2); }