#include #include /* Questo programma simula la caduta di un rover sulla superficie di Marte. */ #define G 3.711 /* l'accelerazione e' una costante per convenzione la rappresentiamo con lettere maiuscole */ #define VM (150/3.6) /* la velocita' massima in km/h espressa in m/s. Notate l'uso delle parentesi. Perche' sono necessarie? Avremmo potuto calcolare il rapporto fuori dal programma, ma lasciamo l'operazione al compilatore. Se e' in grado di ottimizzare il codice nell'eseguibile inserira' il valore costante del rapporto e non l'operazione di divisione. */ int main() { float h = 0.; /* quota iniziale. Notate il punto decimale dopo lo 0. */ float dt = 0.; /* intervallo di tempo di default */ int r = 0; /* variabile di controllo */ char s[255]; /* variabile per il controllo del buffer di input */ /* input di h. Il ciclo do-while e' stato scelto perche' almeno una volta l'utente deve inserire qualcosa */ do { printf("Inserisci la quota di partenza del rover in m: "); r = scanf("%f", &h); if (r != 1) { /* in questo caso la CPU non ha potuto convertire caratteri in float */ printf(" Attenzione! Input non corretto...\n"); /* puliamo il buffer */ scanf("%s", s); } else if (h <= 0.) { printf(" Attenzione! La quota iniziale dev'essere positiva...\n"); /* usiamo r per controllare l'esecuzione del ciclo. */ r = 0; } } while (r != 1); /* ora possiamo stimare il tempo di volo */ float tM = sqrt(2.*h/G); printf("Si prevede che il rover tocchera' il suolo in %.1e s circa\n", tM); /* riutilizziamo la variabile di controllo che, se il ciclo precedente e' terminato, vale 1. */ r = 0; do { printf("Inserisci l'intervallo di tempo dt in s: "); r = scanf("%f", &dt); if (r != 1) { printf(" Attenzione! Input non corretto...\n"); scanf("%s", s); } else if (dt <= 0.) { printf(" Attenzione! L'intervallo dev'essere positivo...\n"); r = 0; } else if (dt > tM*0.1) { printf(" Attenzione! L'intervallo scelto e' troppo grande...\n"); r = 0; } } while (r != 1); float x = h; float v = 0.; float t = 0.; /* in linea di principio il rover potrebbe gia' essere sul suolo marziano e la simulazione non dovrebbe neanche iniziare. */ while (x > 0.) { /* traduco in codice le formule date */ x = h-0.5*G*t*t; v = G*t; /* stampo come richiesto */ printf("%f %f %f\n", t, x, v); /* incremento il tempo */ t += dt; } /* prendo le decisioni finali */ if (v > VM) { printf("Spiacente. Il rover si e' distrutto e sei stato licenziato.\n"); } else { printf("Bravo! Il rover e' atterrato con successo!\n"); } }