C3-10 授课教案 · 阶段测试

2h课程 · C3阶段知识综合回顾 · 数组 · 循环 · 函数 · 排序 · 凯撒密码

C3 阶段 · 第十部分(阶段测试)

阶段测试

—— 授课教案(教师详案)——

授课教师:陶老师

课时建议:120 分钟(2h)

授课对象:GESP一级备考学员

课程主题:C3阶段知识综合回顾与阶段测试(数组、循环、函数、排序、凯撒密码)

一、课程引入(10分钟)

同学们,我们已经学习了C3阶段的全部内容!今天是一节特别的课——阶段测试课!

回顾一下我们学过的内容:

今天我们要通过一套完整的测试题,检验大家对这些知识的掌握程度!

测试分为两部分:单项选择题(4道)和程序设计题(3道),让我们开始吧!

二、知识点复习回顾(25分钟)

2.1 数组核心知识点

(1)数组的声明与下标

int a[100];   // 下标范围:0 ~ 99,共100个元素
a[0] = 1;     // 第一个元素
a[99] = 100;  // 最后一个元素(最大下标)

(2)字符数组

char s[20];
cin >> s;     // 正确:字符数组可以整体输入

int a[5];
// cin >> a;  // 错误!int数组不能这样整体输入
for(int i=0; i<5; i++) cin >> a[i];  // 正确:逐个输入

2.2 循环结构核心知识点

for循环的三要素:初始化、条件、更新

// 输出1到100的所有整数
for (int i = 1; i <= 100; i++) {
    cout << i << " ";
}
// 注意:i<=100 才能包含100!

2.3 凯撒密码

凯撒密码的核心公式:

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

解析:C++数组下标从0开始编号。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'

解析:数字只有0~9共10个,所以取模应该是10(不是26)!
和字母的区别:字母有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分钟)

学生独立完成平台上的阶段测试题:

  1. 4道单项选择题(每题10分,共40分)
  2. 3道程序设计题(第1、2题20分,第3题1分通过)

教师巡视指导,重点关注:

五、拓展任务(10分钟)

拓展挑战题:让学有余力的同学思考以下问题:

  1. 如果要输出1~n范围内所有m的倍数,除了用 i%m==0 判断,还有没有更高效的方法?
        提示:直接从m开始,每次加m:for(int i=m; i<=n; i+=m)
  2. 公因数之和的题目中,为什么遍历到a就够了?能不能遍历到b?
        提示:公因数不可能超过两个数中的较小者
  3. 最大跨度值中,maxVal和minVal的初始值应该设成什么?为什么不能设成0?

六、作业布置(5分钟)

必做作业:

  1. 完成平台阶段测试的所有题目
  2. 在OJ平台完成10道基础题(见OJ题目列表)
  3. 阅读拓展解析页面,理解3道编程题的完整代码

选做作业:

  1. 完成OJ平台5道进阶题
  2. 思考拓展任务中的3个问题

七、教学反思

本节课是C3阶段的阶段测试课,重点检验学生对前9节课知识的综合掌握情况。

预计学生容易出错的地方:

  1. 数组下标的"0开始"问题——int a[100]最大下标是99不是100
  2. for循环边界——输出1到100必须用 i<=100 而不是 i<100
  3. 凯撒密码数字部分——数字取模是%10不是%26
  4. int数组不能用cin整体输入
  5. 编程题中%运算的正确使用(判断倍数和公因数)

教学建议:

—— 教案完 ——

需要原始Word文档?点击下方按钮下载

📥 下载教案(Word版)