CCF-GESP 等级考试 2025年6月认证C++四级真题解析
2025年6月真题
一、单选题(每题2分,共30分)

正确答案:A
考察知识点:C++指针类型的概念及基本应用
解析:C++ 中声明指向整型变量的指针,语法为int* 指针名;(或int *指针名;)。选项 A 符合该语法,B、C、D 均存在语法错误。答案为A。

正确答案:D
考察知识点:函数的定义与调用、形参与实参、作用域
解析:选项 A、B、C 均可正确接收 3 行 4 列的二维数组:A 是固定大小的二维数组声明,B 是省略行的二维数组声明,C 是数组指针声明。
选项 D 的int** arr是指向指针的指针,无法直接用于二维数组的元素访问(语法不兼容arr[i][j]的直接访问形式)。因此横线上不能填写 D。答案为D。

正确答案:D
考察知识点:二维数组与多维数组基本应用、C++指针类型的概念及基本应用
解析:选项 A:int arr[3][4]在栈上分配,栈空间小,适合小数组,说法正确。
选项 B:new int[12]在堆上分配,堆空间大,适合大数组,说法正确。
选项 C:二者内存均连续(二维数组在内存中按行连续存储,new的一维数组也连续),说法正确。
选项 D:栈上的arr[3][4]会自动释放,但堆上的new int[12]需手动delete[]释放,不能自动释放,说法错误。答案为D。


正确答案:B
考察知识点:函数的定义与调用
解析:C++ 中函数调用前需声明或定义。代码中main调用greet时,greet未提前声明,编译器会因 “找不到函数greet()” 报编译错误。答案为 B。

正确答案:C
考察知识点:函数的定义与调用、函数参数传递的概念、结构体
解析:值传递是传递结构体的副本,函数内修改不会影响原始对象;而引用传递和指针传递都能直接操作原始结构体对象,实现内容修改。因此应使用引用传递或指针传递。答案为C。

正确答案:B
考察知识点:形参与实参、作用域
解析:形参是函数定义中声明的变量,用于接收调用时传递的值;实参是函数调用时传递给函数的具体值。选项 B 准确描述了二者区别,A、C、D 说法错误。答案为B 。

正确答案:C
考察知识点:函数的定义与调用、形参与实参、作用域
解析:print1中,局部value为 50,输出 50;::value访问全局value(100),输出 100。
print2中,无局部value,访问全局value(100),输出 100。
因此最终输出50 100 100。答案为C。

正确答案:B
考察知识点:排序算法
解析:插入排序的核心逻辑是将元素逐个插入到已排序的序列中,与小杨 “每次将新抓到的扑克牌插入到有序部分的正确位置” 的做法完全一致。答案为 B。
冒泡排序是相邻元素比较交换,选择排序是每次选最小元素交换,均不符合。

正确答案:C
考察知识点:排序算法
解析:插入排序的算法思想是:将待排序数组分为已排序区间和未排序区间,初始时已排序区间只有第一个元素。然后依次从未排序区间取出元素,插入到已排序区间的合适位置,使已排序区间始终保持有序,重复此过程直到未排序区间元素为空,最终得到有序数组。
插入排序在数据几乎有序时,只需少量调整即可完成排序,时间复杂度接近 O(n),是合适场景。答案为C。
A 选项数据量大且乱序时插入排序效率低;
B 选项稳定排序但不要求实时性的场景可选归并等;
D 选项大数组交换次数少的场景不适合插入排序。

正确答案:B
考察知识点:递推算法
解析:递推算法的核心是从已知的基础情况(如初始值)出发,通过递推关系逐步推导更大规模问题的解。答案为B。
A 项描述的是分治算法;C 项是穷举法;D 项是贪心算法。

正确答案:B
考察知识点:简单算法复杂度的估算
解析:算法包含两层循环,外层循环执行 n 次,内层循环也执行 n 次,总操作次数为 n×n=n2n×n=n^2n×n=n2,因此时间复杂度为 $O(n^2)。答案为B。


正确答案:D
考察知识点:递归算法、简单算法复杂度的估算 (超纲)
解析:该斐波那契数列采用递归实现,每次调用会分解为两个子调用(fibonacci(n-1)和fibonacci(n-2)),递归树的节点数呈指数级增长,时间复杂度为 O(2n)O(2^n )O(2n) 。答案为D。

正确答案:C
考察知识点:文件重定向与文件读写操作
解析:代码中ifstream in(“data.txt”)打开了名为data.txt的文件,getline(in, line)逐行读取该文件内容,cout << line << endl;将每行内容输出到屏幕。答案为C。
选项 A 描述的是标准输入(键盘),错误;
选项 B 错误,getline可读取ifstream类型的文件流;
选项 D 描述的是创建文件,而代码是读取文件。

正确答案:B
考察知识点:异常处理
解析:C++ 的 try-catch 块主要用于在程序发生运行时错误(异常)时,提供一种结构化的错误处理方式,使程序能优雅地捕获并处理异常,而非直接崩溃。A 项异常处理会增加开销,不提高运行速度;C 项编译错误由编译器检查,与异常处理无关;D 项异常处理不减少内存占用。答案为B。


正确答案:B
考察知识点:排序算法
解析:冒泡排序的核心思想是:通过重复遍历待排序序列,每次比较相邻的两个元素,若顺序错误则交换它们的位置,直到没有元素需要交换为止。
在优化的冒泡排序中,首先将flag初始化为false(表示本轮未发生交换),当发生元素交换时,将flag设为true。若本轮结束后flag仍为false,说明数组已排序,可提前退出。
第一个横线处应填flag = false;,初始化标记。
第二个横线处应填flag = true;,标记发生了交换。
选项 B 符合上述逻辑。答案为B。
二、判断题(每题2分,共20分)

正确答案:正确
考察知识点:函数的定义和调用、函数声明
解析:C++ 中函数声明可省略参数名,只需指定参数类型。该代码int add(int, int);明确声明了返回值为int、接受两个int参数的函数,语法合法。表述正确。

正确答案:错误
考察知识点:函数的定义与调用、函数参数传递的概念
解析:foo 函数采用值传递,修改的是 x 的副本,不会影响main中的 a。因此 a 仍为 10,输出不是 15。 表述错误。


正确答案:错误
考察知识点:结构体
解析:C++ 支持结构体嵌套定义,该代码中Library结构体嵌套Book结构体,Book又嵌套Author结构体,语法完全合法。表述错误。

正确答案:正确
考察知识点:函数参数传递的概念
解析:引用传递直接关联原始变量,可直接操作修改它;且无需拷贝数据(尤其是大型对象),能提高效率。相比值传递的 “拷贝后操作(不影响原始变量)”,引用传递具备题干所述优点。表述正确。

正确答案:错误
考察知识点:二维数组与多维数组基本应用
解析:C++ 中二维数组初始化时,未显式指定的元素会自动初始化为 0。该代码中arr的第一行初始化{1, 2}(剩余一个元素为 0),第二行初始化{3}(剩余两个元素为 0),语法合法。表述错误。

正确答案:错误
考察知识点:递推算法
解析:递推算法是一种基于初始条件和递推关系,通过逐步推导求解问题的算法思想。
代码中循环变量i从 0 开始,第一次循环res *= 0,导致后续结果恒为 0,无法正确计算阶乘(阶乘应为1×2×…×n)。表述错误。
正确写法应为:for(int i=1; i<=n; i++){…}

正确答案:正确
考察知识点:排序算法
解析:选择排序,将待排序数组分为「已排序区间」和「未排序区间」,初始时已排序区间为空。每次从未排序区间中找到最小(或最大)元素,将其与未排序区间的第一个元素交换位置,此时该元素加入已排序区间。重复此过程,直到未排序区间为空。
选择排序的比较次数是固定的,外层循环执行 n−1 次,内层循环每次分别执行 n−i−1 次( i 从 0 到 n−2),总比较次数为 n(n−1)/2,即 O(n2)O(n^2)O(n2),与初始数组是否有序无关。表述正确。

正确答案:正确
考察知识点:排序算法
解析:选择排序,将待排序数组分为「已排序区间」和「未排序区间」,初始时已排序区间为空。每次从未排序区间中找到最小(或最大)元素,将其与未排序区间的第一个元素交换位置,此时该元素加入已排序区间。重复此过程,直到未排序区间为空。
代码通过两层循环实现选择排序:外层循环确定未排序区间的起始位置,内层循环寻找区间内最小值的索引minIndex,最后交换起始位置与minIndex位置的元素,完全符合选择排序的算符思想。表述正确。

正确答案:错误
考察知识点:异常处理
解析:若异常在try块中抛出但无匹配的catch,不会在编译时报错,而是在运行时调用std::terminate()终止程序。表述错误。

正确答案:正确
考察知识点:文件重定向与文件读写操作
解析:代码通过ofstream创建文件流对象out关联data.txt,执行 out << “Hello”,此时是将 “Hello” 输出到 out 关联的 data.txt,最后close()关闭文件。表述正确。
三、编程题(每题25分,共50分)



本题考察:字符数组。
太简单了,就是一个二维数组的输入和输出。唯一需要注意的是要使用字符数组以及下标从1开始。
#include<iostream>
using namespace std;
int main(){
int h, w, x1, x2, y1, y2;
cin>>h>>w>>x1>>x2>>y1>>y2;
char a[105][105];
//输入二维字符数组
for(int i=1; i<=h; i++){
for(int j=1; j<=w; j++){
cin>>a[i][j];
}
}
//按照行列边界输出二维字符数组
for(int i=x1; i<=x2; i++){
for(int j=y1; j<=y2; j++){
cout<<a[i][j];
}
cout<<endl;
}
return 0;
}



本题考察:排序算法、冒泡排序。
解题思路:同学们按照身高从高到低的顺序排序,如果身高相同则按照体重从重到轻排序。排序涉及两个维度,最好使用结构体描述一个学生。
在调整队伍时,每次只能交换相邻两位同学的位置;且问最少需要多少次交换操作才能完成排序,显然需要使用冒泡排序。
#include<iostream>
using namespace std;
struct people{
int h, w;
}a[3000];
int main(){
int n, cnt=0;
cin>>n;
for(int i=0; i<n; i++){
cin>>a[i].h>>a[i].w;
}
//冒泡排序
for(int i=0; i<n-1; i++){
bool flag=true;
for(int j=0; j<n-1-i; j++){
//同学们按照身高从高到低的顺序排序,如果身高相同则按照体重从重到轻排序
//不符合上述排序要求,则交换
if(a[j].h < a[j+1].h || a[j].h==a[j+1].h && a[j].w<a[j+1].w){
swap(a[j], a[j+1]);
flag=false;
cnt++;
}
}
//如果flag为true,意味着本轮排序没有发生过交换,即已经有序,结束循环
if(flag) break;
}
cout<<cnt;
return 0;
}
更多推荐




所有评论(0)