[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;
}	
-------------------------------------------------------------------------------