# 教案：第19节 —— while循环

---

## 元信息

| 项目 | 内容 |
|------|------|
| **课程编号** | G1_第19节 |
| **GESP等级** | **一级**（GESP Python 一级考点） |
| **适用年龄** | 7-9 岁（零基础编程启蒙阶段） |
| **核心知识点** | while 基本语法、条件循环、计数器循环、死循环避免 |
| **记忆钩子** | "忘了更新 = 死循环，乌龟冲出屏幕！" |
| **身体锚点** | ① 初始值（握拳起跑） ② 条件（举手挡墙） ③ 更新（迈步向前） |

---

## 课程目标

1. **理解** for 和 while 的区别（知道次数 vs 知道条件）
2. **掌握** while 三要素：初始值、条件、更新
3. **识别** 死循环的成因（忘了更新条件变量）
4. **运用** while 循环控制 turtle 乌龟移动

---

## 五段式 60 分钟教学流程

---

### 第一段：导入（00:00 - 10:00）—— "回顾 for，引出 while"

#### 教师活动

| 时间 | 活动内容 | 教学方式 |
|------|---------|---------|
| 0-3min | 提问："上节课我们用 for 循环做了什么？" 回顾 for i in range(10) | 师生问答 |
| 3-6min | 写出 for 代码，问："如果不知道循环几次，只知道什么时候停，该怎么办？" | 情景设问 |
| 6-10min | while 比喻："while 就像蒙着眼睛走路，不知道要走多少步，但知道撞到墙就停" | 生活类比 |

#### 导入代码

```python
# for 循环：知道次数
for i in range(10):
    print(i, end=" ")

# while 循环：知道条件
i = 0
while i < 10:
    print(i, end=" ")
    i = i + 1
```

#### 身体锚点

> **【身体锚点 — 起跑】**
> 让学生全体起立，左手握拳放在胸口（初始值 = 0），右手前伸（条件检查），每说一个数字迈一步（更新）。
> "初始值 检查条件 迈步 再检查 再迈步……"
> 通过身体动作记住 while 三要素。

---

### 第二段：知识点精讲（10:00 - 30:00）

#### 2.1 while 语法结构（5min）

| 要素 | 代码 | 比喻 |
|------|------|------|
| ① 初始值 | count = 1 | 站在起跑线上 |
| ② 条件 | while count <= 5: | 终点线在前面 |
| ③ 更新 | count = count + 1 | 每跑一步靠近终点 |

**关键板书：**

```
while 循环结构：
+---------------------------+
|  ① 初始值（循环前）        |   count = 1
|  ② 条件（while后）         |   while count <= 5:
|  ③ 更新（循环体内）        |       count = count + 1
+---------------------------+
    缺一不可！
```

#### 2.2 while 执行流程拆解（5min）

```python
count = 1                  # ① 初始值
while count <= 5:          # ② 条件为 True 就进入循环体
    print("第", count, "次")
    count = count + 1      # ③ 更新，改变条件避免死循环
print("循环结束！")
```

**执行流程图：**

```
开始
  |
  v
设置 count = 1
  |
  v
+-> count <= 5 ? --False--> 结束，打印"循环结束！"
|       | True
|       v
|   执行循环体
|   更新 count
+--- 回到条件判断
```

#### 2.3 for vs while 对比（3min）

| 对比维度 | for 循环 | while 循环 |
|---------|---------|-----------|
| 适用场景 | 知道循环次数 | 知道循环条件 |
| 代码形式 | for i in range(n): | while 条件: |
| 循环变量 | 自动管理 | 手动管理 |
| 风险 | 较少出错 | 容易忘更新导致死循环 |

#### 2.4 死循环的成因与避免（7min）

**演示代码（安全版）：**

```python
count = 1
safe_limit = 0
while count <= 5:
    print("第", count, "次（模拟死循环）")
    # count = count + 1    注释掉！忘了更新！
    safe_limit = safe_limit + 1
    if safe_limit >= 10:
        print("安全阀触发！强制退出！")
        break
```

**死循环三特征：**
1. 循环条件永远为 True
2. 循环变量没有变化
3. 程序卡死，必须强制关闭

#### 身体锚点

> **【身体锚点 — 死循环】**
> 让学生原地踏步，但不允许移动位置（条件不更新）。
> 问："你在原地踏步，永远到不了终点——这就是死循环！"
> 然后让学生迈一步（更新），问："现在能到终点了，为什么？"

#### 记忆钩子

> **"忘了更新 = 死循环，乌龟冲出屏幕！"**
> while 三要素：初始值、条件、更新，缺一不可！

---

### 第三段：演示（30:00 - 40:00）—— "turtle 边界检测"

#### 演示 1：正常版，乌龟走到边界就停

```python
import turtle
t = turtle.Turtle()

x = 0                     # ① 初始值
while x < 200:            # ② 条件
    t.forward(10)
    x = t.xcor()          # ③ 更新，获取当前 x 坐标
t.write("到边界了！停！")
```

**关键讲解：**
- x = t.xcor() 是更新语句
- 每次循环乌龟前进 10 像素，更新 x 坐标
- 当 x >= 200 时，条件为 False，循环结束

#### 演示 2：while + if 组合，碰墙反弹

```python
dx = 5
x = 0
while -200 < x < 200:
    t.setx(t.xcor() + dx)
    x = t.xcor()
    if x >= 200:
        dx = -dx           # 碰右墙调头
    if x <= -200:
        dx = -dx           # 碰左墙调头
```

**教学要点：**
- while 条件可以写复杂表达式（范围判断）
- if 嵌套在 while 内部，实现边循环边判断
- 这是弹球游戏的核心逻辑

#### 演示 3：死循环演示（教师演示用，学生不操作）

> 警告：以下代码会卡死程序，仅教师演示！

```python
x = 0
while x < 200:
    t.forward(10)
    # x = t.xcor()    注释掉了！
    # 死循环！需要强制关闭窗口！
```

**现象展示：** 乌龟冲出屏幕，程序无法停止。

---

### 第四段：实操练习（40:00 - 55:00）

#### 练习 1：补全 while 走到边界（5min）

```
题目：补全代码，让乌龟从 x=0 走到 x=150 自动停止
提示：
  ① 初始值：x = 0
  ② 条件：while x < 150:
  ③ 更新：x = t.xcor()
```

**参考答案：**
```python
x = 0
while x < 150:
    t.forward(10)
    x = t.xcor()
```

#### 练习 2：while True + break 退出（5min）

```
题目：使用 while True + if/break 让乌龟走到 x=150 就停
```

**参考答案：**
```python
while True:
    t.forward(10)
    x = t.xcor()
    if x >= 150:
        break
```

#### 练习 3：倒数发射火箭（5min）

```
题目：从 5 倒数到 1，最后打印 "发射！"
```

**方式一：while 条件版**
```python
n = 5
while n > 0:
    print(n, "...")
    n = n - 1
print("发射！")
```

**方式二：while True + break 版**
```python
n = 5
while True:
    print(n, "...")
    n = n - 1
    if n <= 0:
        break
print("发射！")
```

#### 挑战拓展：自定义倒数

```python
start = 10           # 改成 10、20、100？
n = start
while n > 0:
    print(n, "...")
    n = n - 1
print(start, "到 1 发射！")
```

#### 教师巡场指导要点

| 常见错误 | 纠正方法 |
|---------|---------|
| 忘记写更新语句 | 提醒三要素缺一不可，指认代码中的更新行 |
| 条件写反（如 while x > 200） | 用数轴演示：x < 200 表示还没到 200 |
| 死循环不会中断 | 教学生按 Ctrl+C 或按 IDE 停止按钮 |
| 不理解 x = t.xcor() | 比喻：每次走一步，回头看看自己到哪了 |

---

### 第五段：小测（55:00 - 60:00）

#### 题目 1（选择）
while 循环的三要素是什么？
A. 初始值、条件、循环体
B. 初始值、条件、更新
C. 循环体、条件、break
D. 初始值、break、更新

**答案：B**

#### 题目 2（选择）
以下代码会怎样？
```python
count = 1
while count <= 5:
    print("第", count, "次")
```
A. 打印 5 次后正常结束
B. 打印 1 次后结束
C. 死循环，一直打印
D. 直接报错

**答案：C**（忘了更新 count，死循环）

#### 题目 3（判断）
while True 本身是一个死循环，必须搭配 break 才能退出。

**答案：对**

#### 题目 4（填空）
补全代码：循环打印 1 到 5
```python
n = 1
while ____ <= 5:
    print(n)
    ____
```
**答案：** n, n = n + 1

#### 题目 5（简答）
"忘了更新条件会怎样？"

**参考答案：** 死循环！条件永远为真，程序卡死，需要强制关闭。

---

## 板书设计

```
+---------------------------------------------------+
|           第19节  while循环                         |
+---------------------------------------------------+

  while 三要素：
  ① 初始值（起点）    count = 1
  ② 条件（终点）      while count <= 5:
  ③ 更新（迈步）      count = count + 1

  忘了更新 = 死循环！

  for（知道次数） vs  while（知道条件）
  for i in range(5)    while x < 200:

  记忆钩子：
  "忘了更新 = 死循环，乌龟冲出屏幕！"
---

## 课后延伸

| 项目 | 内容 |
|------|------|
| 课后练习 | 课后练习_第19节.md |
| 预习内容 | 第19节 for 循环进阶 |
| 拓展挑战 | 尝试用 while 画一个正方形 |
| 家长沟通 | 今天学了 while 循环，注意区分 for 和 while 的使用场景 |

---

## 教学反思

| 维度 | 记录 |
|------|------|
| 学生掌握率 | 预计 80% 学生能独立写出基本 while 循环 |
| 常见困惑 | 初始值和更新的位置容易混淆 |
| 改进方向 | 增加忘记更新的互动演示，加深死循环印象 |
| 备注 | 死循环演示需控制课堂节奏，避免学生模仿 |
```
