GESP-C++考试(四级)考试重点 (附:【编程题模板】大全)

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 Person { string name; Date birthday; }; 

(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; 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 → 小规模矩阵/子矩形统计问题

Read more

Java分治算法题目练习(快速/归并排序)

Java分治算法题目练习(快速/归并排序)

分治算法 * 颜色分类 * 排序数组(快排) * 数组中第K个最大元素 * 最小的K个数 * 排序数组(归并) * 交易逆序对的总数 * 翻转对 * 计算右侧小于当前元素的个数 使用快速排序和归并排序进行解决问题,因为这两个都是采用归并的思想 颜色分类 题目解析:将其数组中0放在左边,1放在中间,2放在右边 在双指针算法中有一个移动零的题目,就是将所有0元素移动到右边,但是非0元素相对位置不改变 那题使用双指针将其数组分为三部分,因此这题也可以将其数组分块 left表示为0区域最右侧,i遍历数组,right表示2区域最左侧 使用这三个指针将这个数组分为了4部分 classSolution{publicvoidsortColors(int[] nums){//可以将其数组分为三部分//[0,left]:全是0//[left+1,i-1]全都是1//[i,right-1]待扫描//[right,n-1]全是2int left =-1;int i =0;

By Ne0inhk

OpenHashTab 文件哈希校验工具完整使用指南:三步轻松搞定文件完整性验证

OpenHashTab 文件哈希校验工具完整使用指南:三步轻松搞定文件完整性验证 【免费下载链接】OpenHashTab📝 File hashing and checking shell extension 项目地址: https://gitcode.com/gh_mirrors/op/OpenHashTab 在数字时代,文件完整性验证变得尤为重要。无论是下载软件、传输重要文档还是验证系统文件,文件哈希校验都是确保数据安全的关键步骤。OpenHashTab作为一款免费开源的文件哈希校验工具,让这一复杂过程变得简单直观。 🔍 为什么您的电脑需要文件哈希校验工具? 每天我们都在下载和使用各种文件,但您是否曾担心: * 下载的文件是否完整无损? * 重要文档在传输过程中是否被篡改? * 软件安装包是否来自官方源? OpenHashTab正是为解决这些问题而生,它通过计算文件的数字指纹(哈希值),为您提供可靠的完整性验证方案。 🚀 快速上手:三步完成文件哈希校验 第一步:轻松安装OpenHashTab 新手推荐安装方式: 下载最新版本的安装程序,双击运行后按照

By Ne0inhk
Flutter 组件 vnlunar 适配鸿蒙 HarmonyOS 实战:高精度农历算法,构建民俗文化日期与节气治理架构

Flutter 组件 vnlunar 适配鸿蒙 HarmonyOS 实战:高精度农历算法,构建民俗文化日期与节气治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 vnlunar 适配鸿蒙 HarmonyOS 实战:高精度农历算法,构建民俗文化日期与节气治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全球化部署、涉及多语言本地化(L10n)及深层文化特性适配的背景下,如何实现准确的阴阳历(农历)转换、二十四节气计算及民俗节日提醒,已成为提升应用“人文温度”与本地化竞争力的核心要素。在鸿蒙设备这类强调分布式时间同步与低功耗常驻显示(AOD)的环境下,如果应用依然依赖简单的查表法或通过网络接口获取农历信息,由于由于闰月计算的复杂性或离线环境限制,极易由于由于计算偏移导致传统节日提醒的误报。 我们需要一种能够实现天文级算法推演、支持高精度节气定位且具备纯 Dart 离线运作能力的历法治理方案。 vnlunar 为 Flutter 开发者引入了标准化的阴阳历转换协议。它不仅支持对天干地支、生肖及闰月的精确解构,更针对东南亚等地区的历法细微差异提供了专项适配。在适配到鸿蒙 HarmonyOS 流程

By Ne0inhk
【MADRL】多智能体双延迟深度确定性策略梯度(MATD3)算法

【MADRL】多智能体双延迟深度确定性策略梯度(MATD3)算法

本篇文章是博主强化学习RL领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在强化学习专栏:        强化学习(7)---《【MADRL】多智能体双延迟深度确定性策略梯度(MATD3)算法》 多智能体双延迟深度确定性策略梯度(MATD3)算法 目录 1.MATD3算法介绍 2.背景 3.算法结构 4.具体公式 5.算法流程 6.公式总结 7.优势与应用场景 8.总结  [Python] MATD3实现(可移植) 1.MATD3算法介绍         MATD3(Multi-Agent Twin Delayed Deep Deterministic Policy Gradient)是基于TD3(Twin

By Ne0inhk