题目描述

编写程序计算BMI指数(身体质量指数),并根据计算结果输出对应的体型判断结果。BMI计算公式为:BMI = m / (h * h),其中m表示体重(千克),h表示身高(米)。

题目要求:

  • 当BMI < 18.5时,输出"Underweight"
  • 当18.5 ≤ BMI < 24时,输出"Normal"
  • 当BMI ≥ 24时,先输出BMI值(保留6位有效数字),再输出"Overweight"
  • 请注意,保留六位有效数字不是保留六位小数。例如 123.4567 应该输出为 123.457,5432.10 应该输出为 5432.1。

输入输出格式

  • 输入:一行两个浮点数,分别表示体重m(kg)和身高h(m)
  • 输出:根据计算结果输出对应的判断结果

代码实现与解析

#include<bits/stdc++.h> // 万能头文件,包含常用库
using namespace std;

int main() {
    float m, h; // 定义体重和身高变量
    cin >> m >> h; // 读取输入
    
    float bmi = m / (h * h); // 计算BMI值
    
    if(bmi < 18.5) 
        cout << "Underweight" << endl; // BMI<18.5
    else if(bmi < 24) 
        cout << "Normal" << endl; // 18.5≤BMI<24
    else 
        cout << setprecision(6) << bmi << endl << "Overweight" << endl; // BMI≥24
    
    return 0;
}

重点解析:格式控制输出

1. setprecision流操作符

在BMI≥24的情况下,题目要求输出BMI值时保留6位有效数字。这里使用了setprecision操作符:

cout << setprecision(6) << bmi;
  • 作用:设置浮点数输出的精度(有效数字位数)
  • 特点
    • 默认情况下,setprecision控制的是总有效数字位数(不是小数点后的位数)
    • 会自动进行四舍五入
    • 会省略末尾多余的0

2. 对比不同输出方式

输出方式 示例值 输出结果 说明
默认输出 35.4308 35.4308 保留原始精度
setprecision(6) 35.4308 35.4308 保留6位有效数字
setprecision(6) 24.0000 24 自动省略末尾0
setprecision(6) 26.1234567 26.1235 四舍五入到6位有效数字

3. 与fixed组合使用 fixed<<setprecision(6) 

格式控制功能解析

fixed 和 setprecision(6) 是 C++ 中用于控制浮点数输出格式的操纵符(需包含 <iomanip> 头文件,而 #include<bits/stdc++.h> 已间接包含),二者组合使用的效果如下:

  • fixed:设置浮点数输出为「固定小数位数模式」,即强制以小数点后固定位数的形式显示数值(而非科学计数法或默认的有效数字模式)。
  • setprecision(6):在 fixed 模式下,setprecision(n) 表示保留 n 位小数(注意:若未使用 fixedsetprecision(n) 表示保留 n 位有效数字)。
代码中应用场景

在你的代码中,当 BMI ≥ 24 时,如果需要固定小数点后的位数,可以配合fixed使用

cout << fixed << setprecision(6) << bmi;
当使用 fixed<<setprecision(6) 时,输出的浮点数会保留 6 位小数,且对第 7 位小数进行四舍五入。例如:
  • 若 bmi = 25.6789123,输出结果为 25.678912(第7位小数3被舍去);
  • 若 bmi = 25.6789126,输出结果为 25.678913(第7位小数6进位,第6位小数2→3)。

这种组合会强制输出6位小数,即使末尾是0也会显示:

  • 输入:100 1.68
  • 输出:35.430800

常见问题解答

1. 为什么使用setprecision(6)而不是fixed

题目要求保留6位有效数字,而不是6位小数。setprecision单独使用控制的是有效数字位数,而fixed会固定小数位数,不符合题目要求。

2. 如何处理浮点数精度问题?

题目中数据范围较小(40≤m≤120,1.4≤h≤2.0),使用float类型足够。对于更大范围的数据,建议使用double类型提高精度。

3. 为什么输出结果会省略末尾的0?

这是setprecision的默认行为,它会自动去除无效的0,符合题目要求"不要输出后缀0"。

总结

这道题目主要考察:

  1. 基本的数学计算能力
  2. 条件判断语句的应用
  3. 格式化输出控制重点
  4. 对题目要求的准确理解

通过setprecision操作符,我们可以精确控制浮点数输出的有效数字位数,这在科学计算、金融应用等场景中非常重要。掌握C++的I/O流控制操作符(如setprecisionfixedscientific等)是提高代码输出质量的关键技能。

扩展:其他语言的实现

Python语言实现

m, h = map(float, input().split())
bmi = m / (h ** 2)

if bmi < 18.5:
    print("Underweight")
elif bmi < 24:
    print("Normal")
else:
    # 保留6位有效数字并去除末尾0
    print(f"{bmi:.6g}")
    print("Overweight")

更多推荐