BMI计算器C代码

时间:2016-02-12 10:13:46

标签: c++ c if-statement math indexing

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

   647921509 RandomizerXorshiftPlus
   821202158 BoolGenerator2 (reusing the same buffer)
  1065582517 modified Randomizer
  1130958451 BoolGenerator2 (creating a new buffer as needed)
  1140139042 xorshift128plus
  2738780431 xorshift1024star
  4629217068 std::mt19937
  6613608092 rand()
  8606805191 std::bernoulli_distribution
 11454538279 BoolGenerator
 19288820587 std::uniform_int_distribution

2 个答案:

答案 0 :(得分:8)

所有这些

else if (16 < bmi <= 18.5) {

错了。他们不做你的意思。要获得所需的结果,请使用

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

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

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

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

修改2

强制性SO链接:Is (4 > y > 1) a valid statement in C++? How do you evaluate it if so?

修改

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

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

应该成为

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

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

编辑3 以下是我如何使用STL解决这个问题(这种方法有利于清楚地表达算法背后的想法,而不会将其隐藏在实现细节之下):

#include <iostream>
#include <string>
#include <vector>
#include <utility>
#include <limits>
#include <algorithm>

int main()
{
    std::vector<std::pair<float, std::string> > bmi_table = {
        { 16, "Severely Underweight" },
        { 18.5, "Underweight" },
        { 25, "Healthy" },
        { 30, "Overweight" },
        { std::numeric_limits<float>::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;
}

答案 1 :(得分:6)

例如,

16 < bmi <= 18.5并没有按照您的想法行事。 (虽然它编译,它实际上被评估为(16 < bmi) <= 18.5,括号中的位是1(真)或0(假)。)

您需要撰写16 < bmi && bmi <= 18.5

但如果您订购了bmi限制,则不需要反复测试下限。