BMI计算器C代码[关闭]

2024-03-22

我正在尝试编写一个简单的 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) {

where (16 < bmi)评估为true or false这又等于1 or 0,然后与第二个常数进行比较。之所以这样评估,是因为比较运算符是左结合 http://en.cppreference.com/w/cpp/language/operator_precedence,因此从左到右进行评估。

Edit 2

强制性 SO 链接:(4 > y > 1) 在 C++ 中是有效的语句吗?如果是的话你如何评价? https://stackoverflow.com/questions/8889522/is-4-y-1-a-valid-statement-in-c-how-do-you-evaluate-it-if-so

Edit

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

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

应该成为

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

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

Edit 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BMI计算器C代码[关闭] 的相关文章

随机推荐

  • Windows 窗体中的十进制文本框

    我正在做一个 Financial Winforms 应用程序 但在控件方面遇到了一些问题 我的客户需要在各处插入小数值 价格 折扣等 我想避免一些重复验证 因此 如果不是因为焦点和蒙版的长度 我立即尝试了能够满足我的需求的 MaskedTe
  • SQL Server:大块数据库查询

    我正在使用 Microsoft SQL Server Management Studio 我对 SQL Server 的专业知识很少 但我过去使用过 MySQL 并且非常擅长 我的问题是 我有一个相当大的数据库 有超过 1 3 亿条记录 我
  • 将 phpseclib 集成到 Laravel 5

    我目前正在将我的项目从 Laravel 4 迁移到 Laravel 5 我仍然是 Laravel 和 OOP 的新手用户 但到目前为止一切都很顺利 但是 在我的 L4 项目中 我使用 phpseclib 生成 SSH 密钥 并通过以下方式导
  • Gmail 的 HTML 电子邮件签名显示方式不同

    我使用 Thunderbird 作为我的主要工作邮件客户端 我刚刚创建了一个新的 HTML 签名 它可以在 Thunderbird Opera 和在线 HTML 查看器中正确显示 但不能在 GMail 上显示 如果有人能指出问题所在的方向
  • 在 R 中的函数内保存单个对象:RData 文件大小非常大

    我试图在 R 中保存修剪后的 GLM 对象 即所有 非必要 特征设置为 NULL 例如残差 prior weights qr qr 举个例子 看看我需要执行此操作的最小对象 print object size glmObject 16899
  • 需要在 5 秒内使用 hibernate 在 mysql 中插入 100000 行

    我正在尝试使用 Hibernate JPA 在 5 秒内向 MYSQL 表中插入 100 000 行 我已经尝试了 hibernate 提供的所有技巧 但仍然无法做得比 35 秒更好 第一个优化 我从 IDENTITY 序列生成器开始 这导
  • 会话没有被破坏

    我有这个文件 安全 php session start if empty SESSION u name header Location emprego php if isset GET logout session destroy head
  • 通用 Windows 平台是否会取代 Windows 8 和 Windows Phone 应用程序的 WinRT?

    通用 Windows 平台是否会取代 Windows 8 和 Windows Phone 应用程序的 WinRT 我的意思是 有一个 WinRT 平台专门为 Windows 8 开发 Metro 应用程序 现在 它被 UWP 取代了 不是吗
  • CPU利用率和能耗之间有什么关系?

    描述 CPU 利用率和能源消耗 电 热方面 之间关系的函数是什么 我想知道它是否是线性 次线性 exp 等 我正在编写一个程序 可以降低其他程序的 CPU 利用率 负载 我主要关心的是我能在能源方面受益多少 此外 我的服务器主要用作数据中心
  • HTTP 慢速发布和 IIS 设置以防止

    因此 我们从一家安全公司收到了这份报告 称我们在 IIS 8 0 上运行的 MVC 网站容易受到慢速 HTTP post DoS 攻击 报告指出我们应该 限制请求属性是通过
  • 如何等待猫鼬查询的结果?

    我尝试根据猫鼬查询的结果过滤数组 标准过滤器函数期望回调返回 true 或 false 我的麻烦是这个信息取决于 mongoose findOne 查询的异步结果 code that does not work myArray filter
  • PageSpeed 指责脚本在使用外部图像时存在“渲染阻塞”

    我在页面正文的结束标记之前放置了一个来自 CDN 的脚本 上面 谷歌的 PageSpeed Insights 说 消除首屏内容中阻碍渲染的 JavaScript 和 CSS您的页面有 1 个阻止脚本资源 这会导致页面渲染延迟 我在结束之前就
  • 使用 Visual Studio 2008 错误创建输出文件夹

    我有很多项目的解决方案 实际上有一个核心项目和一些插件 我更改了所有插件的 OutputPath 因此所有二进制文件最终都位于 Core bin debug 文件夹中 这是必要的 因为核心没有对插件的引用 因此它在编译时不会 包含 插件二进
  • Cocoa应用程序菜单-如何重新创建?

    在 MainMenu xib 中 我删除了默认的主菜单 它会自动为您提供应用程序菜单 以及文件 编辑 格式 查看 窗口 帮助菜单 我需要采取哪些步骤才能将其添加回我的应用程序中 我将创建一个新应用程序 然后仅复制Main Menu回到你的M
  • 如何限制Java 8应用程序消耗的总内存?

    为了限制 Java 7 应用程序消耗的总内存 我可以使用以下公式 取自本文 https plumbr eu blog why does my java process consume more memory than xmx 最大内存 Xm
  • VB6:如何从日期类型中删除时间部分

    我有一个Date还包含时间的变量 Dim dt As Date dt 8 3 2016 7 10 40 AM gt 以某种方式删除时间 所以结果应该是 dt 8 3 2016 怎么去掉时间呢 对于另一个日期类型变量 dt DateValue
  • Rails 3 ActiveRecord:UNION

    有没有办法在 Rails 3 中使用 MySQL UNION 我认为让其工作的唯一方法是直接执行查询 ActiveRecord Base connection execute SELECT REPEAT a 1 UNION SELECT R
  • 根据组枚举mysql中的行

    我有一组记录 例如 A B 1 5 1 6 1 9 2 1 2 8 其中我们有两个组 A 1 和 A 2 组内记录按 B 中的值排序 我需要在每个组中添加一个带有枚举的列 A B C 1 5 1 1 6 2 1 9 3 2 1 1 2 8
  • 将父类强制转换为子类

    我有 Message 类 我已经扩展并添加了新属性 class ChildMessage Message prop 在尝试将消息类添加到 ChildMessage 列表时 我得到添加类的 Null 引用 var myChildList ne
  • BMI计算器C代码[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在尝试编写一个简单的 BMI 计算器 但出于某种原因 当我尝试身高 175 公式为 1 75 和体重 70 时 它应该给出 2