2024年03月CCF-GESP编程能力等级认证C++编程二级真题

2024年05月13日

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

第 1 题 下列流程图的输出结果是?( )

A. 优秀
B. 良好
C. 不及格
D. 没有输出

答案:B 变量cj的值为76; 判断cj>=60,是true,所以会走YES路线; 判断cj>=90,是false,所以会走NO路线; 最终输出:良好

第 2 题 以下选项中不符合 C++变量命名规则的是?( )

A. student
B. 2_from
C. _to
D. Text

答案:B 在 C++ 中,变量名需要满足以下规则:

变量名由字母、数字和下划线组成。 变量名必须以字母或下划线开头。 变量名区分大小写。 根据这些规则,选项 B. 2_from 不符合规则,因为它以数字开头,并不符合变量名的要求。

第 3 题 以下选项中,不能用于表示分支结构的C++保留字是?( )

A. switch
B. return
C. else
D. if

答案:B 在 C++ 中,关键字 return 用于函数中表示函数的返回值,而不是用于表示分支结构。它用于将函数执行的结果返回给调用者,并终止函数的执行。

第 4 题 下列说法错误的是?( )

A. while 循环满足循环条件时不断地运行,直到指定的条件不满足为止
B. if 语句通常用于执行条件判断
C. 在C++中可以使用 foreach 循环
D. break 和 continue 语句都可以用在 for 循环和 while 循环中

答案:C 在 C++ 中,没有名为 “foreach” 的循环结构。然而,C++ 提供了一种称为范围基于循环(range-based for loop)的结构,用于遍历容器(如数组、向量、列表等)中的元素,但它并不被称为 “foreach” 循环。

第 5 题 下列4个表达式中,答案不是整数8的是?( )

A. abs(-8)
B. min(max(8, 9), 10)
C. int(8.88)
D. sqrt(64)

答案:B max(8, 9) 返回8和9的最大值,得到9。然后,min(9, 10) 返回9和10的最小值,得到9。因此,答案是9,不是整数8。

第 6 题 下面C++代码执行后的输出是?()

int n,a,m,i;

n=3, a = 5;
m = (a - 1) * 2;
for (i=0; i<n-1; i++)
	m = (m - 1) * 2;
cout << m;
A. 8
B. 14
C. 26
D. 50

答案:C 首先,给定初始值 n = 3 和 a = 5。 然后,计算 m = (a - 1) 2,得到 m = (5 - 1) 2 = 8。 接下来,进入循环,循环条件 i < n - 1,即 i < 2,执行循环体。 第一次循环,计算 m = (m - 1) 2,即 m = (8 - 1) 2 = 14。 第二次循环,计算 m = (m - 1) 2,即 m = (14 - 1) 2 = 26。 循环结束后,输出 m 的值。

因此,代码执行后的输出是 26。

第 7 题 下面C++代码执行后的输出是?()

int n,i,result;

n = 81;
i = 1, result = 1;
while (i * i <= n){
	if (n % (i * i) == 0)
		result = i * i;
	i += 1;
}

cout << result;
A. 16
B. 36
C. 49
D. 81

答案:D 给定初始值 n = 81,i = 1,result = 1。

进入 while 循环,循环条件为 i i <= n,即 1 1 <= 81,条件成立。

进入循环体,判断 n % (i i) == 0,即 81 % (1 1) == 0,条件成立。

执行语句 result = i i,即 result = 1 1,结果为 1。

然后,i 自增为 2。

再次判断循环条件 i i <= n,即 2 2 <= 81,条件成立。

进入循环体,判断 n % (i i) == 0,即 81 % (2 2) == 0,条件成立。

执行语句 result = i i,即 result = 2 2,结果为 4。

继续以上步骤,随着 i 的自增,每次都满足循环条件,并更新 result 的值。 当 i 自增到 9 时,判断 81 % (9 9) == 0 条件成立,则执行 result = 9 9,结果为 81 当 i 自增到 10 时,10 * 10 > 81,循环条件不成立,退出循环。

最后输出 result 的值,即 81。

第 8 题 下面C++代码执行后的输出是?()

int s,t,ans;
s = 2, t = 10;
ans = 0;
while (s != t){
	if (t % 2 == 0 && t / 2 >= s)
		t /= 2;
	else
		t -= 1;
	ans += 1;
}
cout << ans;
A. 2
B. 3
C. 4
D. 5

答案:B 给定初始值 s = 2,t = 10,ans = 0。

进入 while 循环,循环条件为 s != t,即 2 != 10,条件成立。

进入循环体,判断 t % 2 == 0 && t / 2 >= s,即 10 % 2 == 0 且 10 / 2 >= 2,条件成立。

执行语句 t /= 2,即 t = 10 / 2,结果为 5。

进入下一次循环,循环条件为 s != t,即 2 != 5,条件仍然成立。

进入循环体,判断 t % 2 == 0 && t / 2 >= s,即 5 % 2 == 0 且 5 / 2 >= 2,条件不成立。

执行语句 t -= 1,即 t = 5 - 1,结果为 4。

进入下一次循环,循环条件为 s != t,即 2 != 4,条件仍然成立。

进入循环体,判断 t % 2 == 0 && t / 2 >= s,即 4 % 2 == 0 且 4 / 2 >= 2,条件成立。

执行语句 t /= 2,即 t = 4 / 2,结果为 2。

进入下一次循环,循环条件为 s != t,即 2 != 2,条件不成立,退出循环。

最后输出 ans 的值。

因此,代码执行后的输出是 3。

第 9 题 下面C++代码执行后的输出是?()

int n, masks, days,cur;
n = 17, masks = 10, days = 0;
cur = 2;
while (masks != n){
	if (cur == 0 || cur == 1)
		masks += 7;
	masks -= 1;
	days += 1;
	cur = (cur + 1) % 7;
}

cout << days;
A. 5
B. 6
C. 7
D. 8

答案:C

第 10 题 以下C++代码判断一个正整数N的各个数位是否都是偶数。如果都是,则输出“是”,否则输出“否”。例如N=2024时输出“是”。则横线处应填入( )。

int N,Flag;
cin >> N;
Flag = true;
while (N != 0){
	if (N %2 != 0){
		Flag = false;
		_____________
	}
	else
		N /= 10;	
}
if(Flag == true)
	cout << "是";
else
	cout << "否";
A. break
B. continue
C. N = N / 10
D. N = N % 10

答案:A 给定的代码旨在判断正整数 N 的各个数位是否都是偶数。

首先,初始化一个布尔变量 Flag 为 true,表示所有数位都是偶数。

然后,进入一个 while 循环,循环条件为 N != 0,即当 N 不等于 0 时继续循环。

在循环体中,判断条件 N % 2 != 0,即如果 N 的个位数不是偶数,即为奇数,则将 Flag 设置为 false,表示不是所有数位都是偶数。

在这种情况下,应该立即终止循环,因为已经找到了一个奇数,不需要继续判断后面的数位。

使用 break 关键字可以立即跳出当前的循环,不再执行后续的循环体代码。

因此,在横线处填入 break 关键字,表示遇到奇数时跳出循环。

最后,根据 Flag 的值输出结果,如果为 true,输出 “是”,否则输出 “否”。

所以,选择题的答案是 A. break。

第 11 题 有句俗话叫“三天打渔,两天晒网”。如果小杨前三天打渔,后两天晒网,一直重复这个过程,以下程序代码用于判断,第n天小杨是在打鱼还是晒网,横线处应填写?( )

int n,i;
cin >> n;
i = n % 5;
if (__________________) // 在此处填写代码
	cout << "晒网";
else
	cout << "打鱼";
A. i == 0
B. i == 4
C. i == 0 && i == 4
D. i == 0 || i == 4

答案:D 根据题目描述,小杨前三天打渔,后两天晒网,循环重复。

代码中的变量 n 表示第 n 天,变量 i 表示 n 对 5 取余的结果,即 i = n % 5。

根据题意,当 i 等于 0 或等于 4 时,表示小杨是在晒网,否则是在打鱼。

因此,在 if 语句中的判断条件应该为 i == 0 || i == 4,表示当 i 等于 0 或等于 4 时,输出 “晒网”,否则输出 “打鱼”。

所以,选择题的答案是 D. i == 0 || i == 4。

第 12 题 一个数的所有数字倒序排列后这个数的大小保持不变,这个数就是回文数,比如 101 与 6886 都是回文数,而 100 不是回文数。以下程序代码用于判断一个数是否为回文数,横线处应填写?( )

	int n,a,k;
	cin >> n;
	a = 0;
	k = n;
	while (n > 0){
		a = __________; // 在此处填写代码
		n /= 10;
	}
	if (a == k)
		cout << "是回文数";
	else
		cout << "不是回文数";
A. 10 * a + n % 10
B. a + n % 10
C. 10 * a + n / 10
D. a + n / 10

答案:A 代码的目标是判断一个数是否为回文数,即将数字倒序排列后仍然保持相同。

首先,定义变量 n 用于接收输入的数,变量 a 用于保存倒序排列后的结果,变量 k 用于保存原始输入的数值。

进入 while 循环,循环条件为 n 大于 0。

在循环体中,通过 n % 10 取得 n 的个位数字,然后将其添加到 a 的末尾,即 a = 10 * a + n % 10。

接着,将 n 除以 10,舍弃个位数字。

重复以上步骤,直到 n 变为 0。

循环结束后,a 就保存了原始数的倒序排列的结果。

最后,判断 a 是否等于 k,如果相等,则输出 “是回文数”,否则输出 “不是回文数”。

因此,在横线处填入 A. 10 * a + n % 10,表示将当前的 a 乘以 10 并加上 n 的个位数字。

所以,判断题的答案是 A. 10 * a + n % 10。

第 13 题 给定两个整数 与 ,打印出一个栅栏图形,这个栅栏应该分成 段,段与段之间的间隔为 + , 段内的填充为 个 - 。形如 , 时,图形如下:

±----±----±----±----±----+

以下程序代码用于绘制该图形,横线处应填写?( )

int n, k, i, j;
n = 5, k = 6;
for (i = 0; i < n; i++){
	__________ // 在此处填写代码
	for (j = 1; j < k; j++)
		cout << '-' ;
}
cout << '+';

A. cout << ‘+’ << endl;
B. cout << ‘+’ << ’ ’ << endl;
C. cout << ‘+’;
D. cout << ‘+’ << ’ ';

答案:C

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

A. 小程序
B. 计时器
C. 操作系统
D. 神话人物

答案:C 鸿蒙是华为公司开发的一个操作系统,也被称为 HarmonyOS。

操作系统(Operating System)是计算机系统中的核心软件之一,负责管理和控制计算机的硬件和软件资源,提供给应用程序运行的环境。

因此,鸿蒙是一个操作系统,用于控制和管理华为手表的各种功能和应用程序。

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

A. 制造自动驾驶汽车
B. 创立培训学校
C. 发明汉字激光照排系统
D. 成立方正公司

答案:C

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

第 16 题 如果有以下C++代码:

double s;
int t;
s = 18.5;
t = int(s) + 10;

那么 cout << t 的结果为 28.5 。

答案:错误 根据 C++ 的类型转换规则,将浮点数转换为整数时会发生截断,即舍弃小数部分。

因此,int(s) 将 18.5 转换为整数,变为 18。然后加上 10,得到 28。最终将结果 28 赋值给变量 t。

因此,cout << t 的结果为 28,而不是 28.5。

第 17 题 Xyz , xYz , xyZ 是三个不同的变量。

答案:正确 在C++中,变量名是区分大小写的,因此 “Xyz”、“xYz” 和 “xyZ” 被视为三个不同的变量。

第 18 题 cout << (8< 9< 10) 的输出结果为 true 。

答案:正确 首先,比较 8 < 9,这是一个布尔表达式,它的结果为 true,因为 8 小于 9。

接下来,将 true 与 10 进行比较,这相当于将 true 转换为整数值 1,然后比较 1 < 10。这是一个新的比较运算,结果为 true。

因此,cout << (8 < 9 < 10) 的输出结果为 true

第 19 题 for (i = 0; i < 100; i+=2) ; 语句中变量i的取值范围是0到99。 在给定的 for 循环语句中,变量 i 的初始值为 0,循环条件为 i < 100,每次循环结束后 i 的值增加 2。

循环体中的分号 ; 表示一个空语句,即循环体中没有其他操作,只是一个占位符。

因此,循环体内部没有对变量 i 进行其他操作,只是通过 i += 2 使 i 增加 2。

由于循环条件为 i < 100,因此循环会一直执行,直到 i 的值达到或超过 100 为止。

因为 i 的初始值是 0,每次循环增加 2,所以循环结束时,i 的最大值是 100。

所以,变量 i 的取值范围是 0 到 100,包括 0 和 100。

答案:错误

第 20 题 C++中 cout << float(2022) 与 cout << float(‘2022’) 运行后的输出结果均为2022。

答案:错误

第 21 题 已知 A 的ASCII码值为65,表达式 int(‘C’)+abs(-5.8) 的值为72.8。

答案:正确 首先,字符 ‘C’ 的 ASCII 码值为 67。然后,使用 int(‘C’) 将其转换为整数类型,结果仍然是 67。

接下来,计算 abs(-5.8),即 -5.8 的绝对值。绝对值函数 abs() 返回的是一个非负数,所以 abs(-5.8) 的值是 5.8。

最后,将 67 和 5.8 相加,得到的结果是 72.8。

因此,表达式 int(‘C’) + abs(-5.8) 的值为 72.8。

第 22 题 bool() 函数用于将给定参数或表达式转换为布尔类型。语句 bool(-1) 返回的是 false 值。( )

答案:错误 在C++中,bool() 函数可以将给定参数或表达式转换为布尔类型。

根据题目给出的语句 bool(-1),我们需要将整数 -1 转换为布尔类型。

在C++中,整数类型的值为 0 的时候被视为 false,非零值被视为 true。

因为 -1 是一个非零值,所以在布尔类型转换时,bool(-1) 返回的是 true。

因此,语句 bool(-1) 返回的是 true 值。

所以,判断题的答案是错误的。

第 23 题 如果变量 a 的值使得C++表达式 sqrt(a)==abs(a) ,则 a 的值为0。( )

答案:错误

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

答案:正确 根据题目描述,奶奶家的数字电视需要设置 IP 地址并接入到 WIFI 盒子才能收看节目。

这意味着 WIFI 盒子提供了无线网络连接,并且数字电视需要通过该 WIFI 盒子连接到网络,并设置 IP 地址。

一般情况下,为了提供无线网络连接和连接多个设备,WIFI 盒子通常具备路由器的功能。

路由器具有转发网络数据包、提供网络地址转换(NAT)、分配 IP 地址、实现局域网和广域网之间的连接等功能。

因此,根据题目提供的信息,我们可以推断这个 WIFI 盒子具有路由器的功能。

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

答案:正确

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

第 26 题 试题名称:乘法问题

第 27 题 试题名称:小杨的日字矩阵