BMI计算器C代码

我正在尝试编写一个简单的BMI计算器,但由于某些原因,当我尝试175为高度(公式为1.75)和70为质量时,它应该给22.8,这是在健康的范围,但它让我体重不足。 我知道这可能是一个简单的错误,但我看不到它。

float main(void) { float height; printf("Enter your height in cm:\n"); scanf("%f",&height); float weight; printf("Enter your weight in kg:\n"); scanf("%f",&weight); float bmi; bmi = (weight/(height/100)*(height/100)); if (bmi <= 16) { printf("Severely Underweight\n"); } else if (16 < bmi <= 18.5) { printf("Underweight\n"); } else if (18.5 < bmi <= 25) { printf("Healthy\n"); } else if (25 < bmi <= 30) { printf("Overweight\n"); } else { printf("Severely Overweight\n"); } } 

所有这些

 else if (16 < bmi <= 18.5) { 

错了。 他们没有按照你的意思去做。 要达到预期效果,请使用

 else if (16 < bmi && bmi <= 18.5) { 

原因是,您的表达式被评估为

 else if ((16 < bmi) <= 18.5) { 

其中(16 < bmi)计算为truefalse ,其又等于10 ,然后与第二个常数进行比较。 之所以如此评估,是因为比较运算符是左关联的 ,因此从左到右进行评估。

编辑2

强制性的SO链接: (4> y> 1)是C ++中的有效语句吗? 如果是这样你怎么评价?

编辑

我怀疑这个,但不知道这个公式。 现在@MOehm已经确认了(维基百科似乎也证实了这一点):

 bmi = (weight/(height/100)*(height/100)); 

应该成为

 bmi = (weight/((height/100)*(height/100))); 

这里的原因几乎相同:C ++中的运算符优先级和表达式求值规则。 OP,注意这些方面,并在适当的地方加上括号!

编辑3以下是我如何使用STL进行此操作(这种方法的好处是可以清楚地表达算法背后的想法,而不会将其隐藏在实现细节之下):

 #include  #include  #include  #include  #include  #include  int main() { std::vector > bmi_table = { { 16, "Severely Underweight" }, { 18.5, "Underweight" }, { 25, "Healthy" }, { 30, "Overweight" }, { std::numeric_limits::max(), "Severely Overweight" } }; float height, weight; std::cin >> height >> weight; const float bmi = (weight/((height/100.f)*(height/100.f))); const auto idx = std::find_if(bmi_table.begin(), bmi_table.end(), [&](decltype(bmi_table)::value_type& p) -> bool { return p.first > bmi; }); std::cout << idx->second << '\n'; return 0; } 

16 < bmi <= 18.5并不能达到您的想象。 (虽然它编译,它实际上被评估为(16 < bmi) <= 18.5并且括号中的位是1(真)或0(假)。)

你需要写16 < bmi && bmi <= 18.5

但是如果您订购了bmi限制,则无需重复测试下限。