Ver Mensaje Individual
  #11 (permalink)  
Antiguo 19/05/2016, 11:25
aguml
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 9 meses
Puntos: 3
Respuesta: Saber si en mrua habrá alcance o nunca se encontraran

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
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. typedef enum {positiva,negativa}Aceleracion;
  6.  
  7. typedef struct{
  8.    double VelocidadInicial;
  9.    double VelocidadFinal;
  10.    double PosicionInicial;
  11.    double PosicionFinal;
  12.    double aceleracion;
  13. }InfoObjeto;
  14.  
  15. int Menu(void);
  16. void ObtenerDatos(InfoObjeto *A,InfoObjeto *B);
  17. int Verificar(double t,InfoObjeto *A,InfoObjeto *B);
  18. int VerificarTiempos(double t1,double t2,InfoObjeto *A,InfoObjeto *B);
  19. void ReajustarDatos(InfoObjeto *A, InfoObjeto *B, Aceleracion a);
  20. int CalcularTiempos(double *t1,double *t2,InfoObjeto A,InfoObjeto B);
  21. //---------------------------------------------------------------------------
  22.  
  23. void MostrarInfo(double t,InfoObjeto A,InfoObjeto B)
  24. {
  25.    printf("A alcanza a B a los %lf segundos.\n",t);
  26.    printf("En ese tiempo:\n");
  27.    printf("\tA lleva una velocidad de %lf m/s.\n",A.VelocidadFinal);
  28.    printf("\tB lleva una velocidad de %lf m/s.\n",B.VelocidadFinal);
  29.    printf("\tA recorre %lf metros.\n",A.PosicionFinal - A.PosicionInicial);
  30.    printf("\tB recorre %lf metros.\n\n",B.PosicionInicial + B.PosicionFinal);
  31. }
  32. //---------------------------------------------------------------------------
  33.  
  34. int Verificar(double t, InfoObjeto *A, InfoObjeto *B)
  35. {
  36.    //V_f(t) = V0 + a * t;
  37.    int alcanza;
  38.    double V_fA, V_fB;
  39.  
  40.    if(t >= 0){
  41.       V_fA = A->VelocidadInicial + (A->aceleracion * t);
  42.       V_fB = B->VelocidadInicial + (B->aceleracion * t);
  43.       if(V_fA < 0 || V_fB < 0){
  44.          alcanza=0;
  45.       }else{
  46.          A->VelocidadFinal = V_fA;
  47.          B->VelocidadFinal = V_fB;
  48.          A->PosicionFinal = A->PosicionInicial + (A->VelocidadInicial * t)+(0.5 * A->aceleracion * pow(t,2));
  49.          B->PosicionFinal = B->PosicionInicial + (B->VelocidadInicial * t)+(0.5 * B->aceleracion * pow(t,2));
  50.          if(B->PosicionFinal < 0)
  51.             B->PosicionFinal = fabs(B->PosicionFinal);
  52.          alcanza=1;
  53.       }
  54.    }else{
  55.       alcanza=0;
  56.    }
  57.    return alcanza;
  58. }
  59. //---------------------------------------------------------------------------
  60.  
  61. //Esta funcion lo que hace es reajustar los datos para que valgan para la aceleracion elegida
  62. void ReajustarDatos(InfoObjeto *A, InfoObjeto *B, Aceleracion a)
  63. {
  64.    //Coloco las velocidades iniciales en positivo para una correcta verificacion
  65.    A->VelocidadInicial = fabs(A->VelocidadInicial);
  66.    B->VelocidadInicial = fabs(B->VelocidadInicial);
  67.  
  68.    //Coloco las aceleraciones en negativo si son negativas y en positivo si son positivas
  69.    if(a == positiva){
  70.       A->aceleracion = fabs(A->aceleracion);
  71.       B->aceleracion = fabs(B->aceleracion);
  72.    }else{
  73.       A->aceleracion = -fabs(A->aceleracion);
  74.       B->aceleracion = -fabs(B->aceleracion);
  75.    }
  76. }
  77. //---------------------------------------------------------------------------
  78.  
  79. int VerificarTiempo(double t, InfoObjeto *A, InfoObjeto *B)
  80. {
  81.    int alcanza=0;
  82.  
  83.    //Si en el momento del alcance las velocidades no son ninguna de ellas negativas
  84.    //querrá decir que se encontraron antes de invertirse su sentido y será válida
  85.    if(Verificar(t,A,B) == 1){
  86.       A->PosicionInicial = fabs(A->PosicionInicial);
  87.       B->PosicionInicial = fabs(B->PosicionInicial);
  88.       B->PosicionFinal = -fabs(B->PosicionFinal);
  89.       alcanza=1;
  90.    }
  91.    return alcanza;
  92. }
  93. //---------------------------------------------------------------------------
  94.  
  95. int CalcularTiempos(double *t1, double *t2, InfoObjeto A, InfoObjeto B)
  96. {
  97.    //X_0A + (V_0A * t)+((1/2) * a_A * t^2) = X_0B + (V_0B * t) + ((1/2) * a_B * t^2);
  98.  
  99.    double c, b, a;
  100.    int validos=0;
  101.  
  102.    c = A.PosicionInicial + B.PosicionInicial;
  103.    b = A.VelocidadInicial + B.VelocidadInicial;
  104.    a = (0.5 * A.aceleracion) + (0.5 * B.aceleracion);
  105.  
  106.    //Si a es negativo no se puede calcular una raiz de un negativo asi que multiplico todos por -1 para cambiar sus signos
  107.    if(a < 0){
  108.       c *= -1;
  109.       b *= -1;
  110.       a *= -1;
  111.    }
  112.  
  113.    //Calculo ambos tiempos
  114.    if(a==0 && b != 0){
  115.       *t1 = fabs(c)/fabs(b);
  116.       *t2 = -1;
  117.    }else if(a != 0){
  118.       *t1 = (-b + sqrt((pow(b,2) - (4 * a * c))))/(2*a);
  119.       *t2 = (-b - sqrt((pow(b,2) - (4 * a * c))))/(2*a);
  120.    }
  121.    return validos;
  122. }
  123. //---------------------------------------------------------------------------
  124.  
  125. int Menu(void)
  126. {
  127.    int op;
  128.    printf("Calculos con MRU, MRUA y MRUR\n");
  129.    printf("=============================\n");
  130.    printf("1.Calcular tiempo en MRUA con encuentro\n");
  131.    printf("2.Calcular tiempo en MRUA con persecucion\n");
  132.    printf("3.Calcular tiempo en MRUR con encuentro\n");
  133.    printf("4.Calcular tiempo en MRUR con persecucion\n");
  134.    printf("5.Salir\n");
  135.    printf("\nNOTA: Para MRU use cualquiera las opciones de arriba con aceleracion 0.\n");
  136.    printf("\nElige una opcion: ");
  137.    scanf("%d",&op);
  138.  
  139.    return op;
  140. }
  141. //---------------------------------------------------------------------------
  142.  
  143. void ObtenerDatos(InfoObjeto *A, InfoObjeto *B)
  144. {
  145.    printf("Introduce la posicion inicial de A: ");
  146.    scanf("%lf",&A->PosicionInicial);
  147.    printf("Introduce la velocidad de A: ");
  148.    scanf("%lf",&A->VelocidadInicial);
  149.    printf("Introduce la aceleracion de A: ");
  150.    scanf("%lf",&A->aceleracion);
  151.    printf("Introduce la posicion inicial de B: ");
  152.    scanf("%lf",&B->PosicionInicial);
  153.    printf("Introduce la velocidad de B: ");
  154.    scanf("%lf",&B->VelocidadInicial);
  155.    printf("Introduce la aceleracion de B: ");
  156.    scanf("%lf",&B->aceleracion);
  157.    printf("\n");
  158. }
  159. //---------------------------------------------------------------------------
  160.  
  161. int main(int argc, char* argv[])
  162. {
  163.    int op,salir=0;
  164.    InfoObjeto A,B;
  165.    double t1,t2;
  166.  
  167.    do{
  168.       op=Menu();
  169.  
  170.       if(op > 0 && op <= 5){
  171.          switch(op){
  172.             case 1:
  173.                printf("\nMRUA al encuentro:\n");
  174.                printf("A---->Xf<----B\n\n");
  175.                ObtenerDatos(&A,&B);
  176.                B.PosicionInicial *= -1;
  177.                CalcularTiempos(&t1,&t2,A,B);
  178.                ReajustarDatos(&A,&B,positiva);
  179.                if(VerificarTiempo(t1,&A,&B) == 1)
  180.                   MostrarInfo(t1,A,B);
  181.                if(VerificarTiempo(t2,&A,&B) == 1)
  182.                   MostrarInfo(t2,A,B);
  183.                system("PAUSE");
  184.                system("CLS");
  185.                break;
  186.             case 2:
  187.                printf("\nMRUA al alcance:\n");
  188.                printf("A---->B---->Xf\n\n");
  189.                ObtenerDatos(&A,&B);
  190.                B.PosicionInicial *= -1;
  191.                B.VelocidadInicial *= -1;
  192.                B.aceleracion *= -1;
  193.                CalcularTiempos(&t1,&t2,A,B);
  194.                ReajustarDatos(&A,&B,positiva);
  195.                if(VerificarTiempo(t1,&A,&B) == 1)
  196.                   MostrarInfo(t1,A,B);
  197.                if(VerificarTiempo(t2,&A,&B) == 1)
  198.                   MostrarInfo(t2,A,B);
  199.                system("PAUSE");
  200.                system("CLS");
  201.                break;
  202.             case 3:
  203.                printf("\nMRUR al encuentro:\n");
  204.                printf("A---->Xf<----B\n\n");
  205.                ObtenerDatos(&A,&B);
  206.                B.PosicionInicial *= -1;
  207.                A.aceleracion *= -1;
  208.                B.aceleracion *= -1;
  209.                CalcularTiempos(&t1,&t2,A,B);
  210.                ReajustarDatos(&A,&B,negativa);
  211.                if(VerificarTiempo(t1,&A,&B) == 1)
  212.                   MostrarInfo(t1,A,B);
  213.                if(VerificarTiempo(t2,&A,&B) == 1)
  214.                   MostrarInfo(t2,A,B);
  215.                system("PAUSE");
  216.                system("CLS");
  217.                break;
  218.             case 4:
  219.                printf("\nMRUR al alcance:\n");
  220.                printf("A---->B---->Xf\n\n");
  221.                ObtenerDatos(&A,&B);
  222.                B.PosicionInicial *= -1;
  223.                B.VelocidadInicial *= -1;
  224.                A.aceleracion *= -1;
  225.                //B.aceleracion *= -1;
  226.                CalcularTiempos(&t1,&t2,A,B);
  227.                ReajustarDatos(&A,&B,negativa);
  228.                if(VerificarTiempo(t1,&A,&B) == 1)
  229.                   MostrarInfo(t1,A,B);
  230.                if(VerificarTiempo(t2,&A,&B) == 1)
  231.                   MostrarInfo(t2,A,B);
  232.                system("PAUSE");
  233.                system("CLS");
  234.                break;
  235.             case 5:
  236.                salir=1;
  237.                break;
  238.          }
  239.       }else{
  240.          printf("Opcion invalida. Vuelve a intentarlo.\n");
  241.       }
  242.    }while(salir != 1);
  243.  
  244.    return 0;
  245. }
  246. //---------------------------------------------------------------------------
¿que te parece la alternativa?