【C++】GESP 二级手册
GESP是由中国计算机学会主办的编程能力等级认证,与CSP-J/S竞赛紧密衔接,通过认证可免考初赛。文章详细介绍了GESP二级考试标准,涵盖计算机存储(ROM、RAM、Cache)、网络分类与模型(TCP/IP、OSI)、程序设计语言分类(机器语言、汇编语言、高级语言)、流程图绘制方法、ASCII编码转换以及C++编程知识(数据类型转换、分支/循环结构、数学函数)。考试题型包括单选题、判断题和编程
系列文章目录
学习路线:C++从入门到NOI学习路线
学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲
文章目录
前言
CCF编程能力等级认证,英文名Grade Examination of Software Programming(以下简称GESP),由中国计算机学会发起并主办。
GESP是全国唯一打通CSP-J/S(全国青少年信息学奥林匹克竞赛和CSP初赛)的编程能力等级认证。
通过GESP认证,学生可以获得免考CSP-J/S初赛的机会,大大提高了参加更高水平编程竞赛的机会和优势。此外,GESP的考试大纲与CSP-J/S的大纲基本吻合。
一、GESP 二级标准
1. 知识点详述
(1)了解计算机存储的基本概念及分类,了解随机存储器(RAM)、只读存储器(ROM)和高速缓冲存储器(Cache)的功能及区别。
(2)了解计算机网络的概念,了解计算机网络的分类(广域网(WAN)、城域网(MAN)、局域网(LAN)),了解计算机网络的层级结构及作用(TCP/IP 四层模型与 OSI七层模型),了解不同层级的重要协议,了解 IP 地址及子网划分。
(3)了解程序设计语言的几大分类及特点(机器语言、汇编语言、高级语言),了解常见的高级语言(C++、Python 等)。
(4)了解流程图的概念及基本表示符号,掌握绘制流程图的方法,能正确使用流程图描述程序设计的三种基本结构。
(5)了解编码的基本概念,了解 ASCII 编码原理,能识别常用字符的 ASCII 码(空格:32、“0”:48、“A”:65、“a”:97),并掌握 ASCII 码和字符之间相互转换的方法。
(6)掌握数据类型的转换:强制类型转换和隐式类型转换。
(7)掌握多层分支结构,掌握 if 语句、if…else 语句、switch 语句,及相互嵌套的方法。
(8)掌握多层循环结构,掌握 for 语句、while 语句、do…while 语句,及相互嵌套的方法。
(9)掌握常用的数学函数:绝对值函数、平方根函数、最大值函数、最小值函数、随机数函数理解相应的算法原理。
2. 考核目标
通过计算机基础知识的学习,了解计算机的存储与网络知识、程序设计语言分类及特点、常见的编程语言和绘制流程图的方法。通过 C++知识的学习,掌握数据类型的转换方法及数学库函数的使用,可以独立完成多分支结构与循环结构的程序。
3. 知识块

4. 知识点描述
| 编号 | 知识块 | 知识点 |
|---|---|---|
| 1 | 计算机存储与网络 | ROM、RAM、CACHE、计算机网络分类、TCP/IP 四层模型与 OSI 七层模型、IP 地址及子网划分。 |
| 2 | 程序设计语言 | 程序设计语言分类、常见的高级语言 |
| 3 | 流程图 | 流程图的概念、绘制流程图、描述流程图 |
| 4 | ASCII 编码 | 常见字符的 ASCII 编码、字符编码之间的相互转换 |
| 5 | 数据类型转换 | 强制类型转换、隐式类型转换 |
| 6 | 多层分支结构 | if 语句、if…else 语句、switch 语句的嵌套 |
| 7 | 多层循环语句 | while 循环、do…while 循环、for 循环的嵌套 |
| 8 | 数学函数 | 绝对值函数:abs()、平方根函数:sqrt()、最大值函数:max()、最小值函数:min()、随机数函数:rand()/srand()及相关 |
5. 题型分布
| 单选题 | 判断题 | 编程题 |
|---|---|---|
| 15道(2分/道) | 10道(2分/道) | 2道(25分/道) |
考试时间120分钟。
二、计算机基础知识
1.计算机存储
1.1 ROM、RAM、CACHE
| 类型 | 全称 | 特点 | 用途举例 |
|---|---|---|---|
| RAM | 随机存储器 | 可读可写,断电数据丢失,访问速度快,容量较小。 | 运行中的程序和数据 |
| ROM | 只读存储器 | 出厂预存数据,只能读取,断电不丢失,容量小,速度慢。 | BIOS 固件、手机系统固件 |
| Cache | 高速缓冲存储器 | 位于 CPU 与内存之间,速度极快,容量极小,自动缓存高频访问数据。 | 加速 CPU 数据读取 |
2.计算机网络
所谓计算机网络,就是利用通信线路和设备,把分布不同地理位置上的多台计算机连接起来。
网络中计算机与计算机之间的通信依靠协议进行。协议是计算机收、发数据的规则。
2.1 计算机网络分类
- 网络的地理范围进行分类:
- 广域网(WAN):覆盖范围广(如互联网),由多个网络互联而成,速度较慢。
- 城域网(MAN):覆盖城市范围(如市政网络),介于 WAN 和 LAN 之间。
- 局域网(LAN):覆盖小范围(如家庭、教室),速度快,安全性较高。
- 按网络的拓扑结构进行分类:
2.2 TCP/IP 四层模型与 OSI 七层模型
TCP/IP传输协议,即传输控制/网络协议,也叫作网络通讯协议,是指能够在多个不同网络间实现信息传输的协议簇。它是在网络的使用中的最基本的通信协议。TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定。并且,TCP/IP传输协议是保证网络数据信息及时、完整传输的两个重要的协议。
OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。
OSI 七层模型是 “网络通信的百科全书”,通过细分层级揭示底层原理;TCP/IP 四层模型是 “互联网的实用手册”,以简化架构支撑全球网络运行。
| TCP/IP 四层模型 | OSI 七层模型(自下而上) | 核心协议举例 |
|---|---|---|
| 网络接口层 | 物理层、数据链路层 | Ethernet、WiFi、PPP |
| 网络层 | 网络层 | IP、ICMP、ARP |
| 传输层 | 传输层 | TCP、UDP |
| 应用层 | 会话层、表示层、应用层 | HTTP、FTP、SMTP、DNS |
为了更精准地呈现网络模型的分层逻辑,以下结合快递物流系统进行类比:
OSI 七层模型 × 快递物流全流程类比表
| OSI 层级 | 核心功能 | 快递物流类比场景 |
|---|---|---|
| 7. 应用层 | 生成具体应用数据(如邮件、文件) | 写信内容(决定 “给朋友写生日祝福”) 应用数据 |
| 6. 表示层 | 数据格式转换、加密 / 解密 | 信件内容翻译(如中文→英文)、信封加密(用特殊密码封缄) 格式化数据 |
| 5. 会话层 | 建立、管理通信连接(如断点续传) | 与朋友约定 “本周三前必须送达”,并确认对方收件时间(维持会话状态) 会话控制信息 |
| 4. 传输层 | 分段数据、确保可靠传输(如 TCP 重传) | 快递单号追踪系统(每箱快递标注唯一编号,丢失则补发)、按顺序分拣包裹 数据段(Segment) |
| 3. 网络层 | 路由选择、IP 寻址(规划跨区域路径) | 物流公司根据收件地址(如 “北京市朝阳区 XX 路”)规划运输路线(北京→上海走陆运还是空运) 数据包(Packet) |
| 2. 数据链路层 | 同一网段内的数据传输(如 MAC 寻址) | 某区域内快递员按门牌号投递(如朝阳区某小区内,快递员按 “XX 栋 XX 单元” 投递) 数据帧(Frame) |
| 1. 物理层 | 物理介质传输(如网线、无线电波) | 实际运输工具(卡车、飞机)、道路 / 航线等物理基础设施 |
2.3 IP地址及子网划分
- IP 地址:32 位二进制数(IPv4),通常表示为xxx.xxx.xxx.xxx(如192.168.1.1),分为网络号和主机号。
- 子网划分:通过子网掩码(如255.255.255.0)将 IP 地址划分为多个子网,提高 IP 利用率。
三、C++基础知识
1.程序设计语言
1.1 程序设计语言分类
| 类型 | 特点 | 示例 |
|---|---|---|
| 机器语言 | 由 0 和 1 组成,直接运行于硬件,执行效率最高,开发难度极大。 | 二进制指令(如10110000) |
| 汇编语言 | 用助记符(如 ADD、MOV)表示机器指令,需汇编器转换为机器语言。 | MOV AX, BX |
| 高级语言 | 接近自然语言,需编译器 / 解释器转换为机器语言,开发效率高。 | C++、Python、Java |
1.2 常见的高级语言
- C++:编译型语言,性能高,适合系统开发、游戏编程、竞赛编程。
- Python:解释型语言,语法简洁,适合人工智能、数据分析、脚本开发。
- Java:跨平台编译型语言,适合企业级应用、安卓开发。
2.流程图
2.1 流程图的概念
流程图(Flowchart):流程图是对某一个问题的定义、分析或解法的图形表示,图中用各种符号来表示操作、数据、流向以及装置等。 使用图形表示算法的思路是一种极好的方法,因为千言万语不如一张图。流程图在汇编语言和早期的BASIC语言环境中得到应用。相关的还有一种PAD图,对PASCAL或C语言都极适用。

2.2 绘制流程图
-
起始 / 结束框:椭圆框,表示程序开始或结束。

-
处理框:矩形框,表示赋值、计算等操作。

-
判断框:菱形框,表示条件判断(如if语句)。

-
流程线:箭头线,表示执行顺序。

2.3 三种基本结构的流程图
- 顺序结构:按顺序执行操作(如先输入再输出)。
- 分支结构:根据条件选择执行路径(如if-else)。
- 循环结构:重复执行某段代码(如for、while)。
2.4 描述流程图
如果你想要编写一个程序来判断一个人是否成年,可以这样画流程图:
开始 -> 输入年龄 -> 判断年龄是否大于等于18岁 -> 如果是,则输出“成年”;如果不是,则输出“未成年” -> 结束
3.ASCII 编码
3.1 常见字符的 ASCII 编码
ASCII字符集如下图所示:
需要关注0,A,a的码值。
3.2 字符编码之间的相互转换
- 字符转 ASCII 码:int code = (int)‘a’;(code=97)
- ASCII 码转字符:char ch = (char)65;(ch=‘A’)
- 数字字符转数值:‘5’ - ‘0’ = 5(利用码值差计算)
4.类型转换
在C++中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。
C++提供了多种方式进行类型转换,包括隐式转换、显式转换(强制类型转换)以及更安全的类型转换操作符。
4.1 隐式转换
隐式转换通常由编译器自动执行,前提是源类型和目标类型之间存在标准转换序列。这些转换通常是安全的,并且不会导致数据丢失或不确定的行为。
- 在算术表达式中,如果操作数的类型不同,编译器会尝试将它们转换为相同的类型以进行计算。
int a = 5;
cout<<a+0.5; // 隐式转换:int到double
2.当一个表达式需要某种类型的值而实际提供的却是另一种类型时,如果这两种类型之间可以安全地相互转换,编译器就会执行这种转换。例如,将整数赋给浮点型变量:
int a = 5;
double b = a; // 隐式转换:int到double
整型到浮点型:可以将任何整数类型(如int、long)隐式转换为浮点类型(如float、double)。
浮点型到整型:这种转换是不允许隐式进行的,因为可能会导致数据丢失(小数部分被截断)。
4.2 显示转换
显式转换需要明确指定,它允许更广泛的类型转换,但也可能引入错误或不安全的操作。
- C风格的强制类型转换,这是最简单的形式,但也是最不安全的一种,因为它不会检查转换的有效性或合理性。
double d = 3.14;
int i = (int)d; // C风格转换:double到int 也可以写成 int i=int(d);
- C++类型转换操作符,static_cast<new_type>(expression):用于基本的数据类型转换,也可以用于相关的类指针/引用之间的转换。
double d = 3.14;
int i = static_cast<int>(d); // 使用static_cast进行转换
5.多层分支结构
5.1 if 语句、if…else 语句、switch 语句的嵌套
- if-else 嵌套示例:
// 三数判断大小
int a,b,c;
cin>>a>>b>>c;
if(a>b){
if(a>c){
cout<<a;
}else{
cout<<c;
}
}else{
if(b>c){
cout<<b;
}else{
cout<<c;
}
}
- switch 嵌套 if 示例:
// 根据月份和日期判断季节(简化版)
int month, day;
cin >> month >> day;
switch (month) {
case 3:
if (day >= 21) cout << "春季"; // 春分后
else cout << "冬季";
break;
case 6:
if (day >= 22) cout << "夏季"; // 夏至后
else cout << "春季";
break;
// 省略其他月份...
}
6.多层循环语句
6.1 while 循环、do…while 循环、for 循环的嵌套
- for 循环嵌套示例(打印九九乘法表):
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
cout << j << "×" << i << "=" << i*j << "\t";
}
cout << endl;
}
- while 与 do-while 嵌套示例(求 100 以内质数):
#include <iostream>
using namespace std;
int main() {
// 定义整型变量 n 并初始化为 2,从 2 开始判断质数
int n = 2;
// 当 n 小于等于 100 时,继续循环
while (n <= 100) {
// 定义整型变量 i 并初始化为 2,用于判断 n 是否能被 i 整除
int i = 2;
// 定义布尔型变量 is_prime 并初始化为 true,表示假设 n 是质数
bool is_prime = true;
// 至少执行一次 do 里面的代码,判断 n 是否能被 i 整除
do {
// 如果 n 能被 i 整除
if (n % i == 0) {
// 说明 n 不是质数,将 is_prime 设为 false
is_prime = false;
// 跳出 do - while 循环
break;
}
// i 加 1
i++;
} while (i * i <= n); // 只需检查到 √n
// 如果 is_prime 为 true,说明 n 是质数,输出 n
if (is_prime) cout << n << " ";
// n 加 1,继续判断下一个数
n++;
}
return 0;
}
7.数学函数
7.1 绝对值函数:abs()
- 功能介绍:
绝对值是一个数在数轴上到原点的距离,因此绝对值总是非负的。例如:
5 的绝对值是 5
-5 的绝对值也是 5
在 C++ 中,abs() 函数用于计算一个数的绝对值,支持多种数值类型:
整数版本:int abs(int x)
浮点数版本:double abs(double x)(需包含 <cmath>)
- 头文件:
#include <cmath>
- 程序示例:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int a = -5;
double b = -3.14;
cout << abs(a) << endl; // 输出:5
cout << abs(b) << endl; // 输出:3.14
}
7.2 平方根函数:sqrt()
- 功能介绍:
平方根是一个数的平方等于给定数的数值。例如:
16 的平方根是 4,因为 4² = 16
2 的平方根约为 1.414,因为 1.414² ≈ 2
在 C++ 中,sqrt() 函数用于计算非负数的算术平方根,参数和返回值均为 double 类型。注意:传入负数会导致域错误(返回 NaN)。
- 头文件:
#include <cmath>
- 程序示例:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
double x = 16.0;
cout << "√16 = " << sqrt(x) << endl; // 输出:4.0
// 判断一个数是否为完全平方数
int n = 25;
int root = sqrt(n);
bool isPerfectSquare = (root * root == n);// (sqrt(n) == int(sqrt(n)));
cout << n << " 是完全平方数吗? " << (isPerfectSquare ? "是" : "否") << endl; // 输出:是
// 错误示例:传入负数会导致运行时错误
// cout << sqrt(-4.0) << endl; // 不要这样做!
}
7.3 最大值函数:max()
- 功能介绍:
max() 函数返回两个同类型参数中的较大值,支持数值类型和部分自定义类型。其实现基于比较运算符 <,因此参数类型必须支持该运算符。
在竞赛中,max() 常用于:
- 动态规划中的状态转移(如最大子数组和)
- 区间问题中的边界处理
- 头文件:
#include <algorithm>
- 程序示例:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a = 10, b = 20;
cout << "较大值: " << max(a, b) << endl; // 输出:20
}
7.4 最小值函数:min()
- 功能介绍:
min() 函数与 max() 对称,返回两个同类型参数中的较小值。同样基于 < 运算符实现,常用于:
- 贪心算法中的最优选择
- 区间问题中的边界计算
- 头文件:
#include <algorithm>
- 程序示例:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int x = 5, y = 3;
cout << "较小值: " << min(x, y) << endl; // 输出:3
}
7.6 随机数函数:rand()/srand()及相关
- 功能介绍:
- rand():生成 0 到 RAND_MAX(通常为 32767)的伪随机整数
- srand(seed):设置随机数种子,相同的种子会生成相同的随机数序列
在竞赛中,随机数常用于:
- 随机化算法(如快速排序的随机化版本)
- 测试数据生成
随机数范围控制:
- 生成 [0, n) 范围内的随机数
int x = rand() % n; // 生成0到n-1之间的整数
- 生成 [a, b] 范围内的随机数
int x = a + rand() % (b - a + 1); // 生成a到b之间的整数
- 头文件:
#include <cstdlib> // rand(), srand()
#include <ctime> // time()
- 程序示例:
#include <iostream>
#include <cstdlib>
using namespace std;
int main() {
// 生成10个随机数
for (int i = 0; i < 10; i++) {
cout << rand() << endl;
}
}
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
// 生成[a, b]范围内的随机整数
int random(int a, int b) {
return a + rand() % (b - a + 1);
}
int main() {
// 设置随机数种子(以当前时间为种子)
srand(time(0));
// 生成10个1-100的随机数
for (int i = 0; i < 10; i++) {
cout << random(1, 100) << " ";
}
cout << endl;
// 注意:若不设置种子,每次运行结果相同
// srand(1); // 取消注释此行,每次运行结果将固定
}
7.7 pow() - 幂函数
- 功能介绍:
pow(x, y) 计算 (x^y),即 x 的 y 次幂。返回值为 double 类型,参数 x 和 y 可以是整数或浮点数。
在竞赛中,需注意:
- 对于整数幂,推荐使用快速幂算法(避免精度丢失)
- 大数幂取模需使用模运算性质
- 头文件:
#include <cmath>
- 程序示例:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
// 标准库pow函数
double x = 2.0, y = 3.0;
cout << "2^3 = " << pow(x, y) << endl; // 输出:8.0
}
7.8 swap() - 交换函数
- 功能介绍:
swap(a, b) 用于交换两个同类型变量的值,无需临时变量。在竞赛中常用于:
- 排序算法(如冒泡排序、快速排序)
- 数组元素位置调整
- 头文件:
#include <algorithm>
- 程序示例:
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a = 5, b = 10;
swap(a, b);
cout << "交换后: a=" << a << ", b=" << b << endl; // 输出:a=10, b=5
}
更多推荐



所有评论(0)