计算BMI并判断体重状况 需要输入一个人的身高(单位为厘米)和体重(单位为千克)。根据输入的身高和体重计算出这个人的BMI值(体重除以身高的平方,身高需先转换为米)。然后,根据计算出的BMI值判断这个人的体重状况。体重状况分为偏瘦(BMI<18.5)、正常(18.5<=BMI<24)、超重(24<=BMI<28)和肥胖(BMI>=28)。示例输出:22.49134948096886 正常。《BMI计算与体重状况判断》教学设计
一、教学目标
1. 知识与技能
- 掌握Python基本输入输出函数(`input()`、`print()`)
- 掌握数据类型转换(`int()`、`float()`)
- 掌握算术运算符的使用(`+`、`-`、`*`、`/`、`**`)
- 掌握条件判断语句(`if-elif-else`)
- 掌握`map()`函数的使用方法
2. 过程与方法
- 能够分析问题,将数学公式转化为程序代码
- 能够使用条件分支解决多分类问题
- 能够调试和运行Python程序
3. 情感态度与价值观
- 了解BMI指数的健康意义
- 培养健康生活意识
- 体验编程解决实际问题的乐趣
二、教学重难点
教学重点
| 1 | 输入数据的接收与转换 | 使用`input()`接收字符串,用`int()`转为数值 |
| 2 | BMI计算公式实现 | `体重 / (身高/100)²` 的正确表达 |
| 3 | 多分支条件判断 | `if-elif-else`的结构和使用 |
教学难点
| 1 | 身高单位转换 | 厘米→米的转换(除以100) |
| 2 | 条件判断的顺序 | 多个条件的逻辑关系与顺序安排 |
| 3 | `map()`函数的理解 | 对输入数据的批量类型转换 |
三、主要知识点
知识点1:输入输出函数
# 输入函数变量 = input("提示信息") # 返回字符串类型
# 输出函数print(内容1, 内容2, ...) # 多个内容用空格分隔print(内容1, 内容2, sep='') # 指定分隔符
name = input("请输入姓名:")print("你好,", name)
知识点2:数据类型转换```python
int(字符串) # 字符串→整数
float(字符串) # 字符串→浮点数
str(数值) # 数值→字符串
**示例:**
a = int("123") # a = 123b = float("45.6") # b = 45.6
知识点3:map()函数
python
# 语法:map(函数, 可迭代对象)
a, b = map(int, input().split())
**执行过程:**
输入:170 65
步骤1: input() → "170 65"
步骤2: .split() → ["170", "65"]
步骤3: map(int, ["170", "65"]) → 将每个元素转为整数
步骤4: 赋值 → height_cm=170, weight=65
知识点4:算术运算符
| 运算符 | 功能 | 示例 | 结果 |
|--------|------|------|------|
| `+` | 加法 | `3 + 2` | `5` |
| `-` | 减法 | `5 - 2` | `3` |
| `*` | 乘法 | `3 * 4` | `12` |
| `/` | 除法(浮点) | `10 / 3` | `3.333...` |
| `**` | 幂运算 | `2 ** 3` | `8` |
| `%` | 取余 | `10 % 3` | `1` |
**BMI计算示例:**
height_m = height_cm / 100 # 单位转换bmi = weight / (height_m ** 2) # BMI公式
知识点5:条件判断语句
python
if 条件1:
执行语句1
elif 条件2:
执行语句2
elif 条件3:
执行语句3
else:
执行语句4
执行流程图:
```
开始
↓
判断条件1? → 是 → 执行语句1 → 结束
↓ 否
判断条件2? → 是 → 执行语句2 → 结束
↓ 否
判断条件3? → 是 → 执行语句3 → 结束
↓ 否
执行语句4
↓
结束
四、重点知识解析
解析1:身高单位转换
**问题:** 为什么要把厘米转换为米?
**答:** BMI的国际标准单位是kg/m²,所以:
- 身高170厘米 = 1.7米
- 转换公式:`身高(米) = 身高(厘米) / 100`
**代码实现:**
height_m = height_cm / 100
解析2:BMI计算公式
**数学公式:**
$$BMI = \frac{体重(kg)}{身高(m)^2}$$
**Python实现:**
```python
# 方法1:使用 **
bmi = weight / (height_m ** 2)
# 方法2:使用乘法
bmi = weight / (height_m * height_m)
# 方法3:使用pow()函数
bmi = weight / pow(height_m, 2)
```
**注意:** 括号不能省略,否则会先计算 `weight / height_m` 再平方,结果错误!
解析3:多分支判断顺序
**判断标准:**
| 范围 | 状态 |
|------|------|
| BMI < 18.5 | 偏瘦 |
| 18.5 ≤ BMI < 24 | 正常 |
| 24 ≤ BMI < 28 | 超重 |
| BMI ≥ 28 | 肥胖 |
**代码逻辑:**
```python
if bmi < 18.5: # 先判断最小范围
status = "偏瘦"
elif bmi < 24: # 隐含 bmi >= 18.5
status = "正常"
elif bmi < 28: # 隐含 bmi >= 24
status = "超重"
else: # 隐含 bmi >= 28
status = "肥胖"
**为什么这样写?**
- `elif`隐含了上一个条件的否定
- 顺序从小到大,逻辑清晰
- 避免重复判断边界值
**常见错误写法:**
```python
# 错误1:顺序颠倒
if bmi >= 28:
status = "肥胖"
elif bmi < 18.5: # 这个条件永远不会执行
status = "偏瘦"
# 错误2:条件重复
if bmi < 18.5:
status = "偏瘦"
if bmi >= 18.5 and bmi < 24: # 可以,但冗余
status = "正常"
解析4:输出格式控制
**示例要求:** `22.49134948096886 正常`
**实现方式:**
```python
# 方式1:默认空格分隔
print(bmi, status) # 输出:22.491... 正常
# 方式2:手动添加空格
print(str(bmi) + " " + status)
# 方式3:格式化输出
print(f"{bmi} {status}")
**注意:** 如果是 `22.491...正常`(无空格),使用:
```python
print(bmi, status, sep='')
六、程序完整讲解
完整代码
# 步骤1:输入数据height_cm, weight = map(int, input().split())# 步骤2:身高单位转换(厘米→米)height_m = height_cm / 100# 步骤3:计算BMI值bmi = weight / (height_m ** 2)# 步骤4:根据BMI值判断体重状况if bmi < 18.5: status = "偏瘦"elif bmi < 24: status = "正常"elif bmi < 28: status = "超重"else: status = "肥胖"# 步骤5:输出结果print(bmi, status)
程序执行过程演示
**以输入 `170 65` 为例:**
| 步骤 | 代码 | 变量值 | 说明 |
|------|------|--------|------|
| 1 | `input().split()` | `["170", "65"]` | 接收输入并分割 |
| 2 | `map(int, ...)` | `170, 65` | 转为整数 |
| 3 | `height_cm / 100` | `1.7` | 170cm → 1.7m |
| 4 | `weight / (height_m ** 2)` | `22.491...` | 65 ÷ 1.7² |
| 5 | `if bmi < 18.5` | `False` | 22.49 ≥ 18.5 |
| 6 | `elif bmi < 24` | `True` | 22.49 < 24 |
| 7 | `status = "正常"` | `"正常"` | 赋值状态 |
| 8 | `print(bmi, status)` | 输出结果 | 显示结果 |
程序运行测试
python
# 测试用例1:正常
输入:170 65
输出:22.49134948096886 正常
# 测试用例2:偏瘦
输入:160 45
输出:17.578125 偏瘦
# 测试用例3:超重
输入:170 75
输出:25.951557093425605 超重
# 测试用例4:肥胖
输入:170 90
输出:31.14186851211073 肥胖
# 测试用例5:边界值
输入:170 53.5 # BMI ≈ 18.5
输出:18.5121107266436 正常
七、常见错误与调试
错误1:忘记类型转换
```python
# 错误
height_cm, weight = input().split()
bmi = weight / (height_cm ** 2) # TypeError: 字符串不能运算
# 正确
height_cm, weight = map(int, input().split())
错误2:单位忘记转换
```python
# 错误
bmi = weight / (height_cm ** 2) # 结果会很小(0.022...)
# 正确
height_m = height_cm / 100
bmi = weight / (height_m ** 2)
错误3:条件判断顺序错误
```python
# 错误
if bmi < 24:
status = "正常"
elif bmi < 18.5: # 这个条件永远不会执行
status = "偏瘦"
# 正确
if bmi < 18.5:
status = "偏瘦"
elif bmi < 24:
status = "正常"
错误4:括号使用错误
```python
# 错误
bmi = weight / height_m ** 2 # 等价于 (weight / height_m) ** 2
# 正确
bmi = weight / (height_m ** 2)
八、课后作业
基础题(必做)
**题目1:** 编写程序,输入身高和体重,输出BMI值和体重状况。
```python
# 测试数据
输入:175 70
输出:22.857142857142858 正常
**题目2:** 修改程序,使输出保留两位小数。
```python
# 提示:使用格式化输出
print(f"{bmi:.2f} {status}")
# 输入:170 65
# 输出:22.49 正常
**题目3:** 添加输入提示信息。
```python
height_cm = int(input("请输入身高(厘米):"))
weight = int(input("请输入体重(千克):"))
提高题(选做)
**题目4:** 同时支持空格分隔和连续输入两种格式。
```python
# 输入格式1:170 65(空格分隔)
# 输入格式2:17065(连续输入)
# 两种都能正确计算
**题目5:** 增加健壮性,处理异常输入。
```python
# 要求:
# 1. 如果输入的不是数字,提示"输入错误"
# 2. 如果身高或体重为负数,提示"数据不合法"
# 3. 如果输入数据不足两个,提示"请输入两个数值"
拓展题(挑战)
**题目6:** 增加健康建议功能。
python
# 输出示例:
BMI = 22.49 正常
建议:继续保持良好的饮食和运动习惯!
# 不同状态的建议:
偏瘦 → "建议增加营养摄入,适当进行力量训练。"
正常 → "继续保持良好的饮食和运动习惯!"
超重 → "建议控制饮食,增加有氧运动。"
肥胖 → "建议咨询医生,制定科学减重计划。"
**题目7:** 实现多人BMI统计。
```python
# 要求:
# 1. 可以连续输入多人的数据
# 2. 输入"end"结束
# 3. 统计并输出:
# - 总人数
# - 各状态人数
# - 平均BMI值
九、拓展延伸
拓展1:BMI标准的国际差异
| 地区 | 偏瘦 | 正常 | 超重 | 肥胖 |
|------|------|------|------|------|
| 中国标准 | <18.5 | 18.5-23.9 | 24-27.9 | ≥28 |
| WHO标准 | <18.5 | 18.5-24.9 | 25-29.9 | ≥30 |
| 亚洲标准 | <18.5 | 18.5-22.9 | 23-24.9 | ≥25 |
**拓展练习:** 修改程序,支持选择不同标准。
```python
标准 = input("请选择标准(中国/WHO/亚洲):")
if 标准 == "中国":
# 使用中国标准
elif 标准 == "WHO":
# 使用WHO标准
else:
# 使用亚洲标准
拓展2:可视化BMI分布
```python
import matplotlib.pyplot as plt
# 绘制BMI分类区间图
zones = [(0, 18.5, '偏瘦'), (18.5, 24, '正常'),
(24, 28, '超重'), (28, 40, '肥胖')]
# ... 绘图代码
拓展3:数据持久化
```python
# 将BMI计算结果保存到文件
with open("bmi_record.txt", "a", encoding="utf-8") as f:
f.write(f"{日期} 身高:{height_cm}cm 体重:{weight}kg BMI:{bmi:.2f} {status}\n")
拓展4:BMI与健康的关系
**BMI的局限性:**
1. 不区分肌肉和脂肪(运动员可能BMI偏高但体脂正常)
2. 不反映脂肪分布(腹部脂肪危害更大)
3. 不适用于儿童、孕妇、老年人
**其他健康指标:**
- 体脂率
- 腰围
- 腰臀比
- 内脏脂肪等级
**拓展练习:** 结合腰围指标,给出更全面的健康评估。
十、教学反思
本节课收获
1. 学生掌握了`input()`、`print()`的基本使用
2. 学生理解了数据类型转换的重要性
3. 学生学会了`if-elif-else`多分支判断
4. 学生能将数学公式转化为程序代码