Si consideri un cannone posto nell’origine di un sistema cartesiano a tre assi, dove il piano xy corrisponde al piano orizzontale e l’asse z alla verticale. La direzione verso cui spara il cannone è individuata da due angoli: l’azimut, cioè l’angolo compreso tra l’asse x e la proiezione sul piano orizzontale della direzione del cannone, e l’altezza, cioè il complementare dell’angolo tra la direzione del cannone e l’asse z. Il cannone spara ad azimut pari a 0, verso le x positive, ma con altezza θ variabile. Il proiettile esce dalla bocca del cannone con modulo della velocità v pari sempre a 300 km/h. Il moto del proiettile si svolge sotto l’azione della forza di gravità (si consideri g = 9.80665 m⁄s^2 ) e la sua traiettoria è sempre contenuta nel piano xz. Il moto si considera concluso non appena il proiettile incontra nuovamente l’asse x dopo essere stato sparato. Indichiamo con x la distanza tra il punto in cui il proiettile arriva al suolo e il cannone posto nell’origine. Tale distanza varia a seconda dell’angolo di altezza θ con la formula:
$ x= v^2sin(2vartheta )/g $
Il bersaglio che il cannone intende colpire e una circonferenza di raggio 10 m, contenuta nel piano xy e il cui centro e contenuto sull’asse x a distanza D dall’origine. Si scriva un programma che simula dei tentativi di colpire il bersaglio con il cannone descritto, date le seguenti indicazioni.
Il programma deve leggere da riga di comando il valore, espresso in metri, della distanza D a cui si pone il bersaglio dall’origine. I valori accettabili di D variano tra 600 m e 720 m. Il cannone ha a disposizione N munizioni. Il programma simuli il lancio di tutti i proiettili, scegliendo per ciascuno dei lanci un diverso angolo di altezza θ, usando un algoritmo pseudocasuale per selezionarne i valori tra 30◦ e 60◦ . Il programma deve stabilire, per ciascuno dei lanci, se sia stato colpito il bersaglio. A ogni tentativo si stampi l’angolo espresso in gradi, la distanza espressa in metri, e infine la parola COLPITO o MANCATO, a seconda dei casi. Si separino le tre colonne con un punto e virgola (;) seguito da uno spazio. Si usino al massimo due cifre decimali. Al termine degli N colpi, si stampi sul monitor la percentuale di volte che il bersaglio è stato colpito, con al più due cifre decimali. Nella versione finale, si definisca N pari a 120. Non è consentito dichiarare vettori la cui dimensione sia specificata dal nome di una variabile (è invece possibile allocare dinamicamente lo spazio per un vettore o per una matrice la cui dimensione non sia nota a priori).
Questo è il mio svolgimento:
- Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define Vo 83.333
#define g 9.80665
#define N 120
double Direzione_Cannone()
{
double Direzione;
Direzione = 3000+ rand()%3100;
return Direzione/100;
}
double Calcolo_Gittata()
{
double Direzione;
Direzione= Direzione_Cannone();
printf("%2.2f° ",Angolo);
return (pow((Vo),2)*sin(2*(Direzione*3.14)/180))/g;
}
int main(int argc, char * argv[])
{
int Bersaglio_Centrato=0,Prove;
double Gittata, D;
srand(time(NULL));
for (Prove=0; Prove <N ; Prove++)
{
D=atof(argv[1]);
Gittata = Calcolo_Gittata();
printf(" %3.2f Metri",Gittata);
if(Gittata>=D-10 && Gittata<=D+10)
{
Bersaglio_Centrato++;
printf(" Bersaglio Colpito!\n");
}
else
printf(" Bersaglio Mancato!\n");
}
printf("\nIl cannone ha colpito il bersaglio con una percentuale del %3.2f%%",((double)Bersaglio_Centrato/N)*100);
}
Grazie in anticipo!