前言
CCF 编程能力等级认证,英文名 Grade Examination of Software Programming(以下简称 GESP),由中国计算机学会发起并主办。
GESP 是全国唯一打通 CSP-J/S(全国青少年信息学奥林匹克竞赛和 CSP 初赛)的编程能力等级认证。
介绍 C++ GESP 三级认证考点,涵盖二进制编码(原码反码补码)、进制转换、位运算原理及操作。C++ 部分重点讲解一维数组定义访问、字符串处理函数(大小写、查找替换分割),以及枚举算法与模拟算法的核心思想与应用场景。适合备考 GESP 三级的学习者参考。

CCF 编程能力等级认证,英文名 Grade Examination of Software Programming(以下简称 GESP),由中国计算机学会发起并主办。
GESP 是全国唯一打通 CSP-J/S(全国青少年信息学奥林匹克竞赛和 CSP 初赛)的编程能力等级认证。
通过 GESP 认证,学生可以获得免考 CSP-J/S 初赛的机会,大大提高了参加更高水平编程竞赛的机会和优势。此外,GESP 的考试大纲与 CSP-J/S 的大纲基本吻合。
(1)了解二进制数据编码:原码、反码、补码。 (2)掌握数据的进制转换:二进制、八进制、十进制、十六进制。 (3)掌握位运算:与 (&)、或 (|)、非 (~)、异或 (^)、左移 (<<)、右移 (>>) 的基本使用方法及原理。 (4)了解算法的概念与描述,熟练运用自然语言、流程图、伪代码方式来描述算法。 (5)C++ 一维数组基本应用。 (6)掌握字符串及其函数的使用包括但不限于大小写转换、字符串搜索、分割、替换。 (7)理解枚举算法、枚举算法的原理及特点,可以解决实际问题。 (8)理解模拟算法、模拟算法的原理及特点,可以解决实际问题。
掌握计算机中常用进位制、位运算及数据编码的知识,掌握一维数组、字符串类型及其函数的使用,掌握枚举法、模拟法的原理和运用技巧,对于较简单的实际问题能构造算法、描述算法、实现算法并调试程序。

| 编号 | 知识块 | 知识点 |
|---|---|---|
| 1 | 数据编码 | 原码、反码、补码 |
| 2 | 进制转换 | 二进制、八进制、十进制、十六进制 |
| 3 | 位运算 | 与 (&)、或 ( |
| 4 | 算法与描述 | 枚举法、模拟法自然语言描述、流程图描述、伪代码描述 |
| 5 | 数据结构 | 一维数组 |
| 6 | 字符串及其函数 | 大小写转换、字符串搜索、分割、替换等 |
| 单选题 | 判断题 | 编程题 |
|---|---|---|
| 15 道(2 分/道) | 10 道(2 分/道) | 2 道(25 分/道) |
考试时间 120 分钟。
计算机中有符号数(可表示正负)以'符号位 + 数值位'存储,符号位:0 表示正数,1 表示负数;数值位长度由数据类型决定(如 char 占 8 位,int 占 32 位)。
// 正数:5 的原码 = 00000101(符号位 0,数值位 0000101)
// 负数:-5 的原码 = 10000101(符号位 1,数值位 0000101)
// 5 反码 = 00000101(与原码一致)
// -5 反码 = 11111010(符号位 1 不变,数值位 0000101 取反为 1111010)
// 5 补码 = 00000101
// -5 补码 = 11111010 + 1 = 11111011
在计算机中,数据常以不同进制表示。
位运算是直接对整数的二进制位进行操作的运算,效率极高,常用于底层编程、状态压缩等场景。GESP 三级要求掌握 6 种基本位运算:
| 运算符 | 名称 | 作用(对二进制位) | 示例(以 8 位为例) |
|---|---|---|---|
| & | 与 | 两位均为 1 则为 1,否则为 0 | 00001010 & 00000111 = 00000010 |
| | | 或 | 两位有 1 则为 1,否则为 0 | 0001010 |
| ~ | 非 | 0 变 1,1 变 0(单目运算符) | ~00001010 = 11110101 |
| ^ | 异或 | 两位不同则为 1,相同则为 0 | 00001010 ^ 00000111 = 00001101 |
| << | 左移 | 整体左移 n 位,右侧补 0(相当于 ×2ⁿ) | 00001010 << 2 = 00101000 |
| >> | 右移 | 整体右移 n 位,左侧补符号位(相当于 ÷2ⁿ) | 10001010 >> 2 = 11100010(负数) |
数组是相同类型数据的连续集合,一维数组是 GESP 三级的核心数据结构,用于存储批量数据。
定义:数据类型 数组名 [长度];(长度必须是常量)。
// 方式 1:指定长度并初始化(未赋值元素默认为 0)
int arr1[5] = {1, 2, 3}; // arr1 = [1, 2, 3, 0, 0]
// 方式 2:省略长度,由初始化元素个数决定
int arr2[] = {4, 5, 6}; // 长度为 3,arr2 = [4, 5, 6]
访问:通过索引(从 0 开始)访问,如 arr[0](第一个元素)。 遍历:常用 for 循环遍历所有元素:
int arr[] = {10, 20, 30, 40};
int len = sizeof(arr) / sizeof(arr[0]); // 计算数组长度(4)
for (int i = 0; i < len; i++) {
cout << arr[i] << " "; // 输出:10 20 30 40
}
数组传参时,实际传递的是首地址,需额外传递长度:
// 求数组元素和
int sumArray(int arr[], int len) {
int sum = 0;
for (int i = 0; i < len; i++) {
sum += arr[i];
}
return sum;
}
int main() {
int nums[] = {1, 2, 3, 4};
int len = 4;
cout << "和为:" << sumArray(nums, len); // 输出 10
return 0;
}
字符串是字符的序列,C++ 中常用 char 数组和 string 类(更便捷)表示,需掌握字符串的基本操作。
// 1. char 数组(需以'\0'结尾,表示字符串结束)
char str1[] = "hello"; // 自动添加'\0',长度为 6(h,e,l,l,o,\0)
// 2. string 类(需包含<string>头文件,无需手动加结束符)
#include <string>
string str2 = "world";
string s1 = "abc", s2 = "def";
cout << s1.length(); // 输出 3
cout << s1 + s2; // 输出"abcdef"
#include <cctype>
string s = "AbC";
for (int i = 0; i < s.size(); i++) {
s[i] = toupper(s[i]); // 转大写,结果为"ABC"
}
string s = "hello world";
int pos = s.find("world"); // pos=6
if (pos != string::npos) {
s.replace(pos, 5, "C++"); // 替换为"hello C++"
}
示例:
string s = "I love C++";
string delimiter = " ";
size_t pos = 0;
while ((pos = s.find(delimiter)) != string::npos) {
string part = s.substr(0, pos); // 截取从 0 到 pos 的子串
cout << part << endl; // 输出"I"、"love"
s.erase(0, pos + delimiter.length()); // 移除已处理部分
}
cout << s; // 输出"C++"
枚举算法(穷举法)是逐一尝试所有可能解,从中找出符合条件的解,适合解空间较小的问题。
模拟算法是按问题的实际流程,用代码一步步重现过程,从而得到结果,适合解决规则明确的过程性问题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online