#include #include #include #include /* Questo programma simula la caduta di un rover sulla superficie di Marte includendo gli effetti del vento */ /* i seguenti define sono usati per accendere o spegnere certe features del programma */ //#define TRAJECTORIES //#define HISTO //#define POORMANHISTO #define ALIEN #define G 3.711 /* l'accelerazione e' una costante per convenzione la rappresentiamo con lettere maiuscole */ #define H0 200 #define DT .05 #define N 3000 /* il numero di elementi necessario in ogni array e' un intero che possiamo stimare sapendo che il tempo di volo sara' circa sqrt(2.*H0/G). Usiamo un numero un po' piu' grande per sicurezza */ #define XMAX 80 /* numero di bin dell'istogramma */ #define NHMAX 1000 /* numero massimo di storie */ #define MSGL 1000000 /* lunghezza massima del messaggio alieno */ int main() { int r = 0; /* variabile di controllo */ char s[255]; /* variabile per il controllo del buffer di input */ int i = 0; /* indice degli array */ float y[N] = {0.}; /* array delle quote */ float x[N] = {0.}; /* array delle posizioni corrette per il vento */ float v[N] = {0.}; /* array delle velocita' */ int histo[XMAX] = {0}; /* istogramma */ srand48(time(NULL)); /* seme del generatore */ /* siamo sicuri che il rover parte da una quota sufficientemente alta. Un ciclo do e' adeguato */ float t = 0.; do { /* calcolo posizione e velocita' e ne pongo i valori in elementi successivi degli array */ y[i] = H0-0.5*G*t*t; v[i++] = G*t; /* incremento il tempo */ t += DT; } while (y[i - 1] >= 0.); /* condizione di arresto */ int n = i - 1; printf("# Rover atterrato. Velocita' all'impatto: %.1f km/h\n", v[n]/3.6); /* numero di storie da simulare */ r = 0; int nH = 1; do { printf("# Inserisci il numero di storie: "); r = scanf("%d", &nH); if (r != 1) { scanf("%s", s); } else if ((nH < 0) || (nH > NHMAX)) { printf("# Scelta non permessa. Riprova...\n"); r = 0; /* un altro modo di controllare il ciclo */ } } while (r != 1); /* simuliamo nH storie */ int histoMax = 0; int k; for (k = 0; k < nH; k++) { /* ora sappiamo quanti passi dobbiamo eseguire e usiamo un for */ for (i = 1; i < n; i++) { /* calcoliamo lo spostamento orizzontale in modo casuale generando un numero compreso tra -1 e 1 */ float m = y[i - 1] - y[i]; float delta = -m + 2.*m*lrand48()/RAND_MAX; x[i] = x[i - 1] + delta; #ifdef TRAJECTORIES printf("%f %f\n", x[i], y[i]); #endif } /* calcoliamo la posizione del bin */ int bin = floor(x[n - 1]) + XMAX/2.; if (bin < 0) { bin = 0; } else if (bin >= XMAX) { bin = XMAX - 1; } /* incrementiamo il valore del bin */ histo[bin] += 1; /* troviamo il valore massimo */ if (histo[bin] > histoMax) { histoMax = histo[bin]; } } #ifdef HISTO /* stampiamo i dati */ for (i = 0; i < XMAX; i++) { printf("%f %d\n", i - XMAX/2., histo[i]); } #endif #ifdef POORMANHISTO /* costruiamo un istogramma */ for (k = histoMax; k > 0; k--) { for (i = 0; i < XMAX; i++) { if (histo[i] >= k) { printf("#"); } else { printf(" "); } } printf("\n"); } #endif #ifdef ALIEN /* simuliamo la ricezione di un messaggio alieno */ char msg[MSGL] = {0}; for (i = 0; i < MSGL; i++) { char c = 65 + lrand48() % 28; if (c == 91) { c = ' '; } else if (c == 92) { c = '\n'; } msg[i] = c; } printf("%s\n", msg); #endif }