#include #include #include #define REARTH 6371 #define HDEBRIS 400 #define SIGMADEBRIS 150 float readFloat(); float randomGauss(); int main() { /* fase di input da parte dell'utente */ float t = 0; printf("Inserisci il valore dell'incremento del parametro angolare: "); float dt = readFloat(); /* 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()*SIGMADEBRIS + REARTH + HDEBRIS; 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() { /* 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 <= 0.)) { printf(" Input inappropriato. Ripetere l'inserimento: "); char s[255]; scanf("%s", s); } } while ((n != 1) || (x <= 0.)); return x; } float randomGauss() { /* 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 sqrt(-2.*log(u1))*cos(2.*M_PI*u2); }