> **GESP等级：四级 | 考级考点：GESP Python 四级**

# 第20节 GESP真题实战 — 教案

---

## 一、课程概览

| 项目 | 内容 |
|------|------|
| 课程名称 | GESP真题实战 |
| 课时长度 | 60分钟 |
| 教学形式 | 讲解 + 演示 + 动手编程 |
| 前置知识 | 已学完枚举、模拟、排序、递推四大算法 |

---

## 二、教学目标

### 知识与技能
1. 掌握用枚举法解决"完全平方数"类问题
2. 掌握用模拟法解决"小猫分鱼"类过程模拟问题
3. 掌握用排序算法对图形化数据进行排序
4. 掌握用递推思想解决斐波那契数列、爬楼梯问题

### 过程与方法
1. 通过turtle可视化，把抽象的算法过程变成看得见的图形
2. 学会从题目描述中提取关键信息，选择合适的算法
3. 培养调试代码的能力，学会用print和turtle双重验证

### 情感态度价值观
1. 感受算法在解决实际问题中的力量
2. 培养面对难题不放弃的编程精神
3. 通过可视化获得即时反馈，增强学习信心

---

## 三、教学重点与难点

| 类型 | 内容 |
|------|------|
| 教学重点 | 四种算法（枚举、模拟、排序、递推）在真题中的实际应用 |
| 教学难点 | 将题目转化为算法模型；turtle可视化与算法逻辑的融合 |
| 突破方法 | 先用小例子讲透算法原理，再迁移到真题；画流程图辅助理解 |

---

## 四、教学准备

### 教师准备
- 课件PPT（含真题原题展示）
- 每道题的流程图（提前画好）
- 完整的代码示例（本节课四个核心程序）
- 备用程序：万一学生电脑turtle卡顿，准备纯命令行版本

### 学生准备
- Python环境（IDLE或Thonny）
- 已学过的代码笔记
- 草稿纸和笔（画流程图用）

---

## 五、教学流程总览（5段式）

| 阶段 | 时间 | 活动名称 | 核心内容 |
|------|------|----------|----------|
| 第一段 | 5分钟 | 导入 | GESP考试简介 + 本节课的"闯关地图" |
| 第二段 | 25分钟 | 新课讲解 | 4道真题逐题讲解（6分钟/题） |
| 第三段 | 20分钟 | 动手实践 | 学生自己写代码 + 教师巡回指导 |
| 第四段 | 5分钟 | 巩固拓展 | 变形题挑战 + 优秀作品展示 |
| 第五段 | 5分钟 | 课堂小结 | 知识点回顾 + 算法选择口诀 |

---

## 六、详细教学流程

---

### 第一段：导入（5分钟）

#### 1. 什么是GESP？（2分钟）

老师问：
"小朋友们，你们知道GESP是什么吗？"

学生猜一猜。

老师揭晓：
"GESP就是编程等级考试，就像打游戏闯关一样！
- 一级二级是新手村
- 三级四级就进入高手区啦！
- 今天我们做的就是三级和四级的真题！

今天的课堂就是一场游戏闯关，我们要闯过4个大关卡！"

#### 2. 闯关地图展示（3分钟）

在黑板上或PPT上展示：

第1关：枚举法 —— 完全平方数找找找
第2关：模拟法 —— 小猫分鱼算算算
第3关：排序法 —— 图形大小排排队
第4关：递推法 —— 螺旋楼梯爬爬爬

"每闯过一关，我们的编程能力就会升级一次！
全部闯关成功，你就是GESP小达人！"

---

### 第二段：新课讲解（25分钟）

---

#### 关卡1：枚举法真题 —— 完全平方数（6分钟）

##### 题目展示

**GESP三级真题**：
"找出 1 到 1000 之间所有的完全平方数。
完全平方数是指：一个数能写成另一个整数的平方。
例如：1 = 1x1，4 = 2x2，9 = 3x3，16 = 4x4……
请输出所有符合条件的数，并统计有多少个。"

##### 算法分析（2分钟）

老师用生活中的例子解释：

"想象一下，你有一个大盒子，里面有1到1000的数字卡片。
你要选出那些能摆成正方形的数字！

- 1颗糖：可以摆成1x1的正方形
- 2颗糖：摆不成正方形
- 3颗糖：摆不成正方形
- 4颗糖：可以摆成2x2的正方形

怎么找呢？最笨但最可靠的方法——枚举法！

就是挨个检查每个数：
'你是完全平方数吗？ 是就记下来！ 不是就下一个！'"

##### 流程图（板书）

开始
  |
  v
数从1到1000
  |
  v
计算平方根 -> 判断是不是整数
  |               |
  v               v
是整数          不是整数
  |               |
  v               v
记下来          不管它
  |
  v
输出所有找到的数
  |
  v
结束

##### 关键代码解读（2分钟）

```python
import math
import turtle

t = turtle.Turtle()
t.speed(3)

count = 0
x = -300

for n in range(1, 1001):
    root = math.sqrt(n)
    if root == int(root):
        count += 1
        t.write(n, font=("Arial", 12, "normal"))
        t.forward(40)
        if count % 10 == 0:
            t.backward(400)
            t.right(90)
            t.forward(30)
            t.left(90)

print(f"一共找到了{count}个完全平方数！")
```

**核心技巧**：root == int(root) 这一行就是"判断是不是整数"的魔法钥匙！

##### 小测试（1分钟）

问："1到1000之间有几个完全平方数？"
提示：31x31=961，32x32=1024大于1000
答案：31个（从1的平方到31的平方）

---

#### 关卡2：模拟法真题 —— 小猫分鱼（6分钟）

##### 题目展示

**GESP四级真题**：
"海滩上有一些鱼，小猫第一天吃掉一半加1条，
第二天又吃掉剩下的一半加1条，
到第5天吃完后只剩1条。
请问一开始有多少条鱼？"

##### 算法分析（2分钟）

老师讲故事：

"有一只小馋猫，它在海边发现了一堆鱼

第一天：'哇！好多鱼！' 吃掉一半，觉得不够，又多吃1条
第二天：'还有这么多！' 又吃掉剩下的一半，再多1条
……
第五天：吃完后一看，只剩1条鱼了

问：一开始最少有多少条鱼？

这个题我们如果用顺着想的方法，不知道一开始有多少，很难算。
但是！如果我们倒着想呢？"

##### 逆向思维（板书）

第5天吃完后：1条
往回推：
第5天吃之前有 (1+1)x2 = 4条
第4天吃之前有 (4+1)x2 = 10条
第3天吃之前有 (10+1)x2 = 22条
第2天吃之前有 (22+1)x2 = 46条
第1天吃之前有 (46+1)x2 = 94条

答案：一开始有94条鱼！

##### 模拟过程可视化（2分钟）

老师用turtle画出每一天鱼的数量变化：

```python
import turtle

t = turtle.Turtle()
t.speed(1)

fish = 1
for day in range(5, 0, -1):
    fish = (fish + 1) * 2
    t.write(f"第{day}天开始: {fish}条",
            font=("Arial", 14, "normal"))
    t.backward(100)
    t.right(90)
    t.forward(40)
    t.left(90)
```

**核心技巧**：顺推不会就试试逆推！这是模拟法的精髓！

##### 模拟法口诀（1分钟）

题目过程好复杂，
一步一步模拟它。
顺着不行就倒推，
电脑帮你算到㞎！

---

#### 关卡3：排序应用 —— 图形大小排排队（6分钟）

##### 题目展示

"用turtle画出5个大小不同的正方形，
然后用排序算法把它们按面积从小到大排列，
并在每个正方形下面标出面积。"

##### 算法分析（2分钟）

老师问：
"如果我们画了5个大小不同的正方形，它们乱糟糟地摆在屏幕上。
怎么让它们按从小到大的顺序排好队呢？"

学生回答（可能有各种想法）

老师引导：
"这就用到我们学过的排序算法啦！
今天我们用选择排序——每次选最小的那个放到前面！"

##### 选择排序可视化流程

原始： [ 面积64, 面积25, 面积100, 面积9, 面积49 ]

第1轮： 找最小(9) 和第一个交换
        [ 面积9, 面积25, 面积100, 面积64, 面积49 ]

第2轮： 在剩下的里面找最小(25) 已经在第二位
        [ 面积9, 面积25, 面积100, 面积64, 面积49 ]

第3轮： 找最小(49) 和第三位交换
        [ 面积9, 面积25, 面积49, 面积64, 面积100 ]

第4轮： 找最小(64) 已经在第四位
        [ 面积9, 面积25, 面积49, 面积64, 面积100 ]

##### 关键代码（2分钟）

```python
import turtle
import random

t = turtle.Turtle()
t.speed(2)

squares = []
for i in range(5):
    size = random.randint(20, 80)
    area = size * size
    squares.append(area)

def draw_square(t, size, x, y):
    t.penup()
    t.goto(x, y)
    t.pendown()
    for _ in range(4):
        t.forward(size)
        t.right(90)
    t.penup()
    t.goto(x, y - 20)
    t.write(f"{size*size}", font=("Arial", 10, "normal"))

x_pos = -300
for i in range(len(squares)):
    min_idx = i
    for j in range(i+1, len(squares)):
        if squares[j] < squares[min_idx]:
            min_idx = j
    squares[i], squares[min_idx] = squares[min_idx], squares[i]
    draw_square(t, int(squares[i]**0.5), x_pos + i*120, 0)
```

**核心技巧**：排序就是"每次选最小的放到前面"！

---

#### 关卡4：递推应用 —— 斐波那契螺旋 + 爬楼梯（7分钟）

##### 第一部分：斐波那契数列画螺旋（3分钟）

老师说：
"斐波那契数列是一个神奇的数列，它藏在自然界很多地方！
- 向日葵的种子排列
- 贝壳的螺旋形状
- 树枝的分叉方式

它的规律是：前两个数加起来等于第三个数！
1, 1, 2, 3, 5, 8, 13, 21, 34, 55……"

##### 斐波那契螺旋画法

```python
import turtle

t = turtle.Turtle()
t.speed(3)

fib = [1, 1]
for i in range(10):
    fib.append(fib[-1] + fib[-2])

for i in range(len(fib)):
    t.circle(fib[i], 90)

t.hideturtle()
```

解释：
"t.circle(半径, 角度) 是画圆弧的命令。
我们让半径等于斐波那契数列的每个数，
画出来的螺旋就和鹦鹉螺的壳一模一样！"

##### 第二部分：爬楼梯所有走法（4分钟）

**题目展示**：
"上楼梯一次可以走1阶或2阶，
那么上10阶楼梯有多少种不同的走法？"

##### 算法分析（2分钟）

老师说：
"爬楼梯的问题，我们也可以倒着想：
- 要走到第10阶，最后一步可能是从第9阶走1步，或者从第8阶走2步
- 所以 f(10) = f(9) + f(8)
- 同理 f(9) = f(8) + f(7)
- 直到 f(1) = 1（只有1种走法：走1步）
- f(2) = 2（两种走法：1+1 或 2）

这就是递推！"

##### 可视化所有走法（2分钟）

```python
import turtle

t = turtle.Turtle()
t.speed(1)

def draw_stairs(n, path=""):
    if n == 0:
        for step in path:
            if step == "1":
                t.forward(50)
            elif step == "2":
                t.forward(100)
            t.write(step, font=("Arial", 16, "normal"))
        t.backward(len(path) * 50)
        t.right(90)
        t.forward(30)
        t.left(90)
        return
    if n >= 1:
        draw_stairs(n-1, path + "1")
    if n >= 2:
        draw_stairs(n-2, path + "2")

def count_ways(n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    a, b = 1, 2
    for i in range(3, n+1):
        a, b = b, a + b
    return b

n = 5
total = count_ways(n)
t.write(f"爬{n}阶楼梯共有{total}种走法:",
        font=("Arial", 16, "normal"))
t.backward(200)
draw_stairs(n, "")
```

**核心技巧**：
- 递推公式：f(n) = f(n-1) + f(n-2)
- 这就是斐波那契数列的变形！

---

### 第三段：动手实践（20分钟）

#### 任务安排

学生从以下4个任务中选择2~3个完成：

| 难度 | 任务名称 | 预计时间 | 代码行数 |
|------|----------|----------|----------|
| 一颗星 | 完全平方数可视化 | 5分钟 | 约15行 |
| 两颗星 | 小猫分鱼模拟 | 5分钟 | 约20行 |
| 三颗星 | 图形排序 | 8分钟 | 约30行 |
| 四颗星 | 爬楼梯可视化 | 10分钟 | 约25行 |

#### 教师巡回指导要点

1. 对于枚举法：
   - 检查学生是否理解 root == int(root) 的判断逻辑
   - 提示：也可以用 n**0.5 代替 math.sqrt(n)

2. 对于模拟法：
   - 检查学生是否理解"逆推"的思想
   - 提示：可以用纸笔先算一遍，再用代码验证

3. 对于排序法：
   - 检查学生是否理解双重循环的含义
   - 提示：外层循环控制"选几次"，内层循环控制"怎么选"

4. 对于递推法：
   - 检查学生是否理解递推公式
   - 提示：斐波那契数列和爬楼梯是"亲戚"关系

#### 常见错误与解决方案

| 错误现象 | 原因 | 解决方法 |
|----------|------|----------|
| turtle画得太快看不到 | 没有设置 speed | 加 t.speed(1) |
| 图形超出屏幕 | 坐标没算好 | 用 t.goto() 重新定位 |
| 排序结果不对 | 比较符号写反 | 检查大于号还是小于号 |
| 递归死循环 | 缺少终止条件 | 检查 if n==0 或 if n==1 |

---

### 第四段：巩固拓展（5分钟）

#### 变形挑战题

**挑战1（枚举法升级）**：
"找出1~1000之间所有的完全立方数（能写成某个整数的三次方）。"

**挑战2（模拟法升级）**：
"如果小猫分鱼的规则改成每天吃掉一半加2条，第6天剩2条，一开始有多少？"

**挑战3（排序升级）**：
"用冒泡排序代替选择排序，实现同样的功能。"

**挑战4（递推升级）**：
"如果爬楼梯一次可以走1阶、2阶或3阶，上10阶有多少种走法？"

#### 优秀作品展示

- 请完成最快的学生上台展示代码
- 请画得最漂亮的学生分享"让turtle图形变好看"的小技巧
- 请最有创意的学生展示自己改编的题目

---

### 第五段：课堂小结（5分钟）

#### 知识点回顾

今天我们闯过了4个关卡，每个关卡使用了一种算法：

枚举法：挨个检查，不错过任何一个
模拟法：一步一步跟着题目走
排序法：让乱糟糟的数据排好队
递推法：从前面的结果推导后面的结果

#### 算法选择口诀

老师带学生齐声朗读：

看到题目先别慌，
仔细分析找方向。
枚举模拟和递推，
排序查找不能忘。

枚举就是挨个试，
模拟跟着过程走。
排序让数据排好队，
递推把规律来参透。

GESP考试我不怕，
四种算法全拿下。
平时多练多思考，
编程高手就是我！

#### 课后任务预告

"下节课我们要进行综合模拟考，
就像真的GESP考试一样！
有选择题、判断题、编程题，
大家回去好好复习哦！"

---

## 七、板书设计

```
+-------------------------------------------------+
|            GESP真题实战                          |
+-------------------------------------------------+
|                                                   |
|  第1关：枚举法         第2关：模拟法              |
|  完全平方数           小猫分鱼                   |
|  root == int(root)    逆推 (鱼+1)*2              |
|                                                   |
|  第3关：排序法         第4关：递推法              |
|  图形大小排队         斐波那契+爬楼梯            |
|  选择排序找最小       f(n)=f(n-1)+f(n-2)        |
|                                                   |
+-------------------------------------------------+
|  算法选择口诀：                                  |
|  枚举挨个试，模拟跟着走                          |
|  排序排排好，递推找规律                          |
+-------------------------------------------------+
```

---

## 八、教学反思

### 预设问题与应对

1. 学生觉得题目太难：先用生活中的例子类比，再回到编程
2. turtle运行卡顿：使用 t.speed(0) + t.tracer(0) 加速，或者减少绘制元素
3. 排序原理不理解：用实物（如扑克牌）演示排序过程
4. 递归难以理解：重点讲递推（循环实现），递归作为拓展内容

### 差异化教学

- 基础薄弱的学生：只要求完成枚举法和模拟法两道题
- 学有余力的学生：完成全部4道题 + 变形挑战题

### 时间把控要点

- 导入阶段严格控制在5分钟内
- 每道题讲解不超过6分钟
- 动手实践阶段要留足20分钟
- 如果时间不够，巩固拓展可以缩减为3分钟

---

## 九、逐字讲解稿（教师参考）

### 导入部分逐字稿

"小朋友们好！欢迎来到我们的编程课堂！
今天我们要上一节非常特别的课——GESP真题实战！

你们知道GESP吗？它就像游戏里的段位赛一样，
一级二级是青铜段位，三级四级是黄金段位！
今天我们要挑战的就是黄金段位的真题！

看，黑板上有一张闯关地图——
第一关是枚举法，第二关是模拟法，
第三关是排序法，第四关是递推法。
每闯过一关，你们就离GESP证书更近一步！
准备好了吗？让我们开始吧！"

### 枚举法讲解逐字稿

"我们先看第一关——完全平方数。

什么叫做完全平方数呢？看老师手上……
假如我有1颗糖，可以摆成一个正方形：1行1列。
假如我有4颗糖，可以摆成2行2列的正方形。
假如我有9颗糖，可以摆成3行3列的正方形。

那如果我有2颗糖呢？能摆成正方形吗？
不能，对不对？因为1行2列是长方形，不是正方形。

所以，完全平方数就是能摆成正方形的数！

那计算机怎么判断一个数是不是完全平方数呢？
我们让计算机算这个数的平方根。
如果平方根是一个整数——比如4的平方根是2，2是整数——那么4就是完全平方数。
如果平方根不是整数——比如2的平方根是1.414……不是整数——那么2就不是。

在Python里，我们用 math.sqrt(n) 算平方根，
然后用 root == int(root) 判断是不是整数。
这个技巧一定要记住哦！"

### 模拟法讲解逐字稿

"现在进入第二关——小猫分鱼。

这是一个很有意思的故事。
有一只小猫在海边发现了一堆鱼。
它第一天吃掉一半，觉得不过瘾，又多吃了一条。
第二天又把剩下的吃掉一半，还是多吃了1条。
这样连续吃了5天，到第5天吃完后一看，
咦？只剩1条鱼了！

问题是：一开始有多少条鱼？

大家可以想一想，如果顺着算——就是从头往后算——我们不知道一开始有多少，很难。
但是如果我们反过来，从最后一天往前推，就简单了！

第5天剩1条，那第5天吃之前有多少呢？
因为第5天吃掉了一半加1条，所以第5天吃之前的鱼数应该是：
(1 + 1) x 2 = 4条

同理，第4天吃之前：
(4 + 1) x 2 = 10条

这样一直推到第1天，就得到了答案：94条！

这就是逆向思维，也叫逆推法。
在编程里，我们就用循环来模拟这个逆推的过程。
循环从第5天开始，每次计算 (鱼数 + 1) x 2，
一直算到第1天。很简单吧！"

### 排序法讲解逐字稿

"第三关是图形排序。

我们先画5个大小不一样的正方形，
然后我们要用选择排序把它们按面积从小到大排好。

选择排序的思路特别像体育老师排队：
身高的同学站前面，矮的同学站后面。

怎么操作呢？每次从还没排好的同学里，
找出最矮的那个，让他站到最前面。
然后再从剩下的同学里找最矮的，站到第二位。
以此类推……

在编程里，我们用双重循环来实现：
外层循环控制'选第几个位置'，
内层循环控制'在这个位置上选谁'。

看老师演示一下……
第一次，我们从5个正方形里找面积最小的，放到第一个位置。
第二次，从剩下的4个里找最小的，放到第二个位置。
这样重复5次，所有正方形就排好队啦！"

### 递推法讲解逐字稿

"最后一关是两个递推问题。

第一个问题是斐波那契数列画螺旋。
斐波那契数列很有意思：
1, 1, 2, 3, 5, 8, 13, 21, 34, 55……
看出来规律了吗？前两个数加起来等于第三个数。

我们用这个数列的每个数当半径，画圆弧，
就能画出一个漂亮的螺旋线。
这个螺旋在自然界中到处都有——
鹦鹉螺的壳、向日葵的花盘、甚至银河系！

第二个问题是爬楼梯。
假设上楼梯一次可以走1阶或2阶，
那么上10阶楼梯有多少种不同的走法？

我们这样想：要上到第10阶，
最后一步可能是从第9阶走1步，或者从第8阶走2步。
所以，上10阶的走法数 = 上9阶的走法数 + 上8阶的走法数。

这不就是斐波那契数列吗？
f(1)=1, f(2)=2, f(3)=3, f(4)=5, f(5)=8……
是不是和斐波那契数列一模一样？

所以，递推的核心就是：
从已知的结果推导出未知的结果。
一步一步向前推，就能算出最终答案！"

### 总结逐字稿

"好了，小朋友们，今天的四道关卡我们都闯过了！

我们来回顾一下：
第一关，枚举法——我们挨个检查每个数，找出了所有的完全平方数。
第二关，模拟法——我们逆推小猫吃鱼的过程，算出了一开始有多少鱼。
第三关，排序法——我们用选择排序，让图形从小到大排好了队。
第四关，递推法——我们用递推公式，算出了爬楼梯的走法数。

现在，跟着老师一起念口诀：

看到题目先别慌，
仔细分析找方向。
枚举模拟和递推，
排序查找不能忘。

下节课我们要进行综合模拟考，
就像真的GESP考试一样。
今天回家好好复习，
下节课争取考出好成绩！

好了，下课！小朋友们再见！"

---

## 十、教学评估

### 随堂评估

| 评估方式 | 评估内容 | 达标标准 |
|----------|----------|----------|
| 提问 | 完全平方数的判断方法 | 能说出 root == int(root) |
| 提问 | 逆推的基本思路 | 能说出 (当前数+1)x2 |
| 编程 | 完成枚举法代码 | 能正确输出31个完全平方数 |
| 编程 | 完成小猫分鱼代码 | 能正确算出94条 |
| 观察 | 排序理解程度 | 能正确描述选择排序过程 |

### 课后作业评估

- 完成情况评级：A = 全部完成，B = 完成2~3题，C = 完成1题
- 代码质量评级：优秀（有注释+命名规范）/ 合格 / 需改进
- 创意加分：有自主改编或拓展

---

*教案完 | 适用GESP三级/四级备考 | 建议配合代码文件和练习文件使用*
