当前位置: 首页 > news >正文

CCF-GESP 等级考试 2024年6月认证C++四级真题解析

2024年6月真题

一、单选题(每题2分,共30分)

在这里插入图片描述
正确答案:B
考察知识点:函数的定义与调用、形参与实参、函数参数传递的概念
解析:调用func函数,func函数参数的传递方式为值传递,函数内对形参的改变不会对实参产生影响。函数内对形参x和y进行了值交换,因此func函数内输出为24 12,main函数中c和d仍为12 24,因此整体输出为24 12 12 24。答案为B。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:函数的定义与调用
解析:C++ 中函数调用需满足 “先声明后使用”。选项 B 中main函数调用func()时,func函数未声明也未定义,会导致编译错误。答案为B。

在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:变量的作用域
解析:程序执行流程:
首先输出main函数中的i=2;
for循环内定义的int i=10是局部变量,输出10;
循环结束后,main函数的i执行i=i+1,变为3并输出;
最后i=ii(即33=9)并输出。
因此输出序列为2 10 3 9。答案为B。

在这里插入图片描述
正确答案:D
考察知识点:C++指针类型的概念及基本应用
解析:int类型占 4 字节,指针p初始指向a的地址0x6ffe14,p++后指针向后移动一个int的字节数(4 字节),因此新地址为0x6ffe14 + 4 = 0x6ffe18。答案为 D。

在这里插入图片描述
在这里插入图片描述
正确答案:B
考察知识点:二维数组与多维数组基本应用、C++指针类型的概念及基本应用
解析:二维数组a[2][3]中,a是数组首地址,a+1表示跳过一个一维子数组(每个子数组有 3 个int元素,每个int占 4 字节,共3×4=12字节,即十六进制的0xC)。初始地址是0x6ffe00,则a+1的地址为0x6ffe00 + 0xC = 0x6ffe0C。答案为B。

在这里插入图片描述
正确答案:D
考察知识点:文件重定向与文件读写操作
解析:“GESP.txt” 是相对路径,仅指定文件名,依赖当前工作目录定位文件;而绝对路径会包含从根目录开始的完整路径。A 选项指定当前工作目录同级的文件,B 选项指定上一级目录 data 下的文件,C 选项指定同级目录 data 下的文件,均正确。答案为D。

在这里插入图片描述
正确答案:D
考察知识点:排序算法
解析:直接插入排序是就地排序,仅需常数级额外空间,空间复杂度为O(1)O(1)O(1),而非O(n)O(n)O(n)。答案为D。

在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:排序算法
解析:这段代码是冒泡排序的实现,冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止。当a[j] > a[j+1]时,需要交换这两个元素。程序中定义了swap函数(接收引用参数,可直接交换实参值),因此横线处应填入swap(a[j],a[j+1]);,实现相邻元素的交换。答案为A。

在这里插入图片描述
正确答案:A
考察知识点:递推算法
解析: “自己调用自己” 是递归的特征。说法不正确的是 A。答案为A。

在这里插入图片描述
正确答案:B
考察知识点:排序算法
解析:冒泡排序是稳定的排序算法(相等元素的相对顺序在排序后不会改变),而选择排序不稳定,插入排序稳定。选项 D 是稳定排序算法的定义。因此说法错误的是 B。答案选B。

在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:排序算法
解析:冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止。
本题进行从小到大冒泡排序,第一遍冒泡时:
66 与 23 交换→{45,23,66,1,10,97,52,88,5,33}
66 与 1 交换→{45,23,1,66,10,97,52,88,5,33}
66 与 10 交换→{45,23,1,10,66,97,52,88,5,33}
97 与 52 交换→{45,23,1,10,66,52,97,88,5,33}
97 与 88 交换→{45,23,1,10,66,52,88,97,5,33}
97 与 5 交换→{45,23,1,10,66,52,88,5,97,33}
97 与 33 交换→{45,23,1,10,66,52,88,5,33,97}
最终第一遍冒泡后的序列为{45,66,23,1,10,52,88,5,33,97}。答案为A。

在这里插入图片描述
正确答案:D
考察知识点:排序算法
解析:这段代码是插入排序的实现。在while循环中,当a[j] > key时,需要将a[j]后移一位,为key腾出插入位置。因此横线处应填入a[j+1] = a[j];,使a[j]的元素移动到a[j+1]的位置,完成后移操作。答案为D。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
正确答案:A
考察知识点:异常处理、函数的定义与调用
解析:输入为10 0时,Division函数中b=0,触发throw “Division by zero condition!”。程序进入try-catch结构,catch (const char* errmsg)会捕获该异常,输出Division by zero condition!。答案为A。

在这里插入图片描述
正确答案:B
考察知识点:递推算法
解析:当没有直线时,平面是 1 个区域。
当有1条直线时,平面被分成 2 个区域,增加了1个区域。
当有2条直线时,平面最多被分成 4 个区域,增加了2个区域。
当有3条直线时,平面最多被分成 7 个区域,增加了3个区域。
观察可得:每次增加的区域数是当前的直线条数。即 aka_kak=ak−1+ka_{k-1}+kak1+k,可推出当有10条直线,最多可以把平面分为56个区域。答案为B。

在这里插入图片描述
在这里插入图片描述
正确答案:D
考察知识点:C++指针类型的概念及基本应用、二维数组与多维数组基本应用
解析:int类型占 4 字节,++p表示指针向后移动一个int的字节数(4 字节)。已知p初始地址是0x6ffe00,则++p的地址为0x6ffe00 + 4 = 0x6ffe04。答案为D。

二、判断题(每题2分,共20分)

在这里插入图片描述
正确答案:错误
考察知识点:C++指针类型的概念及基本应用、引用
解析:int& a是引用定义,表示a是某个变量的别名,并非取地址操作;而&a(若a是普通变量)才是取地址操作,用于获取a的内存地址。二者语义完全不同,不能等同。表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:C++指针类型的概念及基本应用、引用
解析:C++ 中引用必须在定义时立即绑定变量,而代码中int& ra;未绑定,且ra=&a;的赋值操作也是错误的(引用不是指针,不能直接赋值地址)。正确的引用定义应为int& ra = a;,这样才能让ra绑定变量a并正常使用,因此以上代码不能正确执行。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:C++指针类型的概念及基本应用、引用
解析:引用在底层实现上可理解为 “指针常量”—— 它一旦绑定某个变量,就不能再指向其他变量(类似指针常量的 “地址不可变” 特性),且会直接操作绑定变量的内存,这与指针常量的行为逻辑一致。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:二维数组
解析:在 C++ 中,二维数组名a代表数组的首地址,即a[0][0]的地址。&a[0][0]是直接取a[0][0]的地址,因此cout << a和cout << &a[0][0]输出的都是该二维数组首个元素的地址,结果相同。表述正确。

在这里插入图片描述
正确答案:错误
考察知识点:函数的定义与调用
解析:函数可以调用自己,这种机制称为 “递归”。例如计算阶乘的函数fact(n),可通过fact(n) = n * fact(n-1)的递归形式实现,能简洁解决如斐波那契数列、树的遍历等问题。表述错误。

在这里插入图片描述
正确答案:正确
考察知识点:函数参数传递的概念
解析:传常量值:函数接收的是实参的拷贝,函数内修改该拷贝不会影响实参。
常量引用:引用绑定实参,但因是const修饰,函数内无法修改引用指向的实参值。
常量指针:指针指向实参地址,但因是const修饰,函数内无法通过该指针修改实参的值。
这三种方式都能有效防止函数对实参的值或地址进行修改,保证实参的安全性。表述正确。

在这里插入图片描述
在这里插入图片描述
正确答案:正确
考察知识点:C++指针类型的概念及基本应用
解析:int *p = NULL; 这行代码声明了一个整型指针 p,并将其初始化为 NULL。
在 C++ 中,NULL 通常是一个宏,定义为 0(在 C++11 及以后的标准中,更推荐使用 nullptr)。
cout << p << endl; 这行代码输出指针 p 的值。由于 p 被设置为 NULL,其值为 0,所以输出的是地址 0,通常以十六进制形式表示为 0(在某些编译器中可能显示为 0x0 或类似的格式,但本质上就是 0)。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:二维数组与多维数组基本应用
解析:这段程序定义了一个 10×10 的二维数组a,并通过双重循环将数组的主对角线元素(即i==j的位置)设为 1,其余元素保持初始的 0。a[i][j]作为数组元素,和普通整型变量一样可直接赋值、使用。表述正确

在这里插入图片描述
正确答案:正确
考察知识点:递推算法
解析:初始数组为[6],符合 “至少含一个自然数 N=6” 的条件。
向[6]末尾添加 M:M 需是自然数且不超过末尾元素(6)的一半(即≤3),所以 M 可取 1、2、3,得到数组[6,1]、[6,2]、[6,3]。
对[6,2],末尾元素是 2,其一半是 1,M 可取 1,得到[6,2,1];对[6,3],末尾元素是 3,其一半是 1.5,自然数 M≤1.5,即 M=1,得到[6,3,1];[6,1]末尾元素是 1,其一半是 0.5,无自然数 M 可加,因此终止。综上共 6 种。
6 种不同的合法数组分别是[6]、[6,1]、[6,2]、[6,3]、[6,2,1]、[6,3,1]。表述正确。

在这里插入图片描述
正确答案:正确
考察知识点:排序算法
解析:插入排序的算法思想是:将待排序数组分为已排序区间和未排序区间,初始时已排序区间只有第一个元素。然后依次从未排序区间取出元素,插入到已排序区间的合适位置,使已排序区间始终保持有序,重复此过程直到未排序区间元素为空,最终得到有序数组。
插入排序平均时间复杂度为O(n2)O(n^2)O(n2),最坏(逆序)时间复杂度也为O(n2)O(n^2)O(n2)。表述正确。

三、编程题(每题25分,共50分)

在这里插入图片描述
在这里插入图片描述

本题考察:二维数组、子矩阵枚举

#include<bits/stdc++.h>
using namespace std;
int main() {int n, m;char arr[11][11];cin>>n>>m;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {cin>>arr[i][j];}}int res=0;//枚举所有子矩阵:左上角下标(x1, y1),右下角下标(x2,y2),且x1<=x2, y1<=y2for(int x1=1; x1<=n; x1++) {for(int y1=1; y1<=m; y1++) {for(int x2=x1; x2<=n; x2++) {for(int y2=y1; y2<=m; y2++) {//计算子矩阵的黑色格子数int cnt=0;for(int i=x1; i<=x2; i++) {for(int j=y1; j<=y2; j++) {if(arr[i][j]=='0') cnt++;}}//如果子矩阵是平衡子矩形:当且仅当其中黑色格子与白色格子数量相同,更新最大格子数if((x2-x1+1)*(y2-y1+1) == 2*cnt) {res = max(res, (x2-x1+1)*(y2-y1+1));}}}}}cout<<res;return 0;
}

可以看到上述代码通过六层循环实现,时间复杂度为: O ( n 3 ∗ m 3 ) O(n^3*m^3) O(n3m3),本题 1≤n,m≤10,数据量还不大,因此上述思路的代码是能够通过所有样例的。但如果数据量更大一些,上述思路就不太行了,以下给出另一种利用前缀和求解的算法。前缀和算法是2025年新增的CSP考点,其实更早之前就出现过,虽然对四级来说难了一点,但多学点总没坏处。

前缀和是一种预处理数组的算法,通过构建新数组存储原数组前 n 个元素的累加和,快速求解原数组任意区间的和,降低时间复杂度。

可以看到,利用前缀和求解本题,时间复杂度为: O ( n 2 ∗ m 2 ) O(n^2*m^2) O(n2m2)

#include<bits/stdc++.h>
using namespace std;
int main() {int n, m, sum[11][11];char arr[11][11];cin>>n>>m;for(int i=1; i<=n; i++){for(int j=1; j<=m; j++){cin>>arr[i][j];//二维数组求前缀和 sum[i][j]=sum[i][j-1]+sum[i-1][j]-sum[i-1][j-1]+(arr[i][j]-'0');}}int res=0;//枚举所有子矩阵:左上角下标(x1, y1),右下角下标(x2,y2),且x1<=x2, y1<=y2for(int x1=1; x1<=n; x1++){for(int y1=1; y1<=m; y1++){for(int x2=x1; x2<=n; x2++){for(int y2=y1; y2<=m; y2++){//利用二维数组前缀和求解二维数组子矩阵和,0表示白,1表示黑,则子矩阵和即为黑色格子数量 int num = sum[x2][y2]-sum[x2][y1-1]-sum[x1-1][y2]+sum[x1-1][y1-1];//如果子矩阵是平衡子矩形:当且仅当其中黑色格子与白色格子数量相同,更新最大格子数if(2*num == (x2-x1+1)*(y2-y1+1)){if(2*num > res) res=2*num;}}}}}cout<<res;return 0;
}

在这里插入图片描述
在这里插入图片描述

本题考察 排序算法、 滑动窗口(双指针)。

首先将宝箱价值数组升序排序。排序后,若我们选择一个区间[left, right]内的宝箱,那么这个区间的最小值是a[left],最大值是a[right]。此时只需保证a[right] - a[left] ≤ k,就能满足题目中 “最大值与最小值的差不超过k” 的条件。

滑动窗口:是一种在数组或字符串上维护一个动态区间的算法技巧,通过调整区间的左右边界(类似 “窗口” 的滑动),高效解决子数组 / 子串相关问题。

核心思想:用两个指针(左指针left、右指针right)表示窗口的边界,通过移动指针扩大或缩小窗口,在遍历过程中实时处理窗口内的元素。优势:将嵌套循环的O(n²)时间复杂度优化为O(n),大幅提升效率。

本题用滑动窗口维护所有满足a[right] - a[left] ≤ k的区间[left, right]。用变量sum记录计区间[left, right]内的总价值,从而在滑动窗口的过程中,找到总价值最大的区间。

#include<bits/stdc++.h>
using namespace std;
int main() {int n, k, arr[1001];cin>>n>>k;for(int i=0; i<n; i++) cin>>arr[i];sort(arr, arr+n); //升序排序 int sum=0, res=0; //sum 滑动窗口区间元素和 int left=0, right=0; //滑动窗口左右边界 while(right<n){ //区间右边界不能超出数组最大下标 sum += arr[right]; //当区间不满足a[right]-a[left]<=k,移动左边界 while(arr[right]-arr[left]>k){ sum -= arr[left];left++;}res = max(res, sum); //比较当前滑动窗口区间元素和  和  结果值的大小关系 right++;}cout<<res;return 0;
}

本题中也可以用前缀和数组快速计算区间[left, right]内的总价值,要预先计算前缀和数组,有兴趣的同学可自行编写代码。

http://www.dtcms.com/a/516133.html

相关文章:

  • 基于NLP进行文本内容预测常规流程
  • 建设银行手机网站变塘厦水霖学校
  • 音乐介绍网站怎么做抖音代运营介绍
  • 假数据神器JSONPlaceholder介绍(假数据接口、模拟数据接口、模拟测试接口、Mock data interface)
  • Alpha World:以结构化金融驱动Web3共识
  • 关于jsp网站开发的最新书籍厦门网站建设哪家便宜
  • 基于频率分集阵列的MIMO雷达联合距离角度估计——论文阅读
  • 20.3 ResNet50+多模态融合!ChatPPT3.0一键生成专业级PPT全攻略
  • 甘肃省建设工程安全质量监督局网站hostgator wordpress主机
  • Fiddler使用教程,全面掌握Fiddler抓包工具的配置方法、代理设置与调试技巧(HTTPHTTPS全解析)
  • 金泉网普通会员可以建设网站吗上海网站编辑招聘
  • <数据集>yolo纸板缺陷识别数据集<目标检测>
  • ubuntu 系统扩容,多硬盘挂载
  • 上海最专业的网站设计制蒙古文政务网站建设工作汇报
  • 近红外工业相机的简单介绍和场景应用
  • 基于开源免费Odoo软件构建CRM销售管理系统
  • 网站开发有哪些要求asp.net企业门户网站源码
  • 潮州南桥市场中国建设银行网站公司建立网站的目的
  • 直流电机编码器测速
  • GraphRAG产品赋能千行百业:创邻科技“知寰Hybrid RAG”的实践与价值全景
  • Java操作PDF图层:添加、设置和删除
  • 机器人数据录制,通过遥操作的方式,操作isaacsim录制仿真数据的方法,HDF5格式秒变LeRobot标准数据集(一)
  • Linux内核InfiniBand缓存系统深度解析:高性能网络的核心引擎
  • 网站鼠标经过图片代码男女做网站
  • 罗湖网站建设费用网页游戏源码怎么用
  • MySQL 与 PostgreSQL,该怎么选
  • 【CMakeLists.txt】CMake 编译定义带值参数详解
  • 系统集成项目管理工程师第五章:软件工程核心笔记(精简版)
  • nvm切换node版本-jenkins上编译
  • 人和做网站架设网站费用