image

编辑人: 独留清风醉

calendar2025-06-15

message2

visits774

2024年3月CCF-GESP编程能力等级认证C++编程四级真题答案及解析

一、单选题

1、若函数声明为 int f(int &x){ x+=3; return x; } ,则对声明的变量 int a=3 ,下面哪个调用能够改变 a 的值(   )。

A f(&a) ;

B f(*a) ;

C f(a) ;

D f(a-3) ;

解析:【喵呜刷题小喵解析】题目中的函数定义为 int f(int &x) { x += 3; return x; },它接受一个整数引用作为参数,并改变这个引用的值。要改变变量 a 的值,需要传递变量 a 的引用给函数。在 C++ 中,变量引用通过 & 符号表示,所以应该调用函数 f(&a)。因此,选项 A 是正确的。选项 B、C 和 D 都是错误的,因为它们没有传递变量 a 的引用给函数。选项 B 试图传递变量 a 的值,选项 C 试图传递变量 a,而不是引用,选项 D 传递了一个与 a 无关的值。

2、下面C++代码执行后,输出的是(   )。

int main()
{
	int x[]={2, 0, 2, 4};
	char geSP[]="Grade Examination of SP";
	cout << geSP[sizeof(x)] << endl;
	cout << endl;
	return 0;
}

A G

B e

C n

D P

解析:【喵呜刷题小喵解析】

首先,我们需要理解代码中的关键部分。

代码中的数组`x`是一个整型数组,包含4个元素。`sizeof(x)`会返回数组`x`的大小,即4。

字符串`geSP`是一个字符数组,包含17个字符。

`cout << geSP[sizeof(x)] << endl;`这行代码试图输出`geSP`数组中索引为`sizeof(x)`的字符。由于`sizeof(x)`的值为4,所以输出的字符是`geSP`数组中索引为4的字符,即'P'。

因此,输出的结果应该是'P'。

选项A、B、C中的字符'G'、'e'、'n'都不是`geSP`数组中索引为4的字符,所以它们都是错误的。

所以,正确答案是D。

3、下面C++代码执行后输出是(   )。

int foo(float *f)
{
	return int(*f*2);
}
int main()
{
	float fnum[10]={1.1};
	fnum[1]=foo(fnum);
	cout << fnum[0]+fnum[1] << endl;
	cout << endl;
	return 0;
}

A 1

B 1.1

C 3

D 3.1

解析:【喵呜刷题小喵解析】

首先,我们分析函数foo。函数foo接受一个指向float类型的指针f,然后返回f指向的值的两倍,并将其转换为int类型。

然后,我们分析main函数。在main函数中,我们有一个数组fnum,其中只有一个元素被初始化为1.1。接着,我们调用foo函数,将fnum数组的第一个元素作为参数传递进去。foo函数返回该元素的2倍,即2.2,然后将这个值赋给fnum数组的第二个元素。

最后,我们输出fnum数组的前两个元素的和,即1.1 + 2.2 = 3.3。但是,因为fnum数组的第二个元素是2.2,但我们将其赋值给了fnum[1],而fnum[1]在输出前没有进行类型转换,所以其被视为int类型,即2。所以,我们输出的是1.1 + 2 = 3。

因此,正确答案是C,即3。

4、对二维数组 int arr[3][16]; ,则 arr[1] 占用内存的大小为(   )字节。

A 4

B 16

C 48

D 64

解析:【喵呜刷题小喵解析】:二维数组 int arr[3][16]; 表示一个3行16列的二维数组,每个元素都是整型(int),在大多数系统中,整型(int)占用4字节。因此,arr[1] 是一个包含16个整数的数组,总共占用 16 * 4 = 64 字节。但题目要求的是 arr[1] 占用内存的大小,即 16 * 4 = 64 字节,故正确选项是 B,16字节。这里需要注意的是,arr[1] 并不直接占用内存64字节,而是其包含的所有元素共占64字节。

5、对二维数组 int arr[3][16]; ,若 arr 的地址是 0x28cbc0 ,则 arr[1] 的值是(   )。

A 0x28cbc4

B 0x28cbd0

C 0x28cc00

D 不确定

解析:【喵呜刷题小喵解析】:
在C语言中,二维数组是以一维数组的形式存储的。对于数组`int arr[3][16];`,在内存中是以连续存储的形式存储的,每个元素占用一个整数(int)的大小。

对于二维数组`arr`,其地址是`0x28cbc0`,即首元素的地址。因为数组是按行优先存储的,所以每行16个元素连续存储。

对于`arr[1]`,它表示的是第二行的起始地址。根据内存中的存储顺序,第二行的起始地址应该是`0x28cbc0 + 16 * sizeof(int)`。由于题目中并没有给出`int`的大小,因此无法确定确切的地址。但我们可以确定的是,`arr[1]`的地址是在`0x28cbc0`之后的一个地址,而不是选项中的任何一个。

因此,正确答案是D,即`arr[1]`的地址是不确定的。

6、下面C++代码执行后输出是(   )。

int main()
{
	char *p="I love GESP!";
	cout << p+5 << endl;
	cout << endl;
	return 0;
}

A e

B I lov

C e GESP!

D GESP!

解析:【喵呜刷题小喵解析】在C++中,字符串实际上是以字符数组的形式存储的,数组中的每个元素都是字符。在这段代码中,字符指针p指向了一个字符串"I love GESP!"。当我们使用p+5时,指针p向后移动了5个字符的位置,因此,p+5指向的是字符'l'。因此,cout << p+5 << endl; 这行代码将输出"I love"后的5个字符,即"lov"。

7、下面C++代码执行以后输出的是(   )。

int rc=5;
int main()
{
	int rc;
	cout << ++rc << endl;
	cout << endl;
	return 0;
}

A 0

B 1

C 6

D 不确定

解析:【喵呜刷题小喵解析】此C++代码存在未定义的行为。在全局范围内已经声明了一个名为`rc`的整型变量,并在`main()`函数中又声明了一个同名的局部变量。在`main()`函数中,试图修改这个局部变量`rc`的值,但由于这个局部变量在函数结束后会被销毁,所以全局变量`rc`的值并不会被改变。而在`cout << ++rc << endl;`这一行,试图输出这个局部变量的值,此时由于局部变量已经被销毁,因此该代码行为是未定义的。所以,输出的结果是不确定的。因此,正确答案是D。

8、下面C++函数中采用的算法是(   )。

int fib(int n)
{
	int i, f[n]={0, 1};
	for(int i=2; i<=n; i++)
		f[i]=f[i-1]+f[i-2];
	return f[n];
}

A 递推

B 递归

C、

迭代

D、

循环

解析:【喵呜刷题小喵解析】:该C++函数采用的是迭代算法。在函数中,定义了一个数组f,并初始化了前两个元素为0和1,然后从第三个元素开始,通过迭代的方式计算每个元素的值,即f[i] = f[i-1] + f[i-2]。因此,该函数采用的是迭代算法,而不是递推、递归或循环。所以,正确答案是C。

9、插入排序在最好情况下的时间复杂度是(   )。

A O(1)

B O(N/2)

C O(N)

D O(N2)

解析:【喵呜刷题小喵解析】:插入排序的基本思想是,通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需要用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。所以,插入排序的时间复杂度是O(n^2)。在最好情况下(即数据已经排好序),它只需要做一次完整的遍历,因此时间复杂度为O(n^2)。所以,插入排序在最好情况下的时间复杂度是O(n^2),对应选项D。

10、在如下的C++代码执行后,设第11和12行的输出地址值分别为 X 和 Y ,则下面正确的是(   )。

struct pass{
	int no;
	char name[20];
	int level;
};
int main()
{
	struct pass XiaoYang;
	cout << "&XiaoYang=" << &XiaoYang << endl; //第11行
	cout << "&(XiaoYang.no)=" << &(XiaoYang.no) << endl; //第12行
	cout << endl;
	return 0;
}

A X>Y

B X==Y

C X<Y

D 不确定

解析:【喵呜刷题小喵解析】在C++中,一个结构体的地址和它的成员变量的地址是不同的。结构体变量XiaoYang的地址存储在&XiaoYang中,而它的成员变量no的地址存储在&(XiaoYang.no)中。因此,&XiaoYang和&(XiaoYang.no)的值是不同的,即X不等于Y。所以,答案是D,即不确定。

11、如果文件 1.txt 中的内容如下,则执行下面C++代码时,注释了 #### 那行代码所输出的 x 的值为( C )。

50 2024 3.16 I
love
GESP!
int main()
{
	ifstream fin;
	string line;
	int x;
	fin.open("1.txt",ios::in);
	for (int i=0; i< 2; i++){
		fin >> line;
		cout << line << endl;
	}
	fin>>x;
	cout << x << endl; //####
	cout << endl;
	return 0;
}

A 5

B 2024

C 3

D 0

解析:【喵呜刷题小喵解析】:在C++代码中,`fin.open("1.txt",ios::in);` 打开文件1.txt,`for (int i=0; i<2; i++)` 循环读取文件的前两行,并输出。`fin>>x;` 从文件中读取一个整数到变量x中,由于文件1.txt的内容为"50 2024 3.16 I love GESP!",而整数50和2024已经被前两句读取并输出,所以变量x的值为第三行的第一个数字,即3。因此,注释了####的那行代码所输出的x的值为3,故选C。

12、执行下列C++代码时输出中的第2行是(   )。

int main()
{
	char *s[]={(char*)"2024",(char*)"3.16",(char*)"GESP"};
	for (int i=0; i< 2; i++){
		cout << *s+i << endl;
	}
	cout << endl;
	return 0;
}

A 2024

B 3.16

C 024

D、

3

解析:【喵呜刷题小喵解析】根据C++代码,我们可以得出以下结论:

1. 定义了一个字符串数组 `s`,它包含三个字符串:"2024", "3.16", "GESP"。
2. 在 `for` 循环中,循环两次,`i` 的值分别是0和1。
3. 在循环体内,`*s+i` 指的是 `s[0]` 和 `s[1]` 的第 `i+1` 个字符。具体来说:
* 当 `i=0` 时,`*s+i` 指向 "2024" 的第1个字符,即 "2024" 的第一个字符 "2"。
* 当 `i=1` 时,`*s+i` 指向 "3.16" 的第2个字符,即 "3.16" 的第二个字符 "1"。
4. 使用 `cout` 输出这两个字符,所以输出中的第2行是 "3.16" 的第二个字符 "1",即选项B。

13、C++语言中下面哪个关键字能够限定对象的作用域(   )。

A extern

B static

C inline

D public

解析:【喵呜刷题小喵解析】:在C++语言中,关键字`static`能够限定对象的作用域。`static`关键字用于声明静态变量,这些变量具有局部作用域,但它们的生命周期是整个程序的执行期间。静态变量只会被初始化一次,并且在程序执行期间一直存在。因此,`static`关键字可以用于限定对象的作用域,确保它们只在特定的代码块或函数内部可见。选项A中的`extern`关键字用于声明一个变量或函数在其他文件中定义,而不是限定作用域。选项C中的`inline`关键字用于建议编译器将函数内联展开,而不是限定作用域。选项D中的`public`是访问控制修饰符,用于控制类成员的访问权限,而不是限定对象的作用域。因此,正确答案是B,即`static`。

14、小杨的父母最近刚刚给他买了一块华为手表,他说手表上跑的是鸿蒙,这个鸿蒙是(   )。

A、

小程序

B、

计时器

C、

操作系统

D、

神话人物

解析:【喵呜刷题小喵解析】:华为手表上跑的“鸿蒙”是指操作系统,而非小程序、计时器或神话人物。鸿蒙是华为自主研发的操作系统,用于连接各种智能设备,实现设备间的互联互通。因此,正确答案为C选项,即“操作系统”。

15、中国计算机学会(CCF)在2024年1月27日的颁奖典礼上颁布了王选奖,王选先生的重大贡献是(   )。

A、

制造自动驾驶汽车

B、

创立培训学校

C、

发明汉字激光照排系统

D、

成立方正公司

解析:【喵呜刷题小喵解析】:王选先生是中国计算机学会的重要人物,他在计算机领域做出了重大贡献。根据题目中的选项,我们需要找到与王选先生相关的重大贡献。制造自动驾驶汽车、创立培训学校、成立方正公司都不是王选先生的主要贡献。而发明汉字激光照排系统是与王选先生紧密相关的,这是他在计算机领域的重要发明之一。因此,正确答案是C选项,即“发明汉字激光照排系统”。

二、判断题

16、对 int a[]={2,0,2,4,3,1,6} ,执行第一趟选择排序处理后 a 中数据变为 {0,2,2,4,3,1,6} 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:第一趟选择排序的任务是找到未排序序列中的最小(或最大)元素,将其放到排序序列的起始位置。对于数组int a[]={2,0,2,4,3,1,6},第一趟选择排序后,最小的元素0应该被放到数组的最前面,所以排序后的数组应该是{0,2,2,4,3,1,6}。然而,题目给出的排序后的数组是{2,0,2,4,3,1,6},这不是第一趟选择排序后的结果,因此,答案是错误的。

17、如果待排序数据不能都装进内存,需要使用外排序算法。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:外排序算法通常用于处理数据量太大无法全部装入内存的情况。当待排序数据无法全部装入内存时,需要将数据分成若干小块,分别进行排序,然后再通过归并操作将各个小块合并成一个有序的大文件。因此,题目中的说法是正确的。

18、定义变量 int a=5 , 则 cout << &++a 会输出 6 。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:题目中的代码 `cout << &++a` 实际上是有语法错误的。`cout` 是用来输出数据的,而 `&` 并不是 C++ 中的合法符号。如果题目中的代码意图是输出变量 `a` 的地址,那么应该使用 `&` 符号,即 `cout << &a;`。但题目中的 `&` 并不是合法的,因此这行代码会编译错误。另外,`++a` 是对变量 `a` 进行前置自增操作,即先将 `a` 的值加 1,然后返回新的值。在这个操作之后,`a` 的值会变为 6,但是题目中的 `cout << &++a` 并不是输出 `a` 的值,而是尝试输出 `a` 的地址,所以输出不会是 6。因此,题目的说法是错误的。

19、两个函数之间可以使用全局变量来传递数据。 (   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:全局变量可以在多个函数之间共享数据,但直接传递数据通常是通过参数传递,而不是依赖全局变量。全局变量可能导致代码难以理解和维护,因为它们可以在程序的任何位置被修改,这可能导致意外的副作用。因此,虽然全局变量可以用来在函数之间传递数据,但通常更好的做法是通过参数明确地传递数据,以避免潜在的混淆和错误。

20、定义数组 int a[2024][3][16]={2,0,2,4,3,1,6} ,则 cout << a[2023][2][15] 的结果不确定。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:首先,数组 int a[2024][3][16] 定义了一个三维数组,其维度分别为 2024、3 和 16。根据题目中给出的数组初始化,数组 a 的部分元素被初始化为 {2,0,2,4,3,1,6},但这只是数组的一部分,数组的其他元素并没有被明确赋值,它们的值是未定义的。

题目中询问的是 cout << a[2023][2][15] 的结果,这个索引超出了初始化的范围,因此访问的是未定义的值。在 C++ 中,访问未定义的值会导致未定义的行为,结果是不确定的。

因此,题目中的说法“cout << a[2023][2][15] 的结果不确定”是正确的。

21、在C++语言中,函数的参数为指针时,可以在函数内部修改该参数的值。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++语言中,当函数的参数为指针时,可以通过指针来访问和修改指针所指向的内存地址中的值。因此,在函数内部,可以通过指针来修改参数的值。这是指针在C++中的一个重要应用。

22、在C++语言中 try 子句里抛出的结构体等类型的异常无法被 catch 捕获。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++语言中,try子句里抛出的任何类型的异常,包括结构体等类型的异常,都可以被相应的catch子句捕获。只要异常类型与catch子句中的类型匹配,就可以捕获该异常。因此,该题目的说法是错误的。

23、C++语言中 cout << 9^2 << endl; 会输出81。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在C++语言中,`cout << 9^2 << endl;` 实际上并不会输出81。这里使用的是位异或运算符`^`,而不是数学中的乘方运算符。`9^2`的结果是7,而不是81。要计算9的平方,应该使用`cout << 9*9 << endl;`或者`cout << 9*9;`,因为`endl`会自动输出换行。所以,原题目的说法是错误的。

24、小杨今年春节回奶奶家了,奶奶家的数字电视要设置 ip 地址并接入到 WIFI 盒子才能收看节目,那这个 WIFI 盒子具有路由器的功能。(   )

A 正确

B 错误

解析:【喵呜刷题小喵解析】:WIFI盒子通常具有路由器的功能,因为它需要连接互联网并允许设备接入网络。设置IP地址和接入WIFI盒子是收看数字电视节目所必需的步骤,因此WIFI盒子确实具有路由器的功能。因此,这个判断是正确的。

25、任何一个for循环都可以转化为等价的while循环(   )。

A 正确

B 错误

解析:【喵呜刷题小喵解析】:在编程中,for循环和while循环都是用来重复执行一段代码块的。虽然它们的语法和用法有所不同,但它们在逻辑上是等价的。也就是说,任何一个for循环都可以转化为等价的while循环,反之亦然。因此,题目的陈述是正确的。

三、实操题

26、相似字符串

问题描述

对于两个字符串A和B,如果A可以通过删除一个字符,插入一个字符,修改一个字符变成B,那么我们说A和B是相似的。

比如 apple 可以通过插入一个字符变成 applee ,可以通过删除一个字符变成 appe ,也可以通过修改一个字符变成 bpple ,因此 apple 和 applee 、 appe 、 bpple 都是相似的。但 applee 并不能通过任意一个操作变成bpple ,因此它们并不相似。

特别地,完全相同的两个字符串也是相似的。

给定T组A,B,请你分别判断他们是否相似。

输入描述

第一行一个正整数T。

接下来T行,每行两个用空格隔开的字符串A和B。

保证T≤100,A,B的长度不超过50。保证A和B只包含小写字母。

输出描述

输出T行,对于每组A,B,如果它们相似,则输出 similar ,否则输出 not similar 。

特别提醒

在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。


样例输入 1

5
apple applee
apple appe
apple bpple
applee bpple
apple apple

样例输出 1

similar
similar
similar
not similar
similar

参考答案:br />对于每一组输入,分别判断A和B是否相似,输出相应的结果。

解析:【喵呜刷题小喵解析】
对于每一组输入A和B,判断它们是否相似。可以使用动态规划来解决这个问题。

首先,定义一个二维数组dp[i][j],其中dp[i][j]表示字符串A的前i个字符和字符串B的前j个字符是否相似。

然后,根据题目描述,可以得到以下状态转移方程:

1. 如果A的第i个字符和B的第j个字符相等,那么dp[i][j] = dp[i-1][j-1];
2. 如果A的第i个字符和B的第j个字符不相等,那么dp[i][j] = dp[i-1][j] || dp[i][j-1] || dp[i-1][j-1]。

其中,dp[i-1][j-1]表示A的前i-1个字符和B的前j-1个字符是否相似,dp[i-1][j]表示A的前i-1个字符和B的前j个字符是否相似,dp[i][j-1]表示A的前i个字符和B的前j-1个字符是否相似。

最后,根据dp[lenA][lenB]的值输出相应的结果,其中lenA和lenB分别表示字符串A和B的长度。如果dp[lenA][lenB]为true,则输出similar,否则输出not similar。

需要注意的是,由于题目中保证A和B只包含小写字母,因此可以使用字符的ASCII码值进行比较。同时,由于A和B的长度不超过50,因此可以使用一个二维数组来存储状态转移的结果。

27、做题

题目描述

小杨同学为了提高自己的实力制定了做题计划,在第k天时,他必须要完成k道题,否则他就会偷懒。

小杨同学现在找到了一个题库,一共有n套题单,每一套题单中有一定数量的题目。但是他十分挑剔,每套题单他只会使用一次,每一天也只能使用一套题单里的题目,之后那套题单就会被弃之不用。对于每套题单,他不必完成题单内所有的题。

那么问题来了,小杨同学最多会做题几天才偷懒呢?

输入格式

第一行,1个数为n,表示有多少套题单。

第二行,n个整数a1,a2,...,an,分别表示每套题单有多少道题。

输出格式

输出一行,小杨同学偷懒前最多做题天数。


样例输入

4
3 1 4 1

样例输出

3

对于全部数据,保证有1≤n≤106,1≤ai≤109

参考答案:对于样例输入,小杨同学偷懒前最多做题天数为3天。

解析:【喵呜刷题小喵解析】:
为了找到小杨同学最多会做题几天才偷懒,我们需要找到最长的上升子序列列的长度。

对于样例输入,我们有4套题单,题目数量分别为3、1、4、1。我们需要找到最长的上升子序列,即每一天的题目数量逐渐增加,直到无法再找到更长的上升子序列为止。

我们可以按照题目数量的升序对题单进行排序,得到题单顺序为1、1、3、4。这样,我们可以依次选择题单,直到无法再找到更长的上升子序列。

具体地,我们可以选择第一套题单(1道题),第二天选择第二套题单(1道题),第三天选择第三套题单(3道题),此时已经做了5道题,超过了第三天的3道题,无法再找到更长的上升子序列。因此,小杨同学最多会做题3天才会偷懒。

对于更大的数据,我们同样需要找到最长的上升子序列,但需要使用一些高效的算法,比如二分查找。对于每个题单,我们需要找到一个最小的位置j,使得a[j] >= a[i],这样我们就可以把题单i放在位置j上,形成一个更长的上升子序列。我们可以使用二分查找来找到这个位置j,时间复杂度为O(nlogn)。

因此,对于本题,我们需要对题单按照题目数量进行排序,然后使用二分查找找到最长的上升子序列的长度,即为小杨同学最多会做题的天数。

喵呜刷题:让学习像火箭一样快速,快来微信扫码,体验免费刷题服务,开启你的学习加速器!

创作类型:
原创

本文链接:2024年3月CCF-GESP编程能力等级认证C++编程四级真题答案及解析

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。
分享文章
share