我认为错误在于这一行:
float bmi = weight * 703 / pow(height, 2.0); // user inputs weight and height and the bmi should be calculated.
问题是,我创建了一个模拟程序,其中已经输入了值,一切都很好。但是当我使用scanf()让用户输入相同的值时,它不起作用。
#include <stdio.h>
#include <math.h>
int main ()
{
float weight = 105, height = 63;
float bmi;
bmi = weight * 703 / pow(height, 2.0);
printf("%f\n", bmi);
}
重量和高度都是浮子。当我尝试打印bmi时,我得到&#34; inf。&#34;
**编辑显示输入功能和打印声明。
printf("Weight? ");
scanf("%f", &weight);
printf("BMI is %.2f.\n", bmi);
另一个输入语句与替换权重的单词高度基本相同。
编辑:这是整个代码
#include <stdio.h>
#include <math.h>
int main ()
{
float weight, height;
float bmi = weight * 703 / pow(height, 2.0);
printf("Height? ");
scanf("%f", &height);
printf("Weight? ");
scanf("%f", &weight);
printf("Your BMI is calculated at %.2f.\n", bmi);
printf("%f\n", height);
printf("%f\n", weight);
}
答案 0 :(得分:3)
您正在使用weight
和height
未初始化:
float weight, height;
float bmi = weight * 703 / pow(height, 2.0);
这是未定义的行为,这就是为什么你得到inf
,在我的情况下,我得到0.00
,但任何事情都可以在UB下发生。
更改为
#include <stdio.h>
#include <math.h>
int main(void)
{
float weight, height;
float bmi;
printf("Height? ");
scanf("%f", &height);
printf("Weight? ");
scanf("%f", &weight);
bmi = weight * 703 / pow(height, 2.0);
printf("Your BMI is calculated at %.2f.\n", bmi);
printf("%f\n", height);
printf("%f\n", weight);
return 0;
}
答案 1 :(得分:1)
您需要在使用之前初始化变量。
int main ()
{
float weight, height;
float bmi;
printf("Height? ");
scanf("%f", &height);
printf("Weight? ");
scanf("%f", &weight);
bmi = weight * 703 / pow(height, 2.0);
printf("Your BMI is calculated at %.2f.\n", bmi);
printf("%f\n", height);
printf("%f\n", weight);
}
答案 2 :(得分:0)
float weight, height;
float bmi = weight * 703 / pow(height, 2.0);
我认为您认为这定义了bmi
的含义,bmi
和weight
更改时height
的值会发生变化。< / p>
我记得第一次开始编程时发生了类似的错误。与数学方程不同,C中的语句按顺序执行。您很快就会了解影响该订单的方法,但是对于像这样的小型程序,这些语句是线性执行的。
初始化就像一个赋值。这样:
float bmi = weight * 703 / pow(height, 2.0);
做同样的事情:
float bmi;
bmi = weight * 703 / pow(height, 2.0);
它将bmi
的值设置为表达式在评估时的结果。由于您还没有为weight
和height
分配值,因此它们的值是垃圾,而分配给bmi
的表达式结果也是垃圾。您稍后打印未更改的垃圾值。
如果您希望bmi
成为您引用时评估的内容而不是定义时,可以使其成为一种功能 - 但是&#39在这种情况下没有必要。相反,只需确保您分配给bmi
的值有效,这意味着必须在之后计算,您已将值分配给width
和{{ 1}}。
在height
和height`中存储有效值之后,将初始化放在bmi
的声明上并添加等效的作业:
width
正如其他人建议的那样,您也可以在程序中稍后移动声明和初始化。 (早期版本的C有限制使得这很困难,有些编译器可能仍然不支持它。)