Appearance
第1章 GESP 三级考点总览
🎯 本章学习目标
学完本章(全书总览),你将能够:
- 整体把握 GESP 三级考试的 6 大知识模块及其权重分布
- 理解数据编码(原码、反码、补码)的核心思想与补码的优势
- 掌握二进制、八进制、十进制、十六进制之间的转换方法
- 熟练运用 6 种位运算符(&、|、~、^、<<、>>)进行手算
- 读懂算法的三种描述方式:自然语言、流程图、伪代码
- 掌握枚举法和模拟法两种基础算法思想的适用场景
- 理解一维数组的定义、访问、遍历与常见应用
- 掌握字符串的常用操作:大小写转换、搜索、分割、替换
- 建立三级各知识点之间的关联,形成完整的知识体系
- 制定适合自己的备考计划,明确各模块的复习优先级
🗺️ 本章知识图谱
GESP 三级 C++
├── 底层数据表示
│ ├── 数据编码
│ │ ├── 原码(符号位+绝对值)
│ │ ├── 反码(负数数值位取反)
│ │ └── 补码(反码+1,计算机实际使用)
│ ├── 进制转换
│ │ ├── 二/八/十/十六进制
│ │ ├── R进制 → 十进制(按权展开)
│ │ ├── 十进制 → R进制(除基取余/乘基取整)
│ │ ├── 二进制↔八进制(三位一组)
│ │ └── 二进制↔十六进制(四位一组)
│ └── 位运算
│ ├── 按位与 &(取位、掩码、判奇偶)
│ ├── 按位或 |(置位)
│ ├── 按位非 ~(取反,~x=-x-1)
│ ├── 按位异或 ^(交换、加密、翻转)
│ ├── 左移 <<(×2ⁿ)
│ └── 右移 >>(÷2ⁿ,算术右移补符号位)
├── 算法思想与描述
│ ├── 算法五特征(有穷、确定、可行、输入、输出)
│ ├── 三种描述方式
│ │ ├── 自然语言(通俗但有二义性)
│ │ ├── 流程图(起止/处理/判断/输入输出框)
│ │ └── 伪代码(贴近程序,结构清晰)
│ ├── 枚举法(穷举:范围+条件)
│ └── 模拟法(按规则一步步演)
└── 数据结构与字符串
├── 一维数组
│ ├── 定义与初始化
│ ├── 下标访问(从0开始)
│ ├── 越界访问(未定义行为)
│ ├── 函数参数(退化为指针、传长度)
│ └── 经典应用(统计、最值、查找、排序)
└── 字符串
├── ASCII码与大小写转换
├── 搜索(find/rfind/npos)
├── 截取(substr)
├── 分割(手动split/stringstream)
└── 替换(replace)一、写在前面
这是 GESP 三级备考 的 第 1 章,也是全书的总览章——六大考点全景总览。
CCF GESP(编程能力等级认证)三级,是考级体系中的第三个台阶。如果说一、二级解决的是"能不能写出程序",那么三级开始回答一个更深的问题:"数据在计算机内部到底长什么样?程序又是如何被描述和组织的?"
从二级到三级,是一次关键的跨越:
- 🔽 向下:开始接触底层数据表示——二进制、原码反码补码、位运算,理解计算机"眼中"的世界
- 🔼 向上:开始建立基础算法思维——枚举法、模拟法,学会用流程图和伪代码描述算法
- 📦 向内:正式系统学习数据结构——一维数组,让数据"有家可归"
- 🔤 向细:掌握字符串处理——搜索、分割、替换,编程题的基本功
💡 全书结构:本章是总览篇,后续第 2~7 章将逐模块深入拆解,每章独立成篇,覆盖知识点精讲、典型例题、编程实战与备考策略。
二、📊 六大考点全景总表
GESP 三级考纲的 6 大知识模块一览全局:
| 序号 | 📌 考点模块 | 📖 一句话概括 | ⭐ 考频星级 |
|---|---|---|---|
| ① | 数据编码 | 原码、反码、补码——负数在计算机里的"身份证" | ⭐⭐⭐⭐⭐ |
| ② | 进制转换 | 二/八/十/十六进制互转——计算机世界的"外语" | ⭐⭐⭐⭐⭐ |
| ③ | 位运算 | &、|、~、^、<<、>>——直接操作二进制位的六大神器 | ⭐⭐⭐⭐⭐ |
| ④ | 算法与描述 | 枚举法、模拟法 + 自然语言/流程图/伪代码描述 | ⭐⭐⭐⭐ |
| ⑤ | 数据结构 | 一维数组 | ⭐⭐⭐⭐⭐ |
| ⑥ | 字符串及其函数 | 大小写转换、搜索、分割、替换——编程题的日常 | ⭐⭐⭐⭐ |
📌 考频星级说明:基于历年 GESP 三级真题统计分析,⭐越多表示出题频率越高、分值占比越大。①②③三个模块构成三级选择判断题的"底层三剑客",⑤⑥则是编程题的"主力输出"。
三、🔍 六大考点逐一拆解
下面逐个说明每个考点 "考什么" 和 "怎么考"。
① 数据编码(原码、反码、补码)
🎯 考什么
- 计算机内部采用二进制存储数据,数值分有符号数和无符号数
- 原码:最高位为符号位(0 表示正,1 表示负),其余位表示数值大小
- 反码:正数的反码 = 原码;负数的反码 = 符号位不变,其余位逐位取反
- 补码:正数的补码 = 原码;负数的补码 = 反码 + 1
- 补码的意义:让加减法统一为加法、零的表示唯一、表示范围多一个最小负数
先看一段代码,直观感受补码:
cpp
#include <iostream>
using namespace std;
int main() {
// 以 8 位二进制为例(char 类型):
// +5 的原码/反码/补码:0000 0101
// -5 的原码:1000 0101(符号位为1)
// -5 的反码:1111 1010(符号位不变,数值位取反)
// -5 的补码:1111 1011(反码 + 1)——计算机中实际存储的形式
char x = 5; // 补码:0000 0101
char y = -5; // 补码:1111 1011
cout << (int)(x + y) << endl; // 输出 0:补码让加减法统一为加法
return 0;
}📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | 给定负数求原码/反码/补码、补码转十进制、判断表示范围 |
| 判断题 | "正数的原码、反码、补码都相同"(对!)、"0有两种补码表示"(错!补码中0唯一) |
| 编程题 | 不直接考概念,但理解补码是做对位运算题的前提 |
🔥 高频考点:n 位补码的表示范围是 -2^(n-1) ~ 2^(n-1)-1。8 位补码范围是 -128 ~ 127,其中 -128 的补码是
1000 0000,它没有对应的原码和反码——这是选择题的经典"陷阱选项"。
⚠️ **易错点:**求负数补码时,符号位不参与取反,只有数值位取反后再加 1。考试常给一个负数让你"求补码",千万不要把符号位也取反了!
② 进制转换
🎯 考什么
- 四种进制:二进制(B)、八进制(O)、十进制(D)、十六进制(H)
- R 进制 → 十进制:按权展开求和(如
1011B = 1×2³ + 0×2² + 1×2¹ + 1×2⁰ = 11) - 十进制 → R 进制:除基取余,逆序排列(除2取余、除8取余、除16取余)
- 二进制 ↔ 八进制:3 位二进制对应 1 位八进制(三位一体)
- 二进制 ↔ 十六进制:4 位二进制对应 1 位十六进制(四位一体)
- 代码中的进制表示:C++ 中八进制以
0开头、十六进制以0x开头
进制表示与输出示例:
cpp
#include <iostream>
using namespace std;
int main() {
int a = 017; // 以 0 开头:八进制,等于十进制 15
int b = 0x1F; // 以 0x 开头:十六进制,等于十进制 31
cout << a << " " << b << endl; // 输出:15 31(默认按十进制输出)
return 0;
}💡 想把十进制数按八进制/十六进制输出,可用 C++ 的
dec/oct/hex控制符(详见第 3 章《进制转换》)。
📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | 进制互转计算、判断哪个数最大/最小、代码中 0x/0 前缀的含义 |
| 判断题 | "二进制转十六进制需要4位一组"(对)、"十进制小数转二进制用除2取余"(整数部分除基取余,小数部分乘基取整) |
| 编程题 | 偶尔要求编程实现进制转换,或在模拟题中处理十六进制输入 |
🔥 **高频考点:**比较几个不同进制数的大小(如
1010B、17O、12D、0xA),先统一转成十进制再比较是最稳的做法。八进制数字只能出现 0~7,出现 8、9 立即判错。
⚠️ **易错点:**C++ 中
017是八进制的 15,不是十进制的 17!这是代码阅读题的经典坑。另外注意:C++11 不支持0b二进制前缀(那是 C++14 才有的语法),考试写代码别用。
③ 位运算
🎯 考什么
六大位运算符,直接对二进制位进行操作:
| 运算符 | 名称 | 规则 | 口诀 |
|---|---|---|---|
& | 按位与 | 两位都为 1,结果才为 1 | 全 1 出 1 |
| | 按位或 | 有一位为 1,结果就为 1 | 有 1 出 1 |
~ | 按位非 | 0 变 1,1 变 0(单目运算) | 逐位取反 |
^ | 按位异或 | 两位不同为 1,相同为 0 | 相异出 1 |
<< | 左移 | 各位左移,低位补 0 | 左移 n 位 ≈ ×2ⁿ |
>> | 右移 | 各位右移,高位补符号位 | 右移 n 位 ≈ ÷2ⁿ |
经典代码示例:
cpp
#include <iostream>
using namespace std;
int main() {
int a = 5, b = 3; // a = 0101, b = 0011
cout << (a & b) << endl; // 1 —— 0001:按位与
cout << (a | b) << endl; // 7 —— 0111:按位或
cout << (a ^ b) << endl; // 6 —— 0110:按位异或
cout << (a << 1) << endl; // 10 —— 左移1位,相当于 ×2
cout << (a >> 1) << endl; // 2 —— 右移1位,相当于 ÷2(取整)
cout << ~a << endl; // -6 —— 按位取反:~x = -x - 1
// 异或的实用技巧:不用临时变量交换两个数
int x = 5, y = 3;
x = x ^ y; // x = 6
y = x ^ y; // y = 5
x = x ^ y; // x = 3,交换完成
cout << x << " " << y << endl; // 3 5
return 0;
}📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | 位运算表达式求值、判断奇偶(x & 1)、位运算交换变量、移位后的值 |
| 判断题 | "左移一位相当于乘2"(不溢出时成立)、"异或满足交换律"(对) |
| 编程题 | 用位运算解决问题(统计二进制中1的个数、位运算模拟集合等) |
🔥 高频考点:
~按位取反的结果是 ~x = -x - 1(如 ~5 = -6),几乎每次考试都有人在这里丢分。原理是补码:取反后恰好等于相反数减一。
⚠️ 易错点:①位运算的优先级低于比较运算符,写
if (a & b == 0)会出错,必须加括号(a & b) == 0;②对负数右移是算术右移(高位补符号位1),结果仍是负数;③左移可能溢出,溢出后"×2"结论失效。
④ 算法与描述
🎯 考什么
两大基础算法思想:
- 枚举法(穷举法):把问题的所有可能情况一一列举、逐一检验,思路简单但要注意枚举范围和判定条件
- 模拟法:严格按照题目描述的规则,一步步"照做",关键是把规则准确翻译成代码
三种算法描述方式:
| 描述方式 | 特点 | 考试看点 |
|---|---|---|
| 📝 自然语言 | 用中文/英文句子描述,通俗易懂但易有歧义 | 理解算法步骤 |
| 📊 流程图 | 用标准图形符号描述,直观清晰 | 认符号、看分支、数循环 |
| 💻 伪代码 | 介于自然语言和代码之间,结构严谨 | 阅读理解、填空补全 |
流程图的常用符号要认清:椭圆=开始/结束框,矩形=处理框,菱形=判断框,平行四边形=输入/输出框,箭头=流程线。
枚举法典型套路示例:
cpp
#include <iostream>
using namespace std;
int main() {
// 枚举法:找出 10~99 中个位与十位之积为 12 的两位数
for (int n = 10; n <= 99; n++) { // 枚举所有可能的两位数
int gw = n % 10; // 个位
int sw = n / 10; // 十位
if (gw * sw == 12) { // 判定条件
cout << n << " "; // 输出:26 34 43 62
}
}
return 0;
}📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | 读流程图判断输出结果、伪代码填空、枚举范围是否正确 |
| 判断题 | 判断流程图符号用法、枚举是否会遗漏/重复 |
| 编程题 | 两道编程题几乎必有一道是枚举或模拟(如日期计算、报数模拟、规则推演) |
🔥 高频考点:流程图阅读题是三级的特色题型——给定流程图让你判断输出或循环次数。做这类题要拿笔在纸上跟着流程走一遍,特别注意菱形判断框的"是/否"分支走向和循环变量的更新时机。
⚠️ 易错点:枚举法最容易犯的错是边界错误——循环从几开始、到几结束(
<=还是<)。模拟法最容易犯的错是漏掉规则细节,题目多读两遍,把每条规则圈出来再动手。
⑤ 数据结构(数组)
🎯 考什么
- 一维数组的定义、初始化、下标访问(下标从 0 开始)
- 数组的遍历、求最值、计数、查找
- ⚠️ 考纲明确:不包括变长数组(VLA),即数组长度必须是常量 代码示例:
cpp
#include <iostream>
using namespace std;
int main() {
int a[5] = {3, 1, 4, 1, 5}; // 一维数组:长度必须是常量
int mx = a[0]; // 假设第一个元素最大
for (int i = 1; i < 5; i++) { // 遍历数组(下标 0~4)
if (a[i] > mx) mx = a[i]; // 更新最大值
}
cout << mx << endl; // 输出:5
return 0;
}📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | 数组下标计算、数组初始化结果 |
| 判断题 | "数组下标从1开始"(错,从0开始) |
| 编程题 | 数组是所有编程题的载体:统计频次、查找、排序预处理等 |
⚠️ 易错点:①C++ 数组越界访问不报错(读到垃圾值),是编程题"玄学错误"的头号元凶;②数组初始化
int a[5] = {0};会把全部元素清零,但int a[5];不初始化则是随机值;
⑥ 字符串及其函数
🎯 考什么
- 字符与 ASCII 码:
'A'=65、'a'=97、'0'=48,大小写字母相差 32 - 大小写转换、字符串搜索(查找)、分割、替换、截取子串
- C++
string类
常用函数速查:
| 功能 | C++(string) |
|---|---|
| 求长度 | s.length() / s.size() |
| 转大写/小写 | toupper(c) / tolower(c) |
| 查找子串 | s.find("ab")(找不到返回 string::npos)string::npos 是一个静态常量,表示“未找到”,其值通常为 size_t 类型的最大值。 |
| 截取子串 | s.substr(pos, len) |
| 分割 | 需手动实现或配合 stringstream |
| 替换 | s.replace(pos, len, str) |
| 拼接 | s1 + s2 |
代码示例:
cpp
#include <iostream>
#include <string>
using namespace std;
int main() {
string s = "Hello GESP";
cout << s.length() << endl; // 10:字符个数(含空格)
cout << (char)tolower(s[0]) << endl; // h:字符转小写
cout << s.find("GESP") << endl; // 6:返回子串起始下标
cout << s.substr(0, 5) << endl; // Hello:从下标0开始取5个字符
return 0;
}📝 怎么考
| 题型 | 出题方式 |
|---|---|
| 单选题 | ASCII 码计算、函数返回值(find 找不到时返回什么)、字符串切片结果 |
| 判断题 | "字符串可以直接用 == 比较内容"(C++ 的 string 可以直接比较)、"find 找不到返回0"(错!) |
| 编程题 | 统计字符出现次数、单词分割处理、大小写转换、回文判断等 |
🔥 **高频考点:**ASCII 码推算几乎逢考必出——记住三个锚点
'A'=65、'a'=97、'0'=48,任意字符的码值都能推算。同类题型:大写转小写 = 码值 +32(或| 32),小写转大写 = 码值 -32(或& ~32)。
⚠️ 易错点:①C++ 的
find找不到子串返回string::npos(一个很大的数),不是 -1;②substr(pos, len)第二个参数是长度不是结束位置;
四、📝 实战练习
以下 8 道题覆盖三级所有模块,用于检测你对各知识点的初步掌握程度。建议先独立完成,再对照解析查漏补缺。
练习题 1(单选题)
题目: 十进制数 -19 的 8 位二进制补码是( )
A. 1001 0011 B. 1110 1101 C. 1110 1100 D. 0110 1101
🔑 点击查看答案与解析
答案: B
解析:
19 = 16 + 2 + 1 = 0001 0011
-19 原码:1001 0011
-19 反码:1110 1100(数值位取反)
-19 补码:1110 1101(反码 + 1)- A 是原码,C 是反码,都是干扰项;D 符号位为 0 是正数,直接排除。
选 B。
练习题 2(单选题)
题目: 下列四个数中,最小的是( )
A. (1101)₂ B. (16)₈ C. 14 D. (C)₁₆
🔑 点击查看答案与解析
答案: D
解析: 统一转十进制比较:
- A:
(1101)₂ = 8+4+1 = 13 - B:
(16)₈ = 1×8 + 6 = 14 - C:
14 - D:
(C)₁₆ = 12
D 的值 12 最小。
教训:做进制比较题一定要全部转成十进制再比,千万不要凭感觉!
练习题 3(单选题)
题目: 表达式 8 | 5 的值是( )
A. 3 B. 13 C. 0 D. 12
🔑 点击查看答案与解析
答案: B
解析: 按位或运算,先转二进制再逐位运算:
8 = 1000
5 = 0101
---------
| 1101 = 13按位或的规则是"有 1 出 1",所以结果的每一位只要两个数中有一个是 1,结果就是 1。
1101 = 8+4+1 = 13,选 B。
练习题 4(判断题)
题目: 判断下列说法是否正确,正确打"√",错误打"×"。
(1) 算法必须有至少一个输入。( ) (2) 流程图中,菱形表示判断框,有一个入口和两个出口。( ) (3) 自然语言描述算法的优点是严谨、没有二义性。( ) (4) 枚举法的核心是确定枚举范围和判定条件。( ) (5) 模拟法需要把题目规则准确翻译成代码。( )
🔑 点击查看答案与解析
答案: (1) × (2) √ (3) × (4) √ (5) √
解析:
- (1) ×:算法可以有 0 个输入(如打印固定内容的程序),但输出至少 1 个。
- (2) √:菱形是判断框,一进两出(是/否两个分支)。
- (3) ×:自然语言通俗易懂但有二义性,严谨无二义性说反了。
- (4) √:枚举法两步走:确定范围 + 逐一检验。
- (5) √:模拟法的核心就是"照规则做",规则理解错了全盘皆输。
练习题 5(程序阅读题)
题目: 阅读以下 C++ 程序,输出结果是( )
cpp
int a[5] = {2, 5, 1, 5, 3};
int mx = a[0], pos = 0;
for (int i = 1; i < 5; i++) {
if (a[i] > mx) {
mx = a[i];
pos = i;
}
}
cout << pos;A. 5 B. 1 C. 2 D. 4
🔑 点击查看答案与解析
答案: B
解析: 程序的功能是找数组中最大值的下标(第一个出现的最大值)。
逐轮追踪:
- 初始:mx=2, pos=0
- i=1: a[1]=5 > 2 → mx=5, pos=1
- i=2: a[2]=1 < 5 → 不变
- i=3: a[3]=5 = 5 → 不更新(注意条件是
>不是>=) - i=4: a[4]=3 < 5 → 不变
最终 pos = 1(第一个最大值 5 在下标 1 处),选 B。
易错提醒:题目问的是下标 pos,不是最大值 mx。如果粗心选了 A(5)就掉坑里了。
练习题 6(单选题)
题目: 已知 'A' 的 ASCII 码为 65,以下表达式的值为 'D' 的是( )
A. 'A' + 3 B. 'a' + 3 C. 'A' + '3' D. 68
🔑 点击查看答案与解析
答案: A
解析:
- A:
'A' + 3 = 65 + 3 = 68,68 对应的字符是'D'✅ - B:
'a' + 3 = 97 + 3 = 100,对应'd'(小写)❌ - C:
'A' + '3' = 65 + 51 = 116,对应't'(注意'3'是字符,ASCII 码为 51,不是数字 3)❌ - D:
68是整数 68,不是字符'D'(需要强转(char)68才是字符)❌
选 A。
练习题 7(编程题)
题目: 输出所有满足条件的两位数:个位与十位数字之和为 9,且个位是偶数。
输出样例:
18 36 54 72 90🔑 点击查看答案与解析
参考代码:
cpp
#include <iostream>
using namespace std;
int main() {
for (int n = 10; n <= 99; n++) {
int ge = n % 10; // 个位
int shi = n / 10; // 十位
if (ge + shi == 9 // 个位+十位 = 9
&& ge % 2 == 0) { // 个位是偶数
cout << n << " ";
}
}
cout << endl;
return 0;
}解析: 枚举所有两位数(10~99),对每个数拆出个位和十位,检查两个条件:
- 个位 + 十位 = 9
- 个位是偶数(ge % 2 == 0)
验证:18(1+8=9,8偶) ✓、36(3+6=9,6偶) ✓、54(5+4=9,4偶) ✓、72(7+2=9,2偶) ✓、90(9+0=9,0偶) ✓
💡 优化思路:也可以只枚举十位(1~9),个位 = 9 - 十位,然后判断个位是否为偶数。这样只需循环 9 次而不是 90 次,但对两位数来说差别不大。
练习题 8(程序阅读题)
题目: 阅读流程图,输入 a=12, b=8,输出结果是( )
( 开始 )
|
/ 输入 a, b /
|
[ r ← a % b ]
|
+---> < r == 0 ? >--是---> / 输出 b / --->(结束)
| |否
| [ a ← b ]
| [ b ← r ]
| [ r ← a % b ]
+--------+A. 2 B. 4 C. 6 D. 8
🔑 点击查看答案与解析
答案: B
解析: 这是**辗转相除法(欧几里得算法)**求最大公约数的流程图。
逐步追踪:
- 初始:a=12, b=8
- 第1轮:r = 12 % 8 = 4,r ≠ 0 → a=8, b=4, r=8%4=0
- 第2轮判断:r == 0 → 是,输出 b = 4
12 和 8 的最大公约数确实是 4 ✓
选 B。
五、📊 考点总结表
| 模块 | 重要程度 | 出题形式 | 分值占比 | 易错点 |
|---|---|---|---|---|
| 数据编码(原反补码) | ⭐⭐⭐⭐⭐ | 选择/判断 | ~10分 | 符号位参与取反;-128无原码;补码范围记错 |
| 进制转换 | ⭐⭐⭐⭐⭐ | 选择/判断/计算 | ~10分 | 分组方向搞反;A~F对应值记混;小数位权错 |
| 位运算 | ⭐⭐⭐⭐⭐ | 选择/程序阅读 | ~10分 | ~x记成-x;优先级陷阱(&低于==);负数右移 |
| 算法与描述 | ⭐⭐⭐⭐ | 流程图阅读/选择 | ~10分 | 算法输入可以是0个;判断框出入口数;流程图循环次数 |
| 一维数组 | ⭐⭐⭐⭐⭐ | 编程/程序阅读 | ~15分 | 下标从0开始;越界未定义;VLA非法 |
| 字符串函数 | ⭐⭐⭐⭐ | 编程/程序阅读 | ~15分 | find返回npos不是-1;substr是长度不是终点;cin与getline混写 |
⭐ 必背速记卡
┌──────────────────────────────────────────────────────┐
│ ⭐ GESP 三级必背速记卡 │
├──────────────────────────────────────────────────────┤
│ 1. 负数补码 = 反码 + 1;正数三码合一 │
│ 2. n位补码范围:-2^(n-1) ~ 2^(n-1)-1(8位:-128~127)│
│ 3. 进制转换:R→十按权展开;十→R除基取余倒排 │
│ 4. 八三、十六四:八进制1位=二进制3位,十六1位=4位 │
│ 5. 按位取反公式:~x = -x - 1(~5 = -6) │
│ 6. 位运算优先级低于比较,x&1==0 要写成 (x&1)==0 │
│ 7. 异或自反性:a^b^b = a;可用于交换变量 │
│ 8. 左移n位=×2ⁿ;右移n位=÷2ⁿ(负数算术右移向下取整) │
│ 9. 算法五特征:有穷、确定、可行、输入(0+)、输出(1+) │
│ 10. 流程图:椭圆起止、矩形处理、菱形判断、平行四边形IO │
│ 11. 数组下标从0开始,长度n范围0~n-1,越界未定义 │
│ 12. 'A'=65 'a'=97 '0'=48,大小写差32 │
│ 13. string找不到子串返回 string::npos │
│ 14. substr(起点, 长度);不是(起点, 终点) │
│ 15. 枚举法:范围+条件;模拟法:状态更新+边界 │
└──────────────────────────────────────────────────────┘六、📈 备考建议:如何高效攻克三级?
1️⃣ 先理解"底层",再动手写码
三级最大的特点是概念题考底层:补码怎么算、位运算结果是多少、进制怎么转。这些知识点光背没用,一定要亲手在草稿纸上算:给一个负数写出三种码、把一个十进制数转成四种进制、手算每个位运算表达式。纸上演算 10 道,胜过看答案 100 遍。
2️⃣ 选择/判断靠概念,编程题靠细心
- 选择 + 判断(50分):数据编码、进制、位运算三章是"概念输出主力",流程图题要会"跟着走"
- 编程题(50分):三级编程题以枚举、模拟、数组/字符串处理为主,算法不难,拼的是边界处理和细心程度
3️⃣ 真题是最好的复习资料
GESP 三级历年真题是最好的备考材料。建议按以下顺序刷题:
- 先按模块分类刷 → 找到自己的薄弱点(尤其补码和位运算)
- 再按套卷限时练 → 训练时间分配能力
- 最后复盘错题 → 查漏补缺
