#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语言程序,用于使用功能查找音量。 编译器未显示任何错误或警告,但输出始终为零。
答案 0 :(得分:5)
由于1/3
是整数除法= 0
将v=(1/3)*pi*r*r*r;
替换为v=(1.f/3.f)*pi*r*r*r;
答案 1 :(得分:2)
那是因为乘以0
的所有内容都是0
,而1/3
是0
。
1/3
是0
,因为1
和3
都是类型int
的文字,将两个整数相除会再次得到一个整数。
修复:1.0/3.0
是因为1.0
和3.0
是浮点文字,因此可以进行浮点除法。
答案 2 :(得分:2)
这是由于1 / 3
是整数除法的事实,因为两个操作数的类型均为int
(a)。因此最终结果为零。
只需确保其中一个操作数不是整数,即可获得预期的效果,例如:
v = (1.0f / 3) * pi * r * r * r;
这将起作用,因为它会导致0.333...
的浮点数(在括号内)。但是,绝对没有没有真正的理由,为什么您需要模仿教科书中显示的方程式,您可以使用更简单的方法达到相同的结果:
v = pi * r * r * r / 3;
因为所有这些变量都是浮点数,所以最后的something / 3
的结果也 做为浮点数。
而且,只是一些快速建议,您 可能要考虑使用double
类型而不是float
。 float
类型通常使用较少的空间,但是,除非您有大量的空间,否则通常不会出现问题。 double
类型提供了更大的范围和精度。
此外,3.14
并不是 精确表示pi
的值。大多数实现都会在M_PI
中定义一个math.h
常量供您使用,但标准并未规定。因此,您可以使用类似这样的方法来获得更准确的值:
#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();
}
最后,您可能想检查一下您的方程式。尽管您没有明确说出来,但它看起来很像是一个球体的体积。
如果是 ,则公式应为4/3 π r3
,而不是1/3
。因此,该语句为:
double volume = M_PI * radius * radius * radius * 4 / 3;
(a)如果您有兴趣,C标准的“常规算术转换”部分({{1}中的6.3.1.8
部分)将全部介绍:
许多期望算术类型的操作数的运算符都以类似的方式引起转换并产生结果类型。目的是确定操作数和结果的通用实型。
然后继续列出在特定情况下会发生的情况,通常是将“较小”(根据其范围和/或精度)操作数升级为与“较大”操作数相同的类型。不过,这是基本思想,如果您想要 full 图片,则应参考前面提到的部分。
在特定情况下,由于C11
的两个操作数均为1 / 3
类型,因此计算和结果以int
完成,这意味着截断小数部分(为零)。
答案 3 :(得分:0)
因为C中的1/3不是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();
}