跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

GESP-C++ 四级考试重点与编程题模板

GESP-C++ 四级考试涵盖指针、数组、结构体、函数、递推算法、排序算法、文件操作及异常处理等核心知识点。文章整理了常见编程题模板,包括二维数组处理、结构体排序、最大连续子序列、矩阵运算、前缀和及字符串处理等实用代码示例。通过梳理基础概念与算法复杂度分析,帮助考生掌握冒泡、插入、选择排序特性,熟悉 STL 排序用法,并提供暴力枚举与前缀和优化方案,适用于备考 CCF GESP 四级认证。

并发大师发布于 2026/3/23更新于 2026/10/16110 浏览
GESP-C++ 四级考试重点与编程题模板

GESP-C++ 考试四级(考前快速复习)

一、知识点复习

1. 指针(Pointer)

(1)概念:指针是存储变量地址的变量。

(2)定义:

int a = 5; int* p = &a; // 定义指向 a 的指针 

(3)解引用:

cout << *p; // 输出 a 的值 5 

(4)注意事项

指针变量类型必须与所指向变量类型一致。空指针 nullptr,防止野指针。

2. 二维及多维数组

(1)数组定义:

int a[3][4]; // 3 行 4 列二维数组 int b[2][3][4]; // 三维数组 

(2)索引访问:

a[1][2] = 10; // 给第二行第三列赋值 
3. 结构体(Struct)

(1)定义与使用:

struct Student { string name; int age; double score; }; Student s1; s1.name = "Alice"; s1.age = 10;

(2)结构体数组:

Student s[10]; 

(3)结构体指针:

Student* p = &s1; cout << p->name;

(4)结构体嵌套结构体:

struct Date { int day, month, year; }; struct  { string name; Date birthday; };
Person

(5)结构体做函数参数:

void printStudent(const Student &s) { cout << s.name; }

(6)const 使用场景:

传递函数参数时防止修改原结构体。

4. 函数(Function)

(1) 声明与定义:

int add(int a, int b); // 声明 int add(int a, int b) { return a + b; } // 定义 

(2) 调用:

int c = add(2,3);

(3) 形参 & 实参:

形参:函数定义中的变量 实参:调用函数时传入的值

(4) 变量作用域:

局部变量:函数内部定义,仅函数内有效 全局变量:函数外定义,全局可访问

(5) 参数传递方式:

// 值传递 void f(int x) { x++; } // 引用传递 void f(int &x) { x++; } // 指针传递 void f(int *x) { (*x)++; }
5. 递推算法(Recurrence / DP)

(1) 基本思想:

通过前面已知的结果推导后续结果

(2) 递推关系式:

f(n) = f(n-1) + f(n-2);

(3) 例:斐波那契:

int fib(int n) { if(n<=2) return 1; return fib(n-1)+fib(n-2); }
6. 排序算法

(1) 冒泡排序:

for(int i=0;i<n-1;i++) for(int j=0;j<n-1-i;j++) if(a[j]>a[j+1]) swap(a[j], a[j+1]);

(2) 插入排序:

for(int i=1;i<n;i++){ int key=a[i], j=i-1; while(j>=0 && a[j]>key){ a[j+1]=a[j]; j--; } a[j+1]=key; }

(3) 选择排序:

for(int i=0;i<n-1;i++){ int min_idx=i; for(int j=i+1;j<n;j++) if(a[j]<a[min_idx]) min_idx=j; swap(a[i],a[min_idx]); }

(4) 算法分析:

  • 时间复杂度:O(n²)
  • 空间复杂度:O(1) 稳定性:

选择 → 不稳定 冒泡、插入 → 稳定

7. 文件操作
// 重定向输入输出 freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); // 文件读写 ofstream fout("data.txt"); fout << "Hello\n"; fout.close(); ifstream fin("data.txt"); string s; fin >> s; fin.close();
8. 异常处理
try { int x = 10/0; } catch(exception &e) { cout << "Error: " << e.what(); }

二、GESP-C++ 考试四级编程题模板

1. 二维数组处理模板
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int a[N][N];
int main() {
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin >> a[i][j];
    // 示例操作:求二维数组元素和
    int sum = 0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            sum += a[i][j];
    cout << sum << endl;
    return 0;
}
2. 结构体数组排序模板
#include <bits/stdc++.h>
using namespace std;
struct Item {
    string name;
    int price;
    int priority;
};
bool cmp(const Item &a, const Item &b) {
    if(a.priority != b.priority) return a.priority < b.priority;
    if(a.price != b.price) return a.price < b.price;
    return a.name < b.name;
}
int main() {
    int n;
    cin >> n;
    Item items[n];
    for(int i=0;i<n;i++) cin >> items[i].name >> items[i].price >> items[i].priority;
    sort(items, items+n, cmp);
    for(int i=0;i<n;i++) cout << items[i].name << endl;
    return 0;
}
3. 最大连续子序列/区间处理
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin >> a[i];
    int cnt=1, mx=1;
    for(int i=1;i<n;i++){
        if(a[i]==a[i-1]+1) cnt++;
        else cnt=1;
        mx = max(mx, cnt);
    }
    cout << mx << endl;
    return 0;
}
4. 二维矩阵最大矩形/子矩形
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int a[N][N];
int main(){
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin >> a[i][j];
    int ans=0;
    for(int u=1;u<=n;u++)
        for(int l=1;l<=m;l++)
            for(int d=u;d<=n;d++){
                int chk=1;
                for(int r=l;r<=m;r++){
                    for(int x=u;x<=d;x++) chk &= a[x][r];
                    if(!chk) break;
                    ans = max(ans, (r-l+1)*(d-u+1));
                }
            }
    cout << ans << endl;
    return 0;
}
5. 矩阵/字符处理
#include <bits/stdc++.h>
using namespace std;
char s[105][105];
int main(){
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++) cin >> s[i]+1;
    // 输出子矩阵
    int x1,x2,y1,y2;
    cin >> x1 >> x2 >> y1 >> y2;
    for(int i=x1;i<=x2;i++){
        s[i][y2+1]=0;
        cout << s[i]+y1 << endl;
    }
    return 0;
}
6. 常见遍历方向数组模板
const int d[4][2] = {{-1,0},{1,0},{0,-1},{0,1}}; // 上下左右
for(int k=0;k<4;k++){
    int ni = i + d[k][0];
    int nj = j + d[k][1];
}
7. 前缀和 / 子矩阵和模板
int sum[N][N];
for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        sum[i][j] = a[i][j] + sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1];
// 区域和
int x1,y1,x2,y2;
int ans = sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];
8. 排序 + 条件统计模板
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    for(int i=0;i<n;i++) cin >> a[i];
    sort(a.begin(), a.end());
    int ans=0;
    for(int i=0;i<n;i++)
        for(int j=i+1;j<n;j++)
            if(a[i]<a[j]) ans++;
    cout << ans << endl;
}

三、C++ 四级考前快速复习汇总表

1. 基础知识点
知识点关键内容示例
指针存储变量地址的变量int a=5; int* p=&a; cout<<*p;
二维/多维数组定义、访问int a[3][4]; a[1][2]=10;
结构体定义、数组、指针、嵌套struct Student{string name; int age;}; Student s[10];
函数定义、声明、调用,形参/实参int add(int x,int y){return x+y;} int c=add(2,3);
作用域局部 vs 全局int x; // 全局
传参方式值传递、引用、指针void f(int &x){x++;}
递推算法由前推后f(n)=f(n-1)+f(n-2);
排序算法冒泡/插入/选择sort(a,a+n);
文件操作重定向/读/写freopen("in.txt","r",stdin);
异常处理try/catchtry{…} catch(exception &e){…}
2. 算法复杂度
算法时间复杂度空间复杂度稳定性
冒泡O(n²)O(1)稳定
插入O(n²)O(1)稳定
选择O(n²)O(1)不稳定
快排O(n log n)O(log n)不稳定

四、CCF GESP 四级 C++ 编程题模板库(速查表)

1. 数组/二维数组基础模板

1、一维数组输入/输出

int a[N], n;
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
for(int i=1;i<=n;i++) cout << a[i] << " ";

解析:

  • 考场常用输入 n 个数并输出。
  • 下标可从 1 或 0 开始。

2、二维数组输入/输出

int a[N][N], n, m;
cin >> n >> m;
for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        cin >> a[i][j];

解析:

  • 适合矩阵处理题,如最大子矩形、子矩阵和。
  • 可以与 前缀和/子矩阵计算 模板结合。
2. 排序模板

1、冒泡排序(可指定区间)

void bubbleSort(int *a, int l, int r){
    bool flag = true;
    while(flag){
        flag = false;
        for(int i=l;i<r;i++){
            if(a[i] > a[i+1]){
                swap(a[i], a[i+1]);
                flag = true;
            }
        }
    }
}

解析:

  • 可对数组部分区间排序。
  • 小规模 n ≤ 1000 时可用。

2、STL 排序(数组) (1)数组排序:下标从 0 开始

int a[10];
int n = 10;
sort(a, a+n); // 排序 a[0] ~ a[9]
  • 这是 C++ 默认习惯,也是 STL 容器的标准索引方式

(2)数组排序:下标从 1 开始(考试常用)

int a[110];
int n;
cin >> n;
for(int i=1;i<=n;i++) cin >> a[i];
sort(a+1, a+n+1); // 排序 a[1] ~ a[n]
  • a+1 指向 a[1]
  • a+n+1 是 开区间右端点,所以最后会排序到 a[n]

(3)总结:

数组排序 从 0 开始 → sort(a, a+n) 数组排序 从 1 开始 → sort(a+1, a+n+1)

3、STL 排序(vector)

vector<int> v;
sort(v.begin(), v.end());

vector 下标一定是 0 开始.begin() 指向第一个元素.end() 指向最后元素之后的位置(开区间)不需要加 +1,直接用 .begin(), .end()

3. 矩阵/子矩阵处理模板

1、检查固定子矩阵匹配(2024 年 9 月编程题第一题)

bool check(int xa,int ya){
    for(int i=0;i<4;i++)
        for(int j=0;j<4;j++)
            if(w[xa+i][ya+j]!=match[i][j]) return false;
    return true;
}
  • 适合 4x4 或固定大小图形匹配题。

2、可变大小矩形检查(2024 年 6 月第一题)

bool check(int xa,int ya,int xb,int yb){
    int cnt[2]={0};
    for(int i=xa;i<=xb;i++)
        for(int j=ya;j<=yb;j++)
            cnt[w[i][j]]++;
    return cnt[0]==cnt[1];
}
  • 适合统计矩形中某些条件数量。
  • 可结合 暴力枚举 或 前缀和优化。

3、最大子矩形(2024 年 6 月第一题)

int ans = 0;
for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        for(int ii=i;ii<=n;ii++)
            for(int jj=j;jj<=m;jj++)
                if(check(i,j,ii,jj)) ans = max(ans,(ii-i+1)*(jj-j+1));
    cout << ans << "\n";
  • 使用暴力枚举查找满足条件的最大矩形。
4. 递推/构造序列模板

1、构造特殊序列(2024 年 12 月第一题)

a[1]=1; vis[1]=1;
for(int i=2;i<=n;i++){
    if(a[i-1]-i<=0 || vis[a[i-1]-i]) a[i]=a[i-1]+i;
    else a[i]=a[i-1]-i;
    vis[a[i]]=1;
}
sort(a+1,a+n+1);

2、分析:

用于生成满足约束的序列。vis[] 用于记录已使用数字。

5. 滑动/区间和子数组模板

1、最大区间和/和满足条件的子序列(2024 年 6 月第二题)

sort(a+1,a+n+1);
int ans=0;
for(int i=1;i<=n;i++){
    int sum=0;
    for(int j=i;j>=1;j--){
        if(a[i]-a[j]<=k) sum+=a[j];
        else break;
    }
    ans = max(ans,sum);
}
cout << ans << "\n";

2、分析:

用于 连续/可滑动窗口求和。常见题型:限制差值 k 的最大和。

6. 排序 + 贪心/统计模板

6.1 贪心匹配/计数(2024 年 3 月第二题)

sort(a+1,a+n+1);
int ans=0,s=1;
for(int j=1;j<=m;j++)
    for(int k=s;k<=n;k++){
        if(j<=a[k]){
            ans++;
            a[k]=j;
            s=k;
            break;
        }
    }
cout << ans;

2、分析:

贪心选择最小可行元素。常见题型:分配/匹配问题。

7. 字符串相似性判断模板

1、判断是否相似(2024 年 3 月第一题)

bool isSimilar(string A,string B){
    int m=A.size(), n=B.size();
    if(abs(m-n)>1) return false;
    if(m==n){
        int diff=0;
        for(int i=0;i<m;i++)
            if(A[i]!=B[i])
                if(++diff>1) return false;
        return true;
    } else {
        string &shorter=(m<n?A:B), &longer=(m<n?B:A);
        int i=0,j=0,diff=0;
        while(i<shorter.size() && j<longer.size()){
            if(shorter[i]!=longer[j]){
                if(++diff>1) return false;
                ++j;
            } else {
                ++i; ++j;
            }
        }
        return true;
    }
}

2、分析:

用于检查两个字符串是否最多相差一个字符。可扩展到字符串编辑距离问题。

8. 字符串排序 + 合并检查模板

1、字典序排序 + 合并(2024 年 12 月第二题)

sort(s+1,s+n+1);
string combined;
for(int i=1;i<=n;i++) combined += s[i];
bool ok=true;
for(int i=1;i<combined.size();i++)
    if(combined[i]<combined[i-1]) ok=false;
cout << ok << "\n";

2、分析:

适合题型:多字符串排序后检查整体非下降。可以用 STL sort。

9. 四级考试需要掌握编程知识点
  1. 数组/矩阵模板 → 矩阵最大子矩形、子矩阵和
  2. 排序模板 → 冒泡、STL、区间排序、字符串排序
  3. 递推/构造模板 → 特殊序列生成
  4. 贪心/滑动窗口 → 区间和、最大和、分配匹配
  5. 字符串模板 → 相似性判断、字典序排序、合并检查
  6. 暴力枚举 + check → 小规模矩阵/子矩形统计问题

目录

  1. GESP-C++ 考试四级(考前快速复习)
  2. 一、知识点复习
  3. 1. 指针(Pointer)
  4. 2. 二维及多维数组
  5. 3. 结构体(Struct)
  6. 4. 函数(Function)
  7. 5. 递推算法(Recurrence / DP)
  8. 6. 排序算法
  9. 7. 文件操作
  10. 8. 异常处理
  11. 二、GESP-C++ 考试四级编程题模板
  12. 1. 二维数组处理模板
  13. 2. 结构体数组排序模板
  14. 3. 最大连续子序列/区间处理
  15. 4. 二维矩阵最大矩形/子矩形
  16. 5. 矩阵/字符处理
  17. 6. 常见遍历方向数组模板
  18. 7. 前缀和 / 子矩阵和模板
  19. 8. 排序 + 条件统计模板
  20. 三、C++ 四级考前快速复习汇总表
  21. 1. 基础知识点
  22. 2. 算法复杂度
  23. 四、CCF GESP 四级 C++ 编程题模板库(速查表)
  24. 1. 数组/二维数组基础模板
  25. 2. 排序模板
  26. 3. 矩阵/子矩阵处理模板
  27. 4. 递推/构造序列模板
  28. 5. 滑动/区间和子数组模板
  29. 6. 排序 + 贪心/统计模板
  30. 7. 字符串相似性判断模板
  31. 8. 字符串排序 + 合并检查模板
  32. 9. 四级考试需要掌握编程知识点

更多推荐文章

查看全部
  • Claude Skills 与 MCP 对比:为何 Skills 更省 Token 且易用
  • 前端面试实战经验总结与高频面试题整理
  • AI 产品经理与传统产品经理的核心差异分析
  • Python 正则表达式详解与实战案例
  • 接入第三方 OpenAI 兼容模型到 GitHub Copilot
  • OpenClaw 入门指南:本地部署与 AI 智能体实操
  • 基于 TensorFlow.js 的前端人脸识别开发实战
  • Linux 部署 OpenClaw 指南
  • Axios 错误处理进阶封装:实现网络层数据与状态解耦
  • 基于Python的高校毕业生招聘信息推荐系统设计与实现
  • JSON-java CDL转换终极指南:快速掌握逗号分隔列表与JSONArray互转技巧
  • AI 大模型在软件开发中的应用场景与实战指南
  • STL 源码剖析:list 容器从迭代器到算法实现
  • 基于深度学习的无人机洪水灾害图像分割与水量估算
  • AI 时代产品经理成长指南与核心能力模型
  • 2025 年 DeepSeek 开启 AI 算法变革元年深度解析
  • C++ STL 基础:迭代器、auto 与范围循环
  • 前端团队协作最佳实践与效率提升
  • AIGC 在现代教育技术中的应用与前景
  • STM32 摄像头颜色识别实战:OV7725/OV2640 驱动与算法解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online