# 第1阶段·第03节教案 —— 画正方形
> **GESP等级：一级 | 考级考点：GESP Python 一级**


| 课程信息 | 内容 |
|---------|------|
| 授课主题 | 画正方形 |
| 适用对象 | 少儿编程零基础（8-12岁） |
| 课时长度 | 60分钟 |
| 教学形式 | 5段式（导入→知识点→演示→实操→小测） |
| GESP对标 | #5顺序执行 #12算术 #语法错误 #运行时异常 |

---

## 教学目标

| 目标类型 | 具体目标 |
|---------|---------|
| 知识与技能 | ①理解正方形绘制逻辑（4次循环的 forward+right）②能区分语法错误与运行时异常③能独立编写正方形、长方形、三角形绘制代码 |
| 过程与方法 | 通过"身体走正方形"建立指令序列的肌肉记忆；通过"故意犯错"培养自主调试意识 |
| 情感态度 | 接纳错误是学习的一部分——"error=乌龟告诉你它听不懂" |

---

## 教学准备

| 项目 | 准备内容 |
|-----|---------|
| 软件 | Python IDLE 或 Thonny（已安装 turtle 模块） |
| 文件 | 新建 `画正方形.py`（空白文件） |
| 教具 | 白板/大屏（画坐标轴标注方向）、正方形折纸教具（边长150mm） |
| 预习 | 无（本节为全新知识点） |

---

## 教学过程（60分钟）

### 第1段：导入 — 从走路到画图（00:00-10:00）

#### 教师活动

**Step 1：回顾旧知（2 min）**

> "上节课我们让乌龟直走了100步，前进的指令是什么？——对，`forward(100)`。"
> "那想让乌龟往右转，用什么指令？——`right(90)`。好记性！"

教师在大屏打开 IDLE，快速回顾两条指令（不运行，仅口述+板书）：

```
forward(100)   → 乌龟直走100步
right(90)      → 乌龟右转90度
```

**Step 2：情境问题（3 min）**

教师展示一张"小乌龟站在空地前"的图片（或板书简笔画）。

> "这只乌龟想去散步，它想走一条正方形的路——从起点出发，走完四条边，回到原点。"
> "我们先来看老师用身体走一遍，你们来喊指令。"

**Step 3：身体锚点活动（5 min）**

教师邀请一名学生上台，两人配合演示"身体走正方形"：

1. 教师站在教室中央："现在我是小乌龟。你来给我发指令，让我走一个正方形。"
2. 学生需要喊出：`forward` → 走一步 → `right(90)` → 右转
3. 重复4次，回到原点。

> "发现了没有？我做了4次一样的事：**前进→右转→前进→右转……4次**。这就是正方形！"
> "那今天我们就来教乌龟画正方形。画好了正方形，我们就能画房子、画窗户、画很多东西了！"

**板书**（保留到课堂结束）：

```
正方形 = 前进一步 + 右转90度，重复4次
```

---

### 第2段：知识点 — 理解正方形与错误（10:00-30:00）

#### 2.1 正方形绘制逻辑（5 min）

**分解黑箱**：教师展示一个"黑箱"——一个画好的正方形，问：

> "乌龟要画出这个正方形，需要做几个动作？"

引导学生按顺序说：

```
① forward(150)    → 画第一条边
② right(90)       → 转第一个弯
③ forward(150)    → 画第二条边
④ right(90)       → 转第二个弯
⑤ forward(150)    → 画第三条边
⑥ right(90)       → 转第三个弯
⑦ forward(150)    → 画第四条边
⑧ right(90)       → 转第四个弯（回到了起点）
```

教师强调：

> "这里有一个很重要的数学秘密：**正方形的内角是90°**。如果角度错了，正方形就画不成了。"
> "150是边长，可以改成100、200，数值越大边越长。90是转角，不能改——至少画正方形不能改。"

**从8行到4行（选讲，为后续循环做铺垫）：**

> "你们有没有发现，这8行代码其实是在重复做同一件事？数学好的同学可以想一想，将来我们怎么只用4行代码完成这个任务。"

（不展开讲循环，仅埋下伏笔。）

#### 2.2 参数理解（5 min）

教师在大屏上写出：

```python
forward(150)
right(90)
```

> "括号里的数字叫做**参数**。参数就是告诉乌龟'做多少'或者'怎么做'。"
> "`forward(150)` 中的150是告诉乌龟走150步；`right(90)`中的90是告诉乌龟转90度。"
> "可以把参数想象成我们给乌龟的'数字指令'。参数变了，效果就变。"

**互动提问：**

> "如果我写 `forward(50)`，乌龟走的边是长了还是短了？——短了。50比150小。"
> "如果我写 `right(45)`，正方形还会闭合吗？——不会。我们待会儿会试一下。"

#### 2.3 语法错误 — NameError（5 min）

> "现在我们要学一件非常重要的事——**看错误信息**。写代码不可能一次写对，关键是能看懂乌龟在抱怨什么。"

教师在白板上写出错误案例：

```python
forwad(150)       # 拼写错误：forward 写成了 forwad
right(90)
```

> "运行之后，乌龟会说什么？看好了——"

教师在 IDLE 中实际演示（或展示截图）：

```
NameError: name 'forwad' is not defined
```

> "**NameError** 错误的意思是：乌龟不认识这个词。就像你用英语对一个中国人说'book'，他听不懂一样。"
> "乌龟说：'我不认识 forwad 这个词，你是不是拼错了？'"
> "解决方案：对照正确拼写 `forward` 一字母一字母检查。"

**记忆钩子**：

> "**error=乌龟告诉你它听不懂**。error 不是坏事，是乌龟在帮你找问题。"

#### 2.4 运行时异常 — TypeError（5 min）

教师写出：

```python
forward("一百五十")   # 参数写了汉字
right(90)
```

> "这次乌龟认识 `forward`，但括号里写了一百五十——猜猜乌龟会说什么？"

演示运行：

```
TypeError: forward() argument must be int or float, not str
```

> "**TypeError** 的意思是：参数类型不对。forward 只认识数字（整数或小数），你给它一个汉字字符串，它不知道怎么走。"
> "就像你让同学'往前走'，同学知道怎么走；但你让同学'往前走快乐'——快乐是什么？没法执行。"

**对比总结（板书表格）：**

| 错误类型 | 触发原因 | 乌龟怎么说 |
|---------|---------|-----------|
| NameError | 命令拼错了 | "我不认识这个词" |
| TypeError | 参数写错了（类型） | "你给我的是类型不对的东西" |

> "记住：**NameError=拼写问题，TypeError=参数问题**。这是你们以后最常遇到的两个错误。"

---

### 第3段：演示 — 一行一行敲，一个错误一个错（30:00-40:00）

#### 3.1 逐行敲代码（8 min）

教师打开 Thonny/IDLE，新建文件 `画正方形.py`，**逐行输入**（学生看大屏一起读）：

```python
from turtle import *

forward(150)     # 走第一条边
right(90)        # 转第一个弯
forward(150)     # 走第二条边
right(90)        # 转第二个弯
forward(150)     # 走第三条边
right(90)        # 转第三个弯
forward(150)     # 走第四条边
right(90)        # 转第四个弯

done()
```

**每输入一行，教师口述该行动作：**

> "第一行，`from turtle import *`——把乌龟请出来。"
> "第二行，`forward(150)`——走150步，画出一条边。"
> "第三行，`right(90)`——右转90度，准备画下一条边。"
> "第四到第九行——重复上面的动作。"
> "第十行，`done()`——告诉乌龟画完了，让它保持画面不要关。"

#### 3.2 F5运行（1 min）

按下 F5 运行。

> "看！乌龟走出了一个正方形！四条边一样长，回到了原点——漂亮！"

**提问**：

> "最后一条边画完，乌龟为什么没有继续往前走？——因为最后还有一个`right(90)`，让它转向了起点方向。"

#### 3.3 故意犯错·认识报错（1 min）

教师修改代码：将第二行的 `forward(150)` 改为 `forwad(150)`（少写一个r）。

```python
from turtle import *
forwad(150)          # 故意写错
right(90)
# ... 其余不变
```

按 F5 运行。

> "瞪大眼睛看——红色字出来了！"

屏幕上出现红字报错，教师**放慢语速、指向屏幕**逐字念：

```
NameError: name 'forwad' is not defined
```

> "看见了吗？乌龟在报错的地方画了一条下划线，明确指出是 `forwad` 有问题。"
> "这个错误信息会告诉我们是第几行错的——虽然这里只有一行代码，大程序里这个信息至关重要。"

**错误处理三步法（板书）：**

```
① 读报错信息  → 找到错误类型（NameError / TypeError）
② 看哪一行     → 找到出错行号
③ 检查拼写/参数 → 修正
```

教师修正代码（`forwad`→`forward`），再次 F5 确认正方形正常。

---

### 第4段：实操 — 三道阶梯任务（40:00-55:00）

#### 任务1：填空补全正方形（5 min）

**要求**：学生打开 IDLE，补全下面代码中的空格。

```python
from turtle import *

forward(150)
______(90)       # 填空①：转弯指令
forward(___ )    # 填空②：边长（和上面保持一致）
right(___ )      # 填空③：角度
________(150)    # 填空④：前进指令
right(90)
forward(150)
right(90)

done()
```

**预期答案**：① `right`  ② `150`  ③ `90`  ④ `forward`

**巡查要点**：
- `forward` 拼写是否完整（多/少字母）
- 参数是否写数字而非文字
- 所有 right 的角度是否都是 `90`

---

#### 任务2：画长方形（8 min）

> "正方形四条边一样长，长方形呢？——对边相等，邻边不相等。"
> "我们需要长边200步，短边100步。"

**要求**：学生自己写出画长方形的代码。

**参考代码**：

```python
from turtle import *

forward(200)     # 长边
right(90)
forward(100)     # 短边
right(90)
forward(200)     # 长边
right(90)
forward(100)     # 短边
right(90)

done()
```

**教师引导**：

> "和正方形对比一下——哪里变了？——边长。哪里没变？——转角还是90度，还是转4次。"（强调：所有矩形角都是90°）

**易错点**：
- 学生可能写 forward(200) 四次——变成大正方形而非长方形（此时引导观察图形：长方形要有长边和短边各两次）

---

#### 任务3：画三角形（7 min）

> "正方形转4次回到起点，三角形转几次？请开动脑筋想一想。"

教师画一个等边三角形在白板上，标注三个角。

> "三角形的三个角加起来是180度，每个角60度。但乌龟的转角是**外角**——也就是180-60=120度。"
> "所以画三角形的公式是：**前进 + right(120)，重复3次**。"

**要求**：学生写出画等边三角形的代码。

**参考代码**：

```python
from turtle import *

forward(150)
right(120)
forward(150)
right(120)
forward(150)
right(120)

done()
```

**对比引导**：

| 图形 | 重复次数 | 单次动作 | 转角 |
|-----|---------|---------|------|
| 正方形 | 4次 | forward + right | 90° |
| 长方形 | 4次 | forward + right | 90° |
| 三角形 | 3次 | forward + right | 120° |

> "大家发现规律了吗？**正方形的外角是360÷4=90°，三角形的外角是360÷3=120°**。"
> "如果是五边形呢？——360÷5=72°！这个规律以后会非常有用。"

---

### 第5段：小测与总结（55:00-60:00）

#### 课堂小测（口答，3 min）

教师逐一提问，学生举手抢答或集体回答：

| 序号 | 问题 | 答案 |
|-----|------|------|
| ① | 画正方形需要几条 `forward`？ | 4条 |
| ② | 画正方形的转角是多少度？ | 90° |
| ③ | 画三角形的转角是多少度？ | 120° |
| ④ | 把 `forward` 写成 `forwad` 会报什么错？ | NameError |
| ⑤ | 把 `right(90)` 写成 `right("九十")` 会报什么错？ | TypeError |
| ⑥ | 画三角形的三条边长必须一样吗？ | 等边三角形必须一样（引导学生：也可以不一样，那是任意三角形） |

#### 错误回顾与"悟"（2 min）

**回顾故意犯错的环节**：

> "刚才老师把转角写成60°的时候，正方形不闭合了对不对？"
> "然后就有同学喊'不对不对，要90°'——对！你发现错误了！"
> "记住：**正方形必须90°**。如果你画出来的图形没闭合，第一件事就是检查转角。"

**记忆钩子回顾**：

> "正方形=4条边，每条边=forward+right90。"
> "error不是失败，是乌龟在帮你。它说'我不认识'，你就去改拼写；它说'类型不对'，你就去改参数。"

#### 优秀作业展示与预告（1 min）

展示1-2名学生的长方形和三角形作品（通过大屏或投影）。

> "今天的作品发到家长群/班级相册。下节课我们要学一个让代码变短的魔法——`for` 循环，让4条边的代码变成1行！"

#### 布置课后挑战（选做）

> "回家可以试试：用turtle画一个**五边形**。提示：360÷5=72°。"
> "画完了发给老师，下节课我们来看。"

---

## 身体锚点·课堂活动卡

| 活动名称 | 时长 | 动作要领 | 教学目的 |
|---------|------|---------|---------|
| 身体走正方形 | 5min（导入段） | 学生当"乌龟"，喊forward→走→right(90)→转，重复4次 | 建立"重复4次动作"的肌肉记忆 |
| 错误警报操 | 3min（演示段结束时） | NameError→双手↑喊"不认识！"；TypeError→双手→←喊"不对！" | 用身体动作记忆两种错误类型 |

---

## 教学反思（教后填写）

| 维度 | 观察记录 |
|-----|---------|
| 学生是否理解正方形绘图逻辑？ | |
| 填空任务完成率 | |
| 长方形/三角形自主编写完成率 | |
| 学生对报错信息的恐惧程度（无/轻微/较大） | |
| 时间控制是否合理 | |

---

## 附录：完整参考代码

### 正方形

```python
from turtle import *

forward(150)
right(90)
forward(150)
right(90)
forward(150)
right(90)
forward(150)
right(90)

done()
```

### 长方形

```python
from turtle import *

forward(200)
right(90)
forward(100)
right(90)
forward(200)
right(90)
forward(100)
right(90)

done()
```

### 三角形

```python
from turtle import *

forward(150)
right(120)
forward(150)
right(120)
forward(150)
right(120)

done()
```
