C3 阶段 · 第十部分(阶段测试)
阶段测试
—— 授课教案(教师详案)——
授课教师:陶老师
课时建议:120 分钟(2h)
授课对象:GESP一级备考学员
课程主题:C3阶段知识综合回顾与阶段测试(数组、循环、函数、排序、凯撒密码)
一、课程引入(10分钟)
同学们,我们已经学习了C3阶段的全部内容!今天是一节特别的课——阶段测试课!
回顾一下我们学过的内容:
- C3-1~C3-3:数组的基本概念、一维数组的声明与使用
- C3-4~C3-5:字符数组、字符串处理
- C3-6~C3-7:凯撒密码、字符加密解密
- C3-8:自定义函数(函数定义、参数、返回值)
- C3-9:排序(sort函数、自定义cmp、升序降序)
今天我们要通过一套完整的测试题,检验大家对这些知识的掌握程度!
测试分为两部分:单项选择题(4道)和程序设计题(3道),让我们开始吧!
二、知识点复习回顾(25分钟)
2.1 数组核心知识点
(1)数组的声明与下标
- 数组声明:
int a[100];表示创建了一个能存放100个整数的数组 - 数组下标从0开始!
a[0]是第一个元素,a[99]是第100个元素 - 最大下标 = 数组长度 - 1,即
int a[100]的最大下标是 99(不是100!)
int a[100]; // 下标范围:0 ~ 99,共100个元素
a[0] = 1; // 第一个元素
a[99] = 100; // 最后一个元素(最大下标)
(2)字符数组
char a[5];可以存放5个字符cin >> a;可以整体输入字符数组(输入一串字符)- 注意:int数组不能用cin整体输入,必须逐个元素输入
char s[20];
cin >> s; // 正确:字符数组可以整体输入
int a[5];
// cin >> a; // 错误!int数组不能这样整体输入
for(int i=0; i<5; i++) cin >> a[i]; // 正确:逐个输入
2.2 循环结构核心知识点
for循环的三要素:初始化、条件、更新
for(int i=1; i<=100; i++)输出1到100(注意 <= 不是 <)for(int i=1; i<100; i++)只输出1到99,漏掉了100!
// 输出1到100的所有整数
for (int i = 1; i <= 100; i++) {
cout << i << " ";
}
// 注意:i<=100 才能包含100!
2.3 凯撒密码
凯撒密码的核心公式:
- 小写字母:
(ming - 'a' + k) % 26 + 'a'(26个字母一循环) - 大写字母:
(ming - 'A' + k) % 26 + 'A' - 数字:
(ming - '0' + k) % 10 + '0'(10个数字一循环!)
char mi;
if (ming >= 'a' && ming <= 'z') {
mi = (ming - 'a' + k) % 26 + 'a'; // 26个字母
}
if (ming >= '0' && ming <= '9') {
mi = (ming - '0' + k) % 10 + '0'; // 10个数字!
}
2.4 自定义函数回顾
函数定义格式:返回值类型 函数名(参数列表) { 函数体 }
int add(int a, int b) {
return a + b; // 返回计算结果
}
// 调用:int c = add(3, 5); // c = 8
2.5 排序回顾
sort函数用法:sort(数组名, 数组名+长度, 比较函数)
#include <algorithm>
int a[5] = {3, 1, 4, 1, 5};
sort(a, a + 5); // 从小到大排序
// sort(a, a+5, cmp); // 传cmp自定义排序规则
三、例题演示与讲解(40分钟)
选择题第一题:数组下标
题目:我们声明了一个数组 int a[100],请问这个数组的最大下标是多少?
A. 98 B. 99 C. 100 D. 101
答案:B. 99
int a[100]声明了100个元素,下标分别是0,1,2,...,99。所以最大下标是99,不是100!这是初学者最容易犯的错误。
选择题第二题:for循环输出
题目:下面哪一个程序片段可以输出1到100内的所有整数?
答案:for(int i = 1; i <= 100; i++) { cout << i << " "; }
- i从1开始(不从0开始,因为要输出1~100)
- i <= 100(注意是<=,不是<,否则会漏掉100)
- i++(每次加1)
选择题第三题:凯撒密码填空
题目:通过凯撒密码对数字字符进行加密,请填空。
答案:(ming - '0' + k) % 10 + '0'
和字母的区别:字母有26个用%26,数字有10个用%10。
选择题第四题:数组与字符数组概念
题目:选出描述最正确的语句。
答案:char a[5]; cin >> a;(字符数组整体输入是正确的)
- 字符数组可以用
cin >> a;整体输入字符串 - int数组不能用cin整体输入,必须逐元素输入
- 数组初始化元素个数不能超过数组长度
- 循环访问数组时下标不能越界(i < 长度,不是 i <= 长度)
编程题第一题:m的倍数
题目:输入两个整数n, m,输出1~n范围内所有是m的倍数的正整数。
样例输入:10 3 → 样例输出:3 6 9
#include <iostream>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) { // ★ 从1遍历到n
if (i % m == 0) { // ★ 判断i是否是m的倍数
cout << i << endl;
}
}
return 0;
}
编程题第二题:公因数之和
题目:给定两个正整数a和b,计算它们所有公因数的和。
样例输入:8 12 → 样例输出:7(公因数1,2,4,和=7)
#include <iostream>
using namespace std;
int main() {
int a, b;
cin >> a >> b;
int sum = 0;
// 遍历从1到a的所有可能公因数
for (int i = 1; i <= a; i++) { // ★ 从1遍历到a
if (a % i == 0 && b % i == 0) { // ★ 同时整除a和b
sum += i; // ★ 累加到sum
}
}
cout << sum << endl;
return 0;
}
编程题第三题:最大跨度值
题目:长度为n的非负整数序列,计算最大跨度值(最大值-最小值)。
样例输入:6 / 3 0 8 7 5 9 → 样例输出:9(max=9, min=0, 9-0=9)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int a[1005];
int maxVal = 0, minVal = 1000;
for (int i = 0; i < n; i++) {
cin >> a[i];
if (a[i] > maxVal) maxVal = a[i]; // ★ 更新最大值
if (a[i] < minVal) minVal = a[i]; // ★ 更新最小值
}
cout << maxVal - minVal << endl; // ★ 最大跨度=最大-最小
return 0;
}
四、课堂练习(30分钟)
学生独立完成平台上的阶段测试题:
- 4道单项选择题(每题10分,共40分)
- 3道程序设计题(第1、2题20分,第3题1分通过)
教师巡视指导,重点关注:
- 数组下标的理解(0开始还是1开始)
- for循环边界条件(<= 还是 <)
- %取模运算的使用(判断倍数、公因数)
- 凯撒密码中数字的取模是10不是26
五、拓展任务(10分钟)
拓展挑战题:让学有余力的同学思考以下问题:
- 如果要输出1~n范围内所有m的倍数,除了用
i%m==0判断,还有没有更高效的方法?
提示:直接从m开始,每次加m:for(int i=m; i<=n; i+=m) - 公因数之和的题目中,为什么遍历到a就够了?能不能遍历到b?
提示:公因数不可能超过两个数中的较小者 - 最大跨度值中,maxVal和minVal的初始值应该设成什么?为什么不能设成0?
六、作业布置(5分钟)
必做作业:
- 完成平台阶段测试的所有题目
- 在OJ平台完成10道基础题(见OJ题目列表)
- 阅读拓展解析页面,理解3道编程题的完整代码
选做作业:
- 完成OJ平台5道进阶题
- 思考拓展任务中的3个问题
七、教学反思
本节课是C3阶段的阶段测试课,重点检验学生对前9节课知识的综合掌握情况。
预计学生容易出错的地方:
- 数组下标的"0开始"问题——
int a[100]最大下标是99不是100 - for循环边界——输出1到100必须用
i<=100而不是i<100 - 凯撒密码数字部分——数字取模是%10不是%26
- int数组不能用cin整体输入
- 编程题中%运算的正确使用(判断倍数和公因数)
教学建议:
- 测试前先带领学生快速回顾知识点(25分钟复习环节很重要)
- 对做错的题目要分析原因,是概念不清还是粗心
- 编程题重点检查代码填空是否填对了关键位置
- 根据测试结果调整后续C4阶段的教学重点
—— 教案完 ——