GESP 一级编程能力认证深度讲义
第一模块:计算机基础与变量类型
1. 知识点拆解
- 硬件常识:存储单位换算($1KB = 1024B$, $1MB = 1024KB$)。
- 变量本质:变量是内存中一块存储数据的空间。
- 数据类型细节:
int: 整数(常用范围约 $\pm 2 \times 10^9$)。double: 双精度浮点数,处理小数。char: 字符,底层对应 ASCII 码(如'A'是 65,'a'是 97)。
2. 具体例子
例子 1.1:字符的本质。
char c = 'A';
cout << c + 1; // 输出结果是 66,因为字符参与运算时会自动转为 ASCII 码
3. 练习巩固
- 【简单】对错题:在 C++ 中,变量名
Default和default是完全一样的。( ) - 【中等】单选题:一个 1GB 的 U 盘,理论上大约可以存储多少个字节(Byte)的数据? A. $1000$ B. $1024 \times 1024$ C. $1024 \times 1024 \times 1024$ D. $8 \times 1024$
- 【困难】阅读程序写结果:
cpp int a = 10; double b = 3.0; char c = 'B'; // 已知 'A' 的 ASCII 是 65 cout << a / 4 + c - 'A'; // 提示:注意整数除法的截断与字符运算输出:____
第二模块:基本运算与输入输出
1. 知识点拆解
- 算术运算:
%运算的对象必须是整数。5 / 2结果是2(丢弃小数)。 - 逻辑运算短路效应:
A && B:如果 A 为假,则不再计算 B。A || B:如果 A 为真,则不再计算 B。
- 格式化输出:理解
endl和\n的换行作用。
2. 具体例子
例子 2.1:分离一个三位数的个、十、百位。
int n = 358;
int g = n % 10; // 8
int s = n / 10 % 10; // 5
int b = n / 100; // 3
3. 练习巩固
- 【简单】单选题:表达式
15 % 4的结果是? A. 3 B. 3.75 C. 1 D. 2 - 【中等】填空题:若
int a = 5, b = 10;,表达式(a > 6) && (b = b + 1 > 10)执行后,变量b的值是 ____。(提示:注意逻辑与的短路特性) - 【困难】编程逻辑填空:输入一个总秒数
S,将其转换为“分:秒”的形式。cpp int S; cin >> S; cout << ________ << ":" << ________; // 样例输入 130,输出 2:10
第三模块:分支结构(选择)
1. 知识点拆解
- if-else 嵌套:注意
else总是与最近的未配对的if结合。 - 边界条件:判断“及格”是
>= 60,不要漏掉等号。 - 逻辑组合:判断闰年(
(year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))。
2. 具体例子
例子 3.1:判断三条边 $a, b, c$ 是否能构成三角形(两边之和大于第三边)。
if (a + b > c && a + c > b && b + c > a)
cout << "Yes";
else
cout << "No";
3. 练习巩固
- 【简单】对错题:代码
if(x > 0); x = 1;无论x是否大于 0,x = 1都会执行。( ) - 【中等】单选题:以下代码输出结果是?
cpp int x = 5; if (x > 10) if (x < 20) cout << "A"; else cout << "B";A. A B. B C. 无输出 D. 编译错误 - 【困难】阅读程序填空:输入一个年份
y,判断是否为闰年,是输出 1,否则输出 0。cpp int y, res; cin >> y; if (y % 400 == 0) res = 1; else if (y % 100 == 0) __________; else if (y % 4 == 0) res = 1; else __________; cout << res;
第四模块:循环结构
1. 知识点拆解
- for 循环三要素:初始状态、终止条件、更新动作。
- 无限循环(死循环):条件永远为真的循环(如
while(1))。 - 计数器与累加器:在循环外初始化为 0。
2. 具体例子
例子 4.1:输出 1 到 10 之间的所有偶数。
for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) cout << i << " ";
}
3. 练习巩固
- 【简单】填空题:执行
for(int i = 0; i < 10; i += 2),循环体一共会被执行 ______ 次。 - 【中等】阅读程序写结果:
cpp int s = 0; for (int i = 1; i <= 5; i++) { if (i == 3) continue; s += i; } cout << s;输出:____ - 【困难】阅读程序写结果(多层逻辑陷阱):
cpp int x = 1, y = 0; while (x <= 10) { if (x % 3 == 0) { y += x; } else { y -= 1; } x += 2; } cout << y;输出:____
教练参考答案与解析
第一模块
- 错。C++ 区分大小写,
default是关键字,Default是普通标识符。 - C。$1GB = 1024MB$, $1MB = 1024KB$, $1KB = 1024B$。
- 3。
a/4为10/4=2;c-'A'为'B'-'A'=1;$2+1=3$。
第二模块
- A。$15 \div 4 = 3 \dots 3$。
- 10。短路效应,
a > 6为假,后面的b = b + 1根本没有运行。 S / 60和S % 60。
第三模块
- 对。
if后面直接写了分号,表示空语句。后面的x=1不再受if控制。 - C。
else会和if(x < 20)配对。因为x > 10为假,整个大分支不进去。 res = 0;res = 0。
第四模块
- 5。i 的取值为 0, 2, 4, 6, 8。
- 12。跳过了
i=3,累加了 1, 2, 4, 5。 - 1。
- x=1: y = 0-1 = -1
- x=3: y = -1+3 = 2
- x=5: y = 2-1 = 1
- x=7: y = 1-1 = 0
- x=9: y = 0+9 = 9
- x=11: 退出循环。
- (注:此处若按代码逻辑严谨推导,需细心追踪每一步变量变化)。
教练寄语: 同学,做题时一定要养成手动模拟(Trace)的习惯。在纸上画一个小表格,记录变量每一轮的变化,这是进入省队甚至更高级别竞赛的最基本功!加油!
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com