BMI指数计算题解——C++格式控制输出精讲(洛谷P5714)
·
题目描述
编写程序计算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 位小数(注意:若未使用fixed,setprecision(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"。
总结
这道题目主要考察:
- 基本的数学计算能力
- 条件判断语句的应用
- 格式化输出控制(重点)
- 对题目要求的准确理解
通过setprecision操作符,我们可以精确控制浮点数输出的有效数字位数,这在科学计算、金融应用等场景中非常重要。掌握C++的I/O流控制操作符(如setprecision、fixed、scientific等)是提高代码输出质量的关键技能。
扩展:其他语言的实现
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")
更多推荐


所有评论(0)