[LUG.ro] [Programacion] Programa corregido (Urege para Seba)
Horacio Castellini
lugro@lugro.org.ar
Mon, 28 Apr 2003 09:56:19 -0300 (ART)
Hola Seba:
Te lo mando por lugro pues por este correo no estoy suscripto en
programación ;)))
Te he corregido tu programa ya que tiene vicios de principiante y
no de un programador profecional, te cometo cuando compilo la versión
original (corregido el estilo y errores gruesos pero con el error que te
comenté)
pues el equivlente en c++ de "printf" es "cout.form", macho! me extraña,
vos manyas de esto....
fijate lo que dá
[hcaste@oscura tmp]$ c++ -g -Wall trayec.cc
[hcaste@oscura tmp]$ ./a.out
Ingrese la velocidad inicial Vo: 1
Ingrese el angulo de inclinación en grados: 10
Ingrese el tiempo en segundos: 4
[hcaste@oscura tmp]$ gdb ./a.out a.out.core
GNU gdb 4.18 (FreeBSD)
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for
details.
This GDB was configured as "i386-unknown-freebsd"...Deprecated bfd_read
called at
/usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c
line 2627 in elfstab_build_psymtabs
Deprecated bfd_read called at
/usr/src/gnu/usr.bin/binutils/gdb/../../../../contrib/gdb/gdb/dbxread.c
line 933 in fill_symbuf
Core was generated by `a.out'.
Program terminated with signal 10, Bus error.
Reading symbols from /usr/lib/libstdc++.so.3...done.
Reading symbols from /usr/lib/libm.so.2...done.
Reading symbols from /usr/lib/libc.so.4...done.
Reading symbols from /usr/libexec/ld-elf.so.1...done.
#0 0x2813e86b in memcpy () from /usr/lib/libc.so.4
(gdb) q
Este error se debe a que justamente a que la libc y la glibc (linux) estan
"stripeadas" ahora bien con las correciones sugeridas (ver programa
anexado) no solo me compila sino que anda, no me puse a analizar la
consistencia de código.
[hcaste@oscura tmp]$ c++ -g trayec.cc
[hcaste@oscura tmp]$ ./a.out
Ingrese la velocidad inicial Vo: 1
Ingrese el angulo de inclinación en grados: 10
Ingrese el tiempo en segundos: 2
!!! Ingrese los datos requerido por favor ¡¡¡
Bueno Saludos Horacio.
Código corregido
-------------------------------------------------------------------------------
#include <cmath>
#include <stdlib.h>
#include <ctype.h>
#include <iostream.h>
#define T 100
// La función isnum() determina si el string es un numero
extern "C" int sprintf(char*, const char*, ...);
int isnum(char *arg)
{
int i;
for (i = 0; arg[i]!='\0'|| arg[i]!='.' ; i++)
if (!isdigit(arg[i]))
{
return 0;
}
return 1;
}
int main(void)
{
const double gt =9.8; // Aceleración de la gravedad
const double radian = 57.29578; // Grado en radianes para la conversión
double v0cos, v0sen,
puntoalto, // El punto más alto
r, // Alcance horizontal
v0, // Velocidad inicial
vx, // Vx
vy, // Vy
x, // Posición en el eje x
y, // Posición en el eje Y
v; // Velocidad resultante
double angulo, // Angulo de elevación
radianes, // Angulo en radianes para calcular los grados
angulofin; // Angulo en el tiempo
double tiempoalto, //El tiempo del punto mas alto
tiempollegada, // Tiempo en el que llega a destino
tiempo; // Tiempo del calculo
char * velo, *ang, *tiem; //no uso "time" pues es reservada!
// Asignación de las varibles desde los Text_Entry
cout << "Ingrese la velocidad inicial Vo: ";
cin >> v0;
cout << "Ingrese el angulo de inclinación en grados: ";
cin >> angulo;
radianes = angulo/radian;
cout << "Ingrese el tiempo en segundos: ";
cin >> tiempo;
velo=new char[T];
ang=new char[T];
tiem=new char[T];
sprintf(velo,"%f",v0);
sprintf(ang,"%f",angulo);
sprintf(tiem,"%f",tiempo);
if((isnum (velo) && isnum (ang)) && (v0>0.0 && angulo>0.0))
{
// Calculo del punto en tiempo=t
//
v0cos = v0 * cos(radianes);
v0sen = v0 * sin(radianes);
// Calculo de la llegada del proyectil
vx = v0cos;
vy = v0sen - gt;
angulofin = atan(vy/vx)*radian;
v = sqrt(pow(vx,2)+pow(vy,2));
tiempoalto = v0sen/gt; // Tiempo en el que llego al punto más alto
puntoalto = (v0sen * tiempoalto) - (0.5 * gt * pow(tiempoalto,2));
tiempollegada = tiempoalto * 2;
r = vx * tiempollegada;
// Metros recorridos en el eje x desde el lanzamiento
// Seteo de la variable buffer output para asignarla a las etiquetas
// Se utilizan 3 etiquetas para un mejor control de lo que se muestra
cout.form("Punto mas alto: %.2lf metros a los %.2lf s.\n",puntoalto,
tiempoalto);
cout.form("Proyectil llegara a destino a %.2lf metros\nen %.2lf
seg desde el lanzamiento",r,tiempollegada);
if(isnum(tiem) == 1 && tiempo >= 0.0)
// Si no esta seteado el tiempo t
// o es negativo,
// no se muestra el punto xy en ese tiempo
{
if (tiempo <= tiempollegada)
// Si el tiempo es menor al tiempo de llegada
// se calcula la posición
{
x = v0cos * tiempo;
y = v0sen * tiempo - 0.5 * gt * pow(tiempo, 2);
cout.form("A los %.2lf segundos: \n Proyectil a:
%.2lf metros en X.\nProyectil a: %.2lf metros
en Y.\nVelocidad: %.2lf m/seg, angulo
de caida:%.2lf grados",
tiempo,x,y,v,angulofin);
}
else // Si no se indica que ya llego
{
cout.form("A los %.2lf segundos: el proyectil
llego a destino",tiempo);
}
}
}
else
{
cout.form("!!! Ingrese los datos requerido por favor ¡¡¡\n");
}
delete velo;
delete ang;
delete tiem;
return 0;
}
-------------------------------------------------------------------------------