miércoles, 23 de abril de 2025

02.- Programación II - Actividad a presentar en Laboratorio 23 abril 2025 - Solución del Profesor

 Rápidos y Furiosos X


Un tanque perteneciente a Dante Reyes archienemigo de Dominic Toretto trata de impedir que Toretto haga llegar suministros: Comida, agua, armamento, medicinas, etc.  a sus compañeros que se encuentran atrapados en un refugio en la cordillera de los Alpes.

El tanque de Dante Reyes puede acercarse a la montaña hasta distancias superiores a los 1400 mts. Esto dado que Letty y Román (Novia y amigo de Dominic) colocaron minas explosivas en el área cercana a la montaña de forma de impedir que se acerque el  tanque de Reyes. En consecuencia, sistemáticamente el tanque se posiciona a distancias cercanas al área minada y bombardea la parte trasera de la montaña, la cual es la zona por donde Dominic piensa pasar para trasladar los suministros.

El tanque generalmente dispone de un radio de disparo comprendido entre los ángulos θ1 y θ2, cuando se posiciona el cañón entre esos dos ángulos todos los disparos caen en el lado de la montaña donde se reciben los suministros.

En la medida que el tanque se aleja de la montaña los ángulos θ1 y θ2 tienden a igualarse. Si el tanque se aleja mucho todos los disparos colisionaran en la montaña o terminaran cayendo antes de ella.

Recuerde lo máximo que puede acercarse el tanque al eje central de la montaña es a 1400 mts. El tanque se posiciona sistematicamente en ubicaciones distintas: 1450 mts, 1500 mts, etc.



Su programa deberá:

1.- Indicar en caso de existir el rango del ángulo con el cual el tanque bombardea el lado contrario. (mínimo θ1 - máximo θ2).

2.- Indicar el rango del área que puede ser bombardeada con el tanque (mínima X1 - máxima X2) según como aparece representado en dibujo.

3.- Indique cual mensaje que debe transmitirle el programa a Dominic, considere que el camión mide 5 mts de ancho x 5 mts de alto.

4.- El único dato de entrada al programa es la distancia X desde el eje central de la montaña hasta el tanque. Este dato es conocido gracias a un radar ubicado en el refugio.

Nota: Para cualquier cálculo considere la gravedad de 9.8 mts/s2. Considere para todo cálculo la altura del cañón del tanque en 2.2 mts.

Indique: θ1 en grados , θ2 en grados, X1 en mts, X2 en mts y recomendación del programa para Dominic Toretto para las siguientes ubicaciones del tanque: 4000 mts, 4200 mts y 4500 mts.


Programa en C++

/*Parcial Nro. 2 - Rápidos y Furiosos - semestre 2024-II

Programación II

Elaborado Por Carlos Ferrer

Rev. 23 de abril de 2025

*/


#include <iostream>

#include <math.h>

using namespace std;

int main() 

{

// Distancia del tanque a la parte alta de la montaña en horizontal

double x;

// Elementos de la resolvente

double a,b,c; 

// Tangente de los ángulos

double tQ1;

double tQ2;

// Ángulos en radianes

double Q1_Rad;

double Q2_Rad;

// Velocidad Inicial

double vo=250;

//Tiempo de vuelo de alcance máximo conociendo el ángulo

double tv1a, tv1b, tv2a, tv2b, tv1, tv2;

// Distancias de cobertura de ataque del tanque

double x1,x2;


do 

   { 

   cout <<"Ingrese la distancia del tanque (Mayor de 1400 mts)= ";

   cin >>x;

    }

while (x<1400);

// Determinamos los ángulos

a=4.9*pow(x,2)/pow(vo,2);

b=-x;

c=1800-2.2+4.9*pow(x,2)/pow(vo,2);

tQ1=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);

tQ2=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);    

Q1_Rad=atan(tQ1);

Q2_Rad=atan(tQ2);


//Determinamos el tiempo de vuelo del recorrido completo para el primer ángulo y X1

a=-4.9;

b= vo*sin(Q1_Rad);

c=2.2;

tv1a=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);

tv1b=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);

if (tv1a>0)

{

tv1=tv1a;

}

else

{

tv1=tv1b;

}

x1=vo * cos(Q1_Rad)*tv1-x;

//Determinamos el tiempo de vuelo del recorrido completo para el 2do ángulo y X2

a=-4.9;

b= vo*sin(Q2_Rad);

c=2.2;

tv2a=(-b+sqrt(pow(b,2)-4*a*c))/(2*a);

tv2b=(-b-sqrt(pow(b,2)-4*a*c))/(2*a);

if (tv2a>0)

{

tv2=tv2a;

}

else

{

tv2=tv2b;

}

x2=vo * cos(Q2_Rad)*tv2-x;

// Presentamos los resultados

cout <<"El angulo menor para pasar el cerro es = "<<Q2_Rad*180/M_PI<<endl;

cout <<"El angulo mayor para pasar el cerro es = "<<Q1_Rad*180/M_PI<<endl;

cout <<"El tanque puede Bombardear el area entre "<<x1<<" y "<<x2<<" mts"<<endl<<endl;


if (x1<1805 and x2>1805)

{

cout <<"Comuniquense urgente con Dominic e indiquenle que no se acerque dado que corre peligro"<<endl<<endl;

}

else

{

cout <<"Comuniquense urgente con Dominic e indiquenle que traiga el camión de inmediato"<<endl<<endl;

}

system ("pause");

}

Programa en Python



# Parcial Nro. 2 - Rápidos y Furiosos - semestre 2024-II
# Programación II
# Elaborado Por Carlos Ferrer
# Rev. 23 de abril de 2025

import math
import os

os.system("cls")

# Distancia del tanque a la parte alta de la montaña
# en horizontal
x1=0
x2=0
x = float(input("Ingrese la distancia del tanque (Mayor de 1400 mts)= "))
while x < 1400:
    x = float(input("Ingrese la distancia del tanque (Mayor de 1400 mts)= "))

# Velocidad Inicial

vo = 250

# Elementos de la resolvente

a = 4.9 * x**2 / vo**2
b = -x
c = 1800 - 2.2 + 4.9 * x**2 / vo**2

# Tangentes de los angulos

if ((b**2 - 4*a*c)<0):
    no_pasa=True
else:
    no_pasa=False  
    tQ1 = (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)
    tQ2 = (-b - math.sqrt(b**2 - 4*a*c)) / (2*a)
    # Angulos
    Q1_Rad = math.atan(tQ1)
    Q2_Rad = math.atan(tQ2)
    # Calculos de X1 y X2
    a = -4.9
    b = vo * math.sin(Q1_Rad)
    c = 2.2
    tv1a = (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)
    tv1b = (-b - math.sqrt(b**2 - 4*a*c)) / (2*a)
    if tv1a > 0:
        tv1 = tv1a
    else:
        tv1 = tv1b
    x1 = vo * math.cos(Q1_Rad) * tv1 - x
    a = -4.9
    b = vo * math.sin(Q2_Rad)
    c = 2.2
    tv2a = (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)
    tv2b = (-b - math.sqrt(b**2 - 4*a*c)) / (2*a)
    if tv2a > 0:
        tv2 = tv2a
    else:
        tv2 = tv2b
    x2 = vo * math.cos(Q2_Rad) * tv2 - x

# Presentación de resultados
    print("\n")
    print("El angulo menor para pasar el cerro es =", Q2_Rad*180/math.pi)
    print("El angulo mayor para pasar el cerro es =", Q1_Rad*180/math.pi)
    print("El tanque puede Bombardear el área entre", x1, "y", x2, "mts")

if ((x1 < 1805 and x2 > 1805) and (no_pasa==False)):
    print("\n")
    print("Comuníquense urgente con Dominic e indíquenle que no se acerque dado que corre peligro","\n")
else:
    print("\n")
    print("Comuníquense urgente con Dominic e indíquenle que traiga el camión de inmediato","\n")



No hay comentarios.:

Publicar un comentario