使用c编程的加农炮弹程序

时间:2018-01-08 20:55:38

标签: c projectile

我正在制作一个让用户输入速度和角度的程序,然后程序计算垂直和水平分量,现在我试图让程序也计算飞行时间(TOF)。等式是t = 2 * Vo * sin(ang)/ g。 但我坚持如何实现它。我试图实现它,但我不是那么成功。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void components(float Vo, float ang, float* outpVx, float* outpVy,float* X,float* Y, float a,float t)
{
    t=0.1;
    a=-9.81;

    *outpVx=Vo*cos(ang);
    *outpVy=Vo*sin(ang);

    *X=*outpVx*t;
    *Y=*outpVy*t+(0.5*a*(t*t));

}

void TOF(float Vo,float ang,float g,float t)
{
    g=9.81;
    main(Vo,ang);
    t=(2*Vo*sin(ang))/g;


}

int main(void)
{
    float Vo,ang;
    float outVx=0.0;
    float outVy=0.0;
    float X;
    float Y;
    float t=0.1;
    float a=-9.81;
    float g= 9.81;

    printf("\nEnter Velocity:\n");
    scanf("%f",&Vo);
    printf("\nEnter Angle:\n");
    scanf("%f",&ang);

    components(Vo,ang, &outVx, &outVy, &X, &Y,a,t);
    printf("Horizontal \t Vertical\n");
    printf("%f \t %f", X, Y);

    TOF(t,g,Vo,ang);
    printf("%f",t);


return 0;
} 

非常感谢一些指导。

2 个答案:

答案 0 :(得分:1)

您似乎在使用C函数时遇到了一些问题。

您的佳能问题的简化解决方案是:

#include <stdio.h>
#include <math.h>

#define PI 3.14159265

int main()
{
   double Vo,ang,rad,g,Vx,Vy,t;

   printf("\nEnter Velocity:\n");
   scanf("%lf",&Vo);

   printf("\nEnter Angle:\n");
   scanf("%lf",&ang);

   g = 9.81;
   rad = ang*PI/180;
   Vx = Vo*cos(rad);
   Vy = Vo*sin(rad);
   t = 2*Vy/g;

   printf("Velocity\tAngle\t\tHorizontal\tVertical\tTime of flight\n");
   printf("%lf\t%lf\t%lf\t%lf\t%lf\n", Vo, ang, Vx, Vy, t);

   return 0;
}

执行示例:

Enter Velocity:
10

Enter Angle:
45
Velocity        Angle           Horizontal      Vertical        Time of flight
10.000000       45.000000       7.071068        7.071068        1.441604

答案 1 :(得分:0)

前面有一些大红旗:

void TOF(float Vo,float ang,float g,float t)
{
    g=9.81;
    main(Vo,ang);
    t=(2*Vo*sin(ang))/g;
}

int main( void )
{
  ...
  TOF(t,g,Vo,ang);
  ...
}
  1. C不是按名称匹配函数参数,而是按 position 匹配。函数调用(TOF(t,g,Vo,ang))和函数定义(void TOF(float Vo,float ang,float g,float t))之间的参数顺序似乎不匹配。另请注意,Vo中的anggtTOF中的每一个都是内存中完全不同的对象 {在Vo中{1}},anggt;写入main中的t不会影响TOFt的值。此外,参数main已包含值g;没有必要在9.81中再次写入。

  2. 为什么要从TOF拨打main?什么目的?请注意,TOF的定义不期望任何参数,但是您在main的调用中传递了两个参数。

  3. 以下是我想要的

    TOF

    如果您希望float TOF( float Vo, float ang, float g ) { return (2 * Vo * sin( ang ) ) / g; } int main( void ) { ... t = TOF( Vo, ang, g ); ... } 键入TOF并在参数列表中更新void,则必须将指针传递给{{1 }}:

    t

    此外,请记住tvoid TOF( float Vo, float ang, float g, float *t ) { *t = (2 * Vo * sin( ang ) ) / g; } int main( void ) { ... TOF( Vo, ang, g, &t ); ... } 期望他们的参数以弧度表示,而不是度。

    最后,除非您确实 有充分的理由不这样做,否则请使用sin代替cosdoublefloat都期望sin个参数并返回cos个值。