【问题标题】:Program always outputs 0 value程序总是输出 0 值
【发布时间】:2018-08-11 00:53:30
【问题描述】:
#include <stdio.h>
void volume()
{
   float pi=3.14,r,v;
   printf("\nEnter the radius: ");
   scanf("%f",&r);
   v=(1/3)*pi*r*r*r;
   printf("%f",v);
}
int main()
{
   volume();

}

这是使用函数查找体积的 C 程序。 编译器未显示错误或警告,但输出始终为零。

【问题讨论】:

  • 提示:编译时带有最高级别的警告。 scanf 中的格式说明符无效。
  • (1/3) 是整数数学,即 0。将其更改为 (1.0 / 3.0)
  • float1/3 的读数是 int 的除法。请改用pi*r*r*r/3

标签: c function


【解决方案1】:

因为1/3 是整数除法= 0,所以这里的值为零

v=(1/3)*pi*r*r*r; 替换为v=(1.f/3.f)*pi*r*r*r;

【讨论】:

    【解决方案2】:

    这是因为任何乘以 0 的值都是 0,而 1/30

    1/30,因为13 都是int 类型的文字,并且将两个整数相除会再次得到一个整数。

    修复:1.0/3.0 因为1.03.0 是浮点文字,所以你得到浮点除法。

    【讨论】:

    • 如果你只固定分子或分母,它不会起作用吗?即1/3.0?
    • @AndyJ 是的,那么另一个操作数将被隐式转换为double,但我更喜欢显式。
    【解决方案3】:

    这是因为1 / 3 是作为整数除法完成的,因为两个操作数都是int(a) 类型。所以最终结果为零。

    您只需确保其中一个操作数为非整数即可获得预期效果,例如:

    v = (1.0f / 3) * pi * r * r * r;
    

    这会起作用,因为它会产生0.333... 的浮点数(在括号内)。但是,绝对没有真正的原因需要复制教科书中显示的方程式,您可以使用更简单的方法获得相同的结果:

    v = pi * r * r * r / 3;
    

    因为所有这些变量都是浮点数,所以最终something / 3 的结果也是作为浮点数完成的。


    而且,只是一些快速建议,您可能想考虑使用double 类型而不是floatfloat 类型通常使用较少的空间,但除非您有大型数组,否则这通常不是问题。 double 类型提供了更大的范围和精度。


    此外,3.14 并不是真正 精确的 pi 值。大多数实现将在math.h 中定义一个M_PI 常量供您使用,但标准没有强制要求。因此,您可以使用这样的方法来获得更准确的值:

    #include <stdio.h>
    #include <math.h>
    
    // Define if implementation doesn't provide.
    
    #ifndef M_PI
        #define M_PI 3.14159265358979323846
    #endif
    
    static void GetRadiusAndPrintVolume(void) {
        printf("\nEnter the radius: ");
        double radius;
        scanf("%lf", &radius);
    
        double volume = M_PI * radius * radius * radius / 3;
    
        printf("Volume for radius %f is %f\n", radius, volume);
    }
    
    int main() {
        GetRadiusAndPrintVolume();
    }
    

    最后,您可能想检查您的方程式。虽然您没有明确说明,但它非常看起来应该是球体的体积。

    如果,公式应该是<sup>4</sup>/<sub>3</sub> π r<sup>3</sup> 而不是<sup>1</sup>/<sub>3</sub>。因此,声明将是:

    double volume = M_PI * radius * radius * radius * 4 / 3;
    

    (a) 如果您有兴趣,C 标准的“常用算术转换”部分(C11 中的 6.3.1.8 部分)涵盖了所有内容:

    许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。

    然后继续列出特定情况下发生的情况,通常是“较小”(就其范围和/或精度而言)操作数升级为与“较大”操作数相同的类型。这是基本的想法,如果你想要完整的图片,你应该参考前面提到的部分。

    您的特定情况下,由于1 / 3 的两个操作数都是int 类型,因此计算和结果将作为int 完成,这意味着它会截断小数部分(给出零)。

    【讨论】:

    • 如果还没有说,迟来的 600K 大关祝贺 :) 你 Leffler 和 Dash 已经垄断了市场......
    【解决方案4】:

    因为 1/3 在 C 中不是 0.3333,所以它是 0。

    解决方案:

    #include <stdio.h>
    void volume()
    {
       float pi=3.14,r,v;
       printf("\nEnter the radius: ");
       scanf("%f",&r);
       v=(((float)1)/3)*pi*r*r*r;
       printf("%f",v);
    }
    int main()
    {
       volume();
    
    } 
    

    【讨论】:

    • 你为什么选择(浮动),有什么不同吗?它有什么用?
    • @Avi 在您的 C 教科书或教程中了解类型转换。
    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多