Ejercicio Problema de Bala de Cañon. Resuelto.

Iniciado por necro1991, 2 Octubre 2010, 00:48 AM

0 Miembros y 1 Visitante están viendo este tema.

necro1991

Esto es un Ejercicio...
Se debe hacer en python, Java y C++  (Orientado a Objetos) Con Clase Projectile.

En el libro que ingrese en la parte de abajo tiene como hacerlo en python bueno de echo ya esta echo ai poco a poco y muy bien explicado el problema es que esta en ingles...

CitarSi alguien esta interesado en postear el codigo en otro lenguaje aparte de C++, Python y Java... Adelante asi aprendemos de todo un poco; Favor de dar explicaciones de cada parte

Ahi que poner tambien las explicaciones para que sepamos como se va moviendo el programa, para que todos sepan que estamos haciendo bien y que estamos haciendo mal (Como Puedan).  Bueno Adelante Y Suerte.! :)

Para El Domingo Pongo mis Resultados! =] ("Por Exceso de Tarea Recibida, Lo tienen antes del Jueves")

Citar
Example Program: Cannonball
Before launching into a detailed discussion of how to write your own classes, let's take a short detour to see
how useful new classes can be.

10.2.1 Especificacion del Programa

Supongamos que queremos escribir un programa que simula el vuelo de una bala de cañón (o cualquier otro proyectil, como una bala, el béisbol o lanzamiento de peso). Estamos particularmente interesados en saber hasta qué punto la bala viajará cuando se dispara a diferentes ángulos de lanzamiento y la velocidad inicial. La entrada al programa será el ángulo de lanzamiento (En grados), la velocidad inicial (en metros por segundo) y la altura inicial (en metros). La salida será la distancia que viaja el proyectil antes de golpear el suelo (en metros).

Si ignoramos los efectos de la resistencia al viento y se supone que la bala de cañón se mantiene cerca de la superficie terrestre (Es decir, no estamos tratando de ponerla en órbita), se trata de un problema clásico de la física relativamente simple. La aceleración de la gravedad cerca de la superficie de la Tierra es de unos 9,8 metros por segundo, por segundo. Esto significa que si un objeto se lanza hacia arriba a una velocidad de 20 metros por segundo, después de pasado un segundo, su velocidad de subida se ha desacelerado a 20-9.8 = 10.2 metros por segundo. Después de un segundo, la velocidad será sólo 0.4 metros por segundo, y poco después se empiezan a caer.

Para aquellos que saben un poco de cálculo, no es difícil obtener una fórmula que da la posición de nuestro bala de cañón en cualquier momento dado de su vuelo. En lugar de adoptar el enfoque de cálculo, sin embargo, nuestro programa utilizará la simulación para rastrear el momento bala de cañón por el momento. Usando un poco de trigonometría simple para empezar, junto con la relación evidente que la distancia de un objeto se desplaza en una determinada cantidad de tiempo es igual a veces su tasa de la cantidad de tiempo (d = rt), podemos resolver este problema algorítmico.

Pistas:
Recuerden el Valor de Pi es: 3.1416
Y De La Gravedad.

Extra:
Se tiene que Hacer "una clase projectile", Y un intervalo que nos diga cada cuanto tiempo quiere saber en que posicion se encuentra la bala cuando viaja.

Ejemplo:
(x,y) = (0,0)
El intervalo lo quiero de 0.5 segundos

(x,y) = (0,0)   0 segundos...
Se lanza...
(x,y) = (15,85) 0.5 segundos
(x,y) = (27,115) 1 segundo
...
(x,y) = (n,n)  n segundos hasta llegar al suelo...



La referencia de este programa lo encontre en el siguiente libro:

http://www.google.com.mx/url?sa=t&source=web&cd=2&ved=0CCAQFjAB&url=http%3A%2F%2Fciteseerx.ist.psu.edu%2Fviewdoc%2Fdownload%3Fdoi%3D10.1.1.111.6062%26rep%3Drep1%26type%3Dpdf&rct=j&q=Python%20Programming%3A%20An%20Introduction%20to%20Computer%20Science%20pdf&ei=hGSmTPLAGMK88gbWy4n4AQ&usg=AFQjCNFyDFAoTuPioXb1mYk0Wel9_z9u_w&cad=rja

Nombre:Python Programming: An Introduction to Computer Science
Autor: John M. Zelle, Ph.D.
Pagina en el Libro: 156 "capitulo 10"
Pagina en el PDF: 164




//Gracias a todos los que estan dando sugerencias las estoy tomando en cuenta ya que como saben soy nuevo  :D
...♫Las Cosas Que Haces En Vida Resuenan En La Inmortalidad♫...

necro1991

#1
Mis Resultados:

Python 2.7:
Citar
from math import pi, cos, sin

class Projectile:
  def __init__(self, angle, velocity, height):
     self.xpos = 0.0
     self.ypos = height
     a=pi*angle
     theta = a / 180.0
     self.xvel = velocity * cos(theta)
     self.yvel = velocity * sin(theta)

  def update(self, time):
     self.xpos = self.xpos + time * self.xvel
     yvel1 = self.yvel - 9.8 * time
     self.ypos = self.ypos + time * (self.yvel + yvel1) / 2.0
     self.yvel = yvel1

  def getY(self):
     return self.ypos

  def getX(self):
     return self.xpos

def getInputs():
  print 'Dame el angulo en Grados'
  a = input()
  print 'Dame el valor inicial de la velocidad m/s'
  v = input()
  print 'Dame la altura inicial en metros'
  h = input()
  print 'Introduce el intervalo del calculo'
  t = input()
  return a,v,h,t

def main():
  angle,vel,h0,time = getInputs()
  cball = Projectile(angle, vel, h0)
  while cball.getY() >= 0:
     cball.update(time)
     print 'X:', cball.getX()
     print 'Y:', cball.getY()
  print ' '
  print   'Distancia Viajada:', cball.getX(), 'metros'

 
if __name__ == "__main__":
   main()
raw_input()

Java:
Citarpackage clasess;
import java.io.*;
import java.math.*;
import java.io.IOException;
public class Main {
///Menu Principal:
   public static void main(String[] args) throws IOException{
//Valores Determinados En caso de que no ingresen valores

       projectile a = new projectile();
       a.setxpos(0);
       a.setypos(0);
       a.setxvel(0);
       a.setyvel(0);
       a.captura();
       a.imprime();
     //////////////////////////////////
}}
/////////////////////CLASES DE CADA OBJETO////////////////////
class projectile {
   private double xpos;
   private double ypos;
   private double xvel;
   private double yvel;
//Posiciones
   public double getxpos () {  return xpos; };
   public void setxpos (double i_xpos) { xpos=i_xpos; }
   public double getypos () {  return ypos; };
   public void setypos (double i_ypos) { ypos=i_ypos; }
//Velcoidades
   public double getxvel () {  return xvel; };
   public void setxvel (double i_xvel) { xvel=i_xvel; }
   public double getyvel () {  return yvel; };
   public void setyvel (double i_yvel) { yvel=i_yvel; }
   public void captura() throws IOException
   {
   BufferedReader lee = new BufferedReader(new InputStreamReader(System.in));
   int a,v,h,t;double pi=3.1416,aa,tetha;double bb,r,yvel1,r1,r2,r3,r4,r5;
   System.out.println("Dame el angulo en grados");
   a = Integer.parseInt(lee.readLine());
   System.out.println("Dame el valor inicial de la velocidad m/s");
   v= Integer.parseInt(lee.readLine());
   System.out.println("Dame la altura inicial en metros");
   h= Integer.parseInt(lee.readLine());
   System.out.println("Dame el intervalo de calculacion");
   t= Integer.parseInt(lee.readLine());
   //Calculando velocidades en x & en y
   aa=pi*a;
   tetha=aa/180;
   xvel=v*Math.sin(tetha);
   yvel=v*Math.cos(tetha);

   //Iniciando el Ciclo
   //Posicion de Xpos & Ypos
   while(ypos>=0){
   //Trabajando con la X
   bb=t*xvel;
   r = xpos +bb;
   xpos=r;
   //Trabajando con la Y
   r1=9.8*t;
   yvel1 = yvel - r1;
   //Posicion de Y
   r2=yvel+yvel1;
   r3=r2/2.0;
   r4=t*r3;
   r5 = ypos + r4;
   ypos=r5;
   yvel = yvel1;
   System.out.println(" ");
   System.out.println("X: "+xpos+" ");
   System.out.println("Y: "+ypos +" ");
   }

       }
   public void imprime(){
   //System.out.println("X: "+xvel+" ");
   System.out.println("Distancia recorrida es:"+xpos+"");
   }
  }


C++:
CitarSorry.! Vi que nadie participo... Si quieren adelante participen Ingresando el codigo en C++, El tema lo dejo abierto para ver quien lo quiera poner

Nota:
CitarLo Pueden hacer en otro lenguaje bien... Para aprender

Con un Gracias Por participar me conformo xD jajaja :D
...♫Las Cosas Que Haces En Vida Resuenan En La Inmortalidad♫...

[L]ord [R]NA

Creo que seria mejor si concretamente pones el ejercicio y dejas que cada quien busque la teoria. El post se te esta haciendo muy largo y muchos se van y no comentan cuando ven posts asi de largos. Es solo una sugerencia.

Saludos, LordRNA

necro1991

#3
Cita de: Lord R.N.A. en  2 Octubre 2010, 07:56 AM
Creo que seria mejor si concretamente pones el ejercicio y dejas que cada quien busque la teoria. El post se te esta haciendo muy largo y muchos se van y no comentan cuando ven posts asi de largos. Es solo una sugerencia.

Saludos, LordRNA

Ok Gracias.! :) ahurita lo cambio. pero primero quiero terminar el de clase por que el objetivo es ese jejeje =]
...♫Las Cosas Que Haces En Vida Resuenan En La Inmortalidad♫...

¡Micronet!

Casualidad... una amiga me paso ese problema jajaja
no te enojes amigo.

No todos te van a responder siempre...

#include <iostream>
#include <conio.h>
#include <math.h>

using namespace std;


class CannonBall
{
private:
   float  xVel, yVel, gv , x, y,tetha;  

public:
//xVel
   float getxVel() const; //accessor
   void setxVel(float velocity, float tetha); //mutator
//yVel
   float getyVel() const; //accessor
   void setyVel(float velocity, float tetha); //mutator
//GV
   float getgv() const; //accessor
   void setgv(float time); //mutator
//X
   float getX() const; //accessor
   void setX(float time); //mutator
//Y
   float getY() const; //accessor
   void setY(float time); //mutator
//Print
   void CannonBall::Imprimir();
};

//XVEL
float CannonBall::getxVel() const {return xVel;}; //accessor
void CannonBall::setxVel(float velocity, float tetha) { xVel=velocity*cos(tetha); }; //mutator
//YVEL
float CannonBall::getyVel() const {return yVel;}; //accessor
void CannonBall::setyVel(float velocity, float tetha) { yVel=velocity*sin(tetha); }; //mutator
//GV
float CannonBall::getgv() const {return gv;}; //accessor
void CannonBall::setgv(float time){ gv=yVel-(time*9.8); }; //mutator
//X
float CannonBall::getX() const {return x;}; //accessor
void CannonBall::setX(float time){ x=x+(time*xVel); }; //mutator
//Y
float CannonBall::getY() const {return y;}; //accessor
void CannonBall::setY(float time){ y=y+time*(yVel-gv)/2; yVel=gv;}; //mutator
//PRINT
void CannonBall::Imprimir()
{
cout<<" "<<x;
cout<<" "<<y<<endl;
}

int main ()
{
   CannonBall bullet;
   float height, interval, angle, velocity; //estos valores los pongo aqui porque no los voy aux modificar en los metodos de la clase
   float tetha, time=0, aux=0, max=0;
   
   cout<<"Angulo:"<<endl;
   cin>>angle;
   cout<<"Velocidad:"<<endl;
   cin>>velocity;
   cout<<"Altura:"<<endl;
   cin>>height;
   cout<<"Intervalo:"<<endl;
   cin>>interval;

   tetha=(angle*3.14)/180;
   bullet.setxVel(velocity, tetha);
   bullet.setyVel(velocity, tetha);

   cout<<"t, x, y"<<endl;

   do
   {
       bullet.setX(time);
       bullet.setgv(time);
       bullet.setY(time);
           if (bullet.getY()>=0)
           {
           bullet.Imprimir();
           cout<<time<<" ";
           }
           if (max<bullet.getY())
           {
            max=bullet.getY();
           }
       time+=interval;
       aux=bullet.getY();
   }while (aux<=0);
   cout<<"La altura maxima es: "<<max<<endl;
   cout<<"Tiempo antes de tocar el suelo: "<<time<<endl;;

   getch();
   return 0;
}



Derecho de Autor: Cruz! :) ^^

"La Tarea No Se Hace, Pero No Indica Que No Se Ayude Al Estudiante"