BMI计算器C代码

Kev*_*son -3 c c++ math indexing if-statement

我正在尝试编写一个简单的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");
    }
}
Run Code Online (Sandbox Code Playgroud)

iks*_*nov 8

所有这些

else if (16 < bmi <= 18.5) {
Run Code Online (Sandbox Code Playgroud)

错了.他们没有按照你的意思去做.要达到理想的效果,请使用

else if (16 < bmi && bmi <= 18.5) {
Run Code Online (Sandbox Code Playgroud)

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

else if ((16 < bmi) <= 18.5) {
Run Code Online (Sandbox Code Playgroud)

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

编辑2

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

编辑

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

bmi = (weight/(height/100)*(height/100));
Run Code Online (Sandbox Code Playgroud)

应该成为

bmi = (weight/((height/100)*(height/100)));
Run Code Online (Sandbox Code Playgroud)

这里的原因几乎相同: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;
}
Run Code Online (Sandbox Code Playgroud)


Bat*_*eba 6

16 < bmi <= 18.5例如,不会做你认为它做的事情.(虽然它编译,它实际上被评估为(16 < bmi) <= 18.5,括号中的位是1(真)或0(假).)

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

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