Bueno, he estado fuera y he estado liado con esto. Como no tenia internet no pude ver lo que me indicas y he sacado una solucion que me funciona pero no se si la he liado mucho o no jejeje:
Código C:
Ver original#include <stdio.h>
#include <stdlib.h>
#include <math.h>
typedef enum {positiva,negativa}Aceleracion;
typedef struct{
double VelocidadInicial;
double VelocidadFinal;
double PosicionInicial;
double PosicionFinal;
double aceleracion;
}InfoObjeto;
int Menu(void);
void ObtenerDatos(InfoObjeto *A,InfoObjeto *B);
int Verificar(double t,InfoObjeto *A,InfoObjeto *B);
int VerificarTiempos(double t1,double t2,InfoObjeto *A,InfoObjeto *B);
void ReajustarDatos(InfoObjeto *A, InfoObjeto *B, Aceleracion a);
int CalcularTiempos(double *t1,double *t2,InfoObjeto A,InfoObjeto B);
//---------------------------------------------------------------------------
void MostrarInfo(double t,InfoObjeto A,InfoObjeto B)
{
printf("A alcanza a B a los %lf segundos.\n",t
); printf("\tA lleva una velocidad de %lf m/s.\n",A.
VelocidadFinal); printf("\tB lleva una velocidad de %lf m/s.\n",B.
VelocidadFinal); printf("\tA recorre %lf metros.\n",A.
PosicionFinal - A.
PosicionInicial); printf("\tB recorre %lf metros.\n\n",B.
PosicionInicial + B.
PosicionFinal); }
//---------------------------------------------------------------------------
int Verificar(double t, InfoObjeto *A, InfoObjeto *B)
{
//V_f(t) = V0 + a * t;
int alcanza;
double V_fA, V_fB;
if(t >= 0){
V_fA = A->VelocidadInicial + (A->aceleracion * t);
V_fB = B->VelocidadInicial + (B->aceleracion * t);
if(V_fA < 0 || V_fB < 0){
alcanza=0;
}else{
A->VelocidadFinal = V_fA;
B->VelocidadFinal = V_fB;
A
->PosicionFinal
= A
->PosicionInicial
+ (A
->VelocidadInicial
* t
)+(0.5 * A
->aceleracion
* pow(t
,2)); B
->PosicionFinal
= B
->PosicionInicial
+ (B
->VelocidadInicial
* t
)+(0.5 * B
->aceleracion
* pow(t
,2)); if(B->PosicionFinal < 0)
B
->PosicionFinal
= fabs(B
->PosicionFinal
); alcanza=1;
}
}else{
alcanza=0;
}
return alcanza;
}
//---------------------------------------------------------------------------
//Esta funcion lo que hace es reajustar los datos para que valgan para la aceleracion elegida
void ReajustarDatos(InfoObjeto *A, InfoObjeto *B, Aceleracion a)
{
//Coloco las velocidades iniciales en positivo para una correcta verificacion
A
->VelocidadInicial
= fabs(A
->VelocidadInicial
); B
->VelocidadInicial
= fabs(B
->VelocidadInicial
);
//Coloco las aceleraciones en negativo si son negativas y en positivo si son positivas
if(a == positiva){
A
->aceleracion
= fabs(A
->aceleracion
); B
->aceleracion
= fabs(B
->aceleracion
); }else{
A
->aceleracion
= -fabs(A
->aceleracion
); B
->aceleracion
= -fabs(B
->aceleracion
); }
}
//---------------------------------------------------------------------------
int VerificarTiempo(double t, InfoObjeto *A, InfoObjeto *B)
{
int alcanza=0;
//Si en el momento del alcance las velocidades no son ninguna de ellas negativas
//querrá decir que se encontraron antes de invertirse su sentido y será válida
if(Verificar(t,A,B) == 1){
A
->PosicionInicial
= fabs(A
->PosicionInicial
); B
->PosicionInicial
= fabs(B
->PosicionInicial
); B
->PosicionFinal
= -fabs(B
->PosicionFinal
); alcanza=1;
}
return alcanza;
}
//---------------------------------------------------------------------------
int CalcularTiempos(double *t1, double *t2, InfoObjeto A, InfoObjeto B)
{
//X_0A + (V_0A * t)+((1/2) * a_A * t^2) = X_0B + (V_0B * t) + ((1/2) * a_B * t^2);
double c, b, a;
int validos=0;
c = A.PosicionInicial + B.PosicionInicial;
b = A.VelocidadInicial + B.VelocidadInicial;
a = (0.5 * A.aceleracion) + (0.5 * B.aceleracion);
//Si a es negativo no se puede calcular una raiz de un negativo asi que multiplico todos por -1 para cambiar sus signos
if(a < 0){
c *= -1;
b *= -1;
a *= -1;
}
//Calculo ambos tiempos
if(a==0 && b != 0){
*t2 = -1;
}else if(a != 0){
*t1
= (-b
+ sqrt((pow(b
,2) - (4 * a
* c
))))/(2*a
); *t2
= (-b
- sqrt((pow(b
,2) - (4 * a
* c
))))/(2*a
); }
return validos;
}
//---------------------------------------------------------------------------
int Menu(void)
{
int op;
printf("Calculos con MRU, MRUA y MRUR\n"); printf("=============================\n"); printf("1.Calcular tiempo en MRUA con encuentro\n"); printf("2.Calcular tiempo en MRUA con persecucion\n"); printf("3.Calcular tiempo en MRUR con encuentro\n"); printf("4.Calcular tiempo en MRUR con persecucion\n"); printf("\nNOTA: Para MRU use cualquiera las opciones de arriba con aceleracion 0.\n"); printf("\nElige una opcion: ");
return op;
}
//---------------------------------------------------------------------------
void ObtenerDatos(InfoObjeto *A, InfoObjeto *B)
{
printf("Introduce la posicion inicial de A: "); scanf("%lf",&A
->PosicionInicial
); printf("Introduce la velocidad de A: "); scanf("%lf",&A
->VelocidadInicial
); printf("Introduce la aceleracion de A: "); scanf("%lf",&A
->aceleracion
); printf("Introduce la posicion inicial de B: "); scanf("%lf",&B
->PosicionInicial
); printf("Introduce la velocidad de B: "); scanf("%lf",&B
->VelocidadInicial
); printf("Introduce la aceleracion de B: "); scanf("%lf",&B
->aceleracion
); }
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
int op,salir=0;
InfoObjeto A,B;
double t1,t2;
do{
op=Menu();
if(op > 0 && op <= 5){
switch(op){
case 1:
printf("\nMRUA al encuentro:\n"); ObtenerDatos(&A,&B);
B.PosicionInicial *= -1;
CalcularTiempos(&t1,&t2,A,B);
ReajustarDatos(&A,&B,positiva);
if(VerificarTiempo(t1,&A,&B) == 1)
MostrarInfo(t1,A,B);
if(VerificarTiempo(t2,&A,&B) == 1)
MostrarInfo(t2,A,B);
break;
case 2:
printf("\nMRUA al alcance:\n"); ObtenerDatos(&A,&B);
B.PosicionInicial *= -1;
B.VelocidadInicial *= -1;
B.aceleracion *= -1;
CalcularTiempos(&t1,&t2,A,B);
ReajustarDatos(&A,&B,positiva);
if(VerificarTiempo(t1,&A,&B) == 1)
MostrarInfo(t1,A,B);
if(VerificarTiempo(t2,&A,&B) == 1)
MostrarInfo(t2,A,B);
break;
case 3:
printf("\nMRUR al encuentro:\n"); ObtenerDatos(&A,&B);
B.PosicionInicial *= -1;
A.aceleracion *= -1;
B.aceleracion *= -1;
CalcularTiempos(&t1,&t2,A,B);
ReajustarDatos(&A,&B,negativa);
if(VerificarTiempo(t1,&A,&B) == 1)
MostrarInfo(t1,A,B);
if(VerificarTiempo(t2,&A,&B) == 1)
MostrarInfo(t2,A,B);
break;
case 4:
printf("\nMRUR al alcance:\n"); ObtenerDatos(&A,&B);
B.PosicionInicial *= -1;
B.VelocidadInicial *= -1;
A.aceleracion *= -1;
//B.aceleracion *= -1;
CalcularTiempos(&t1,&t2,A,B);
ReajustarDatos(&A,&B,negativa);
if(VerificarTiempo(t1,&A,&B) == 1)
MostrarInfo(t1,A,B);
if(VerificarTiempo(t2,&A,&B) == 1)
MostrarInfo(t2,A,B);
break;
case 5:
salir=1;
break;
}
}else{
printf("Opcion invalida. Vuelve a intentarlo.\n"); }
}while(salir != 1);
return 0;
}
//---------------------------------------------------------------------------
¿que te parece la alternativa?