系列文章目录

学习路线: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 计算机网络分类

  1. 网络的地理范围进行分类:
  • 广域网(WAN):覆盖范围广(如互联网),由多个网络互联而成,速度较慢。
  • 城域网(MAN):覆盖城市范围(如市政网络),介于 WAN 和 LAN 之间。
  • 局域网(LAN):覆盖小范围(如家庭、教室),速度快,安全性较高。
  1. 按网络的拓扑结构进行分类:

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 字符编码之间的相互转换

  1. 字符转 ASCII 码:int code = (int)‘a’;(code=97)
  2. ASCII 码转字符:char ch = (char)65;(ch=‘A’)
  3. 数字字符转数值:‘5’ - ‘0’ = 5(利用码值差计算)

4.类型转换

在C++中,类型转换是将一个数据类型的值转换为另一个数据类型的过程。
C++提供了多种方式进行类型转换,包括隐式转换、显式转换(强制类型转换)以及更安全的类型转换操作符。

4.1 隐式转换

隐式转换通常由编译器自动执行,前提是源类型和目标类型之间存在标准转换序列。这些转换通常是安全的,并且不会导致数据丢失或不确定的行为。

  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 显示转换

显式转换需要明确指定,它允许更广泛的类型转换,但也可能引入错误或不安全的操作。

  1. C风格的强制类型转换,这是最简单的形式,但也是最不安全的一种,因为它不会检查转换的有效性或合理性。
double d = 3.14;
int i = (int)d;  // C风格转换:double到int 也可以写成  int i=int(d);
  1. 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 语句的嵌套

  1. 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;
	}
}
  1. 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 循环的嵌套

  1. for 循环嵌套示例(打印九九乘法表):
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        cout << j << "×" << i << "=" << i*j << "\t";
    }
    cout << endl;
}
  1. 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()

  1. 功能介绍:

绝对值是一个数在数轴上到原点的距离,因此绝对值总是非负的。例如:

5 的绝对值是 5
-5 的绝对值也是 5

在 C++ 中,abs() 函数用于计算一个数的绝对值,支持多种数值类型:

整数版本:int abs(int x)
浮点数版本:double abs(double x)(需包含 <cmath>
  1. 头文件:
#include <cmath>    
  1. 程序示例:
#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()

  1. 功能介绍:

平方根是一个数的平方等于给定数的数值。例如:

16 的平方根是 4,因为 4² = 16
2 的平方根约为 1.414,因为 1.414² ≈ 2

在 C++ 中,sqrt() 函数用于计算非负数的算术平方根,参数和返回值均为 double 类型。注意:传入负数会导致域错误(返回 NaN)。

  1. 头文件:
#include <cmath>
  1. 程序示例:
#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()

  1. 功能介绍:

max() 函数返回两个同类型参数中的较大值,支持数值类型和部分自定义类型。其实现基于比较运算符 <,因此参数类型必须支持该运算符。

在竞赛中,max() 常用于:

  • 动态规划中的状态转移(如最大子数组和)
  • 区间问题中的边界处理
  1. 头文件:
#include <algorithm>
  1. 程序示例:
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int a = 10, b = 20;
    cout << "较大值: " << max(a, b) << endl;  // 输出:20
}

7.4 最小值函数:min()

  1. 功能介绍:

min() 函数与 max() 对称,返回两个同类型参数中的较小值。同样基于 < 运算符实现,常用于:

  • 贪心算法中的最优选择
  • 区间问题中的边界计算
  1. 头文件:
#include <algorithm>
  1. 程序示例:
#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int x = 5, y = 3;
    cout << "较小值: " << min(x, y) << endl;  // 输出:3
}

7.6 随机数函数:rand()/srand()及相关

  1. 功能介绍:
  • 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之间的整数
  1. 头文件:
#include <cstdlib>  // rand(), srand()
#include <ctime>    // time()
  1. 程序示例:
#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() - 幂函数

  1. 功能介绍:
    pow(x, y) 计算 (x^y),即 x 的 y 次幂。返回值为 double 类型,参数 x 和 y 可以是整数或浮点数。

在竞赛中,需注意:

  • 对于整数幂,推荐使用快速幂算法(避免精度丢失)
  • 大数幂取模需使用模运算性质
  1. 头文件:
#include <cmath>
  1. 程序示例:
#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() - 交换函数

  1. 功能介绍:

swap(a, b) 用于交换两个同类型变量的值,无需临时变量。在竞赛中常用于:

  • 排序算法(如冒泡排序、快速排序)
  • 数组元素位置调整
  1. 头文件:
#include <algorithm>
  1. 程序示例:
#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
}
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐