【问题标题】:gravity attraction between masses质量之间的引力
【发布时间】:2013-10-21 22:25:04
【问题描述】:

为什么我的程序一直在计算相同的力?我正确地使用了公式,但是我不确定为什么我一直得到 127 达因的力。任何帮助将不胜感激

#include <stdio.h>
#include <math.h>
const double gravity_constant = 6.673;
void force_calculate(double a, double b, double c, double d);
void input(double *a, double *b, double *c);
void display(double a, double b, double c, double d);
int main(int argc, char * argv[])
{
    double mass_1 = 0;
    double mass_2 = 0;
    double distance = 0;
    double force = 0;

    input(&mass_1, &mass_2, &distance);
    force = force_calculate(mass_1, mass_2, distance, force);
    display(mass_1, mass_2, distance, force);

    return 0;
}

void force_calculate(double a, double b, double c, double d)
{
    d = (gravity_constant*a*b)/(c*c);
    return;
}
void input(double *a, double *b, double *c)
{
    printf("What is the first mass in grams?\n");
    scanf("%lf", a);
    printf("What is the second mass in grams?\n");
    scanf("%lf", b);
    printf("What is the distance between the two masses in centimeters\n");
    scanf("%lf", c);
}
void display(double a, double b, double c, double d)
{
    printf("%fg is the first mass\n", a);
    printf("%fg is the second mass\n", b);
    printf("%fcm is the distance between the two masses\n", c);
    printf("%f is the force in dynes between both masses\n", d);
    return;
}

【问题讨论】:

  • 当您编译@​​987654322@ 时,您的编译器应该大声警告您您正试图使用​​void 函数不存在的返回值这一事实。要么你需要调高编译器的警告级别,要么你需要养成不忽略警告的习惯。
  • 一般性评论。 (或者也许只是一个有趣的事实......)原型为void func(,,) 的函数不需要在{...} 括号内有return 语句。它可以有一个(或多个),有时很有用,特别是如果你想在功能块中的剩余语句执行之前退出,例如当一个遇到错误条件,或者当满足某些条件时,不再需要或不需要执行以下语句。对于您的代码,它们不是必需的,因为没有以下语句。

标签: c function pointers double


【解决方案1】:

您应该返回值以便可以分配它(确保它也是正确的类型)。此外,您可以在此处删除使用力,因为它是计算的结果。

force = force_calculate(mass_1, mass_2, distance);
...
double force_calculate(double a, double b, double c)
{
 return (gravity_constant*a*b)/(c*c);
}

【讨论】:

    【解决方案2】:

    第一种方法:

    通过引用传递force。将force的定义改为

    void force_calculate(double a, double b, double c, double *d)
    {
        *d = (gravity_constant*a*b)/(c*c);
    }
    

    然后这样称呼它

    force_calculate(mass_1, mass_2, distance, &force);
    

    第二种方法:

    你可以简单地从force_calculate返回值

    double force_calculate(double a, double b, double c, double d)
    {
        d = (gravity_constant*a*b)/(c*c);
        return d;
    }
    

    【讨论】:

    • C 不支持传递引用。您的代码没有通过引用传递变量d,而是通过值传递d的地址。
    • @ElchononEdelson 是的,严格来说不是。它利用指针机制按值传递地址。但它在书中通常被称为“通过引用”。
    • 哦?有哪些书?我从未在任何书籍中看到它被称为“通过引用传递”。而且,考虑到 C++ 除了能够按值传递地址之外,还支持“按引用传递”机制,我不得不说任何这样的书都是错误的。
    • @ElchononEdelson 我看过很多书。看看 IBM documentation
    • @ElchononEdelson 另外,既然您要草率下结论,请查看标签。它说C 而不是C++。它们是不同的语言。
    【解决方案3】:

    问题是您的force_calculate() 函数的返回类型是void,而您将它分配给main() 中的force
    你的函数定义应该是

    void force_calculate(double a, double b, double c, double *d)
    {
        *d = (gravity_constant*a*b)/(c*c);
    }
    

    别忘了改变它的函数原型。而函数调用应该是

    force_calculate(mass_1, mass_2, distance, &force);  
    

    【讨论】:

    • 您可以从声明为返回 void 的函数中的任何位置返回。 stackoverflow.com/a/346616/2293156 他没有返回任何东西
    • @TomásBadan;感谢您的链接。现在编辑它。
    【解决方案4】:

    运行这个程序会给我以下运行时错误。

    d.c:15:11: error: void value 没有被忽略,因为它应该被忽略

    我认为,这可以解决它。

    #include <stdio.h>
    #include <math.h>
    const double gravity_constant = 6.673;
    double force_calculate(double a, double b, double c);
    void input(double *a, double *b, double *c);
    void display(double a, double b, double c, double d);
    int main(int argc, char * argv[])
    {
        double mass_1 = 0;
        double mass_2 = 0;
        double distance = 0;
        double force = 0;
    
        input(&mass_1, &mass_2, &distance);
        force = force_calculate(mass_1, mass_2, distance);
        display(mass_1, mass_2, distance, force);
    
        return 0;
    }
    
    double force_calculate(double a, double b, double c)
    {
        double force;
        force = (gravity_constant*a*b)/(c*c);
        return force;
    }
    void input(double *a, double *b, double *c)
    {
        printf("What is the first mass in grams?\n");
        scanf("%lf", a);
        printf("What is the second mass in grams?\n");
        scanf("%lf", b);
        printf("What is the distance between the two masses in centimeters\n");
        scanf("%lf", c);
    }
    void display(double a, double b, double c, double d)
    {
        printf("%fg is the first mass\n", a);
        printf("%fg is the second mass\n", b);
        printf("%fcm is the distance between the two masses\n", c);
        printf("%f is the force in dynes between both masses\n", d);
        return;
    } 
    

    【讨论】:

    • 布局非常清晰易懂。您可以通过简单地返回计算来简化force_calculate():return (gravity_constant*a*b)/(c*c);。但这只是小事一桩。非常好。
    【解决方案5】:

    您定义 force_calculate 不返回任何内容 (void),但在 main 方法中,您这样称呼它:

    force = force_calculate(mass_1, mass_2, distance, force);
    

    即,您返回的是双精度。

    将你的 force_calculate 更改为此声明:

    double force_calculate(double a, double b, double c);
    

    和 force_calculate 到这个定义:

    double force_calculate(double a, double b, double c)
    {
        return (gravity_constant*a*b)/(c*c);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2015-05-03
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多