#include #include #include /* Questo programma simula la caduta di un rover sulla superficie di Marte includendo gli effetti del vento */ #define G 3.711 /* l'accelerazione e' una costante per convenzione la rappresentiamo con lettere maiuscole */ #define H0 200 #define DT .005 #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 WMAX 1. /* coefficiente del vento */ 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' */ /* 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); /* chiede all'utente di inserire l'entita' dell'effetto del vento */ float windC = 0.; do { printf("# Inserisci l'intensita' del vento in unita' arbitrarie: "); r = scanf("%f", &windC); if (r != 1) { scanf("%s", s); } else if ((windC > WMAX) || (windC < 0.)) { printf("# Valore non amesso. Inserisci un valore compreso tra 0 e %f\n", WMAX); } } while ((r != 1) || (windC > WMAX) || (windC < 0.)); /* opzione per la scelta del tipo di simulazione */ r = 0; int opt = 0; do { printf("# Che tipo di simulazione vuoi effettuare?\n"); printf("# 1: effetto del vento costante\n"); printf("# 2: effetto del vento che dipende da dy\n"); r = scanf("%d", &opt); if (r != 1) { scanf("%s", s); opt = 0; } else if ((opt != 1) && (opt != 2)) { printf("# Scelta non permessa. Riprova...\n"); opt = 0; /* in questo modo il controllo del ciclo di input e' piu' semplice... */ } } while (r != 1); /* ...basta infatti controllare che r non sia pari a 1 */ /* ora sappiamo quanti passi dobbiamo eseguire e usiamo un for */ i = 0; for (i = 1; i < n; i++) { /* calcoliamo la differenza di quota */ float m = (y[i] - y[i - 1])*windC; if (opt == 1) { /* se pero' l'utente ha scelto una simulazione semplice, lo spostamento e' indipendente dalla quota */ m = windC; } /* calcoliamo lo spostamento orizzontale in modo casuale */ float delta = -m + 2*m*lrand48()/RAND_MAX; x[i] = x[i - 1] + delta; } t = 0.; for (i = n - 1; i >= 0; i--) { printf("%f %f %f %f\n", t, x[i], y[i], v[i]); t += DT; } }