为什么我的C代码计算错误

时间:2017-06-18 07:08:39

标签: c scanf integer-division

我试图编写一个公式来计算球体的体积,用户输入半径。公式为V = (4/3)PI r*r*r。我无法弄清楚为什么我的代码只是说无论输入是什么,音量都是1。以下是我正在使用的内容:

#include <stdio.h>

int main(void) {

    float pi, r, v;

    pi = 3.1416;

    printf("What is the radius?\n");
    scanf("%d", &r);

    v = ((4/3) * pi) * r * r * r;

    printf("Volume of the sphere is: %d\n", v);

    if (v>10)
        printf("Volume is greater than 10");

    return 0;
}

2 个答案:

答案 0 :(得分:5)

我认为有很多问题。

首先,

  scanf("%d", &r);

应该是

 scanf("%f", &r);

rfloat。将不兼容的类型作为参数传递会导致undefined behavior。请仔细检查格式说明符和提供的参数类型。

同样适用于

     printf("Volume of the sphere is: %d\n", v);

另外,由于%f预计float(或double,确切地说是float,默认参数宣传后会提升为double ,无论如何), %d

启用其他选项后,编译器可能会警告您不匹配(至少,gcc可以这样做)。启用所有警告,它应该为您指出问题。

然后,稍后

   v = ((4/3) * pi) * r * r * r;

4/3产生一个整数除法(给出1),因此它不会按照您的想法执行。如果需要,您需要强制执行浮点除法,例如:

v = (pi * 4 / 3) * r * r * r;

float pi乘以4得到浮点数,在除以float 3

答案 1 :(得分:0)

用于计算球体积的修改代码。

int main(void) {

    float pi, r, v;

    pi = 3.1416;

    printf("What is the radius?\n");
    scanf("%f", &r); //%d is for integers and %f is for float

    v = ((4.0/3.0) * pi) * r * r * r; // (4/3) typecasts to an integer and results to 1

    printf("Volume of the sphere is: %f\n", v); //%d is for integers and %f is for float

    if (v>10)
        printf("Volume is greater than 10\n");

    return 0;
}