GESP解析|2024年06月C++二级选择题+判断题解析

发布于:2025-07-07 ⋅ 阅读:(21) ⋅ 点赞:(0)

GESP二级C++2024年06月选择题+判断题解析

大家好,我是莫小特。
这篇文章给大家带来GESPC++二级2024年06月的选择题和判断题的解析。

image.png

先看第一部分:选择题。

一、选择题

1~5 题

1、小杨父母带他到某培训机构给他报名参加CCF组织的GESP认证考试的第1级,那他可以选择的认证语言有几种?( )
A. 1
B. 2
C. 3
D. 4

答案:C
解析:GESP 的认证只有三种语言:Scratch、Python、C++,因此选 C。

2、下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 ,则图中菱形框中应该填入( )。
image.png
A. (yr%400==0) || (yr%4==0)
B. (yr%400==0) || (yr%4==0 && yr%100!=0)
C. (yr%400==0) && (yr%4==0)
D. (yr%400==0) && (yr%4==0 && yr%100!=0)

答案:B
解析:根据图片意思,是要判断输入 yr 是否为闰年,而闰年要满足以下条件:
能被400整除,或者能被4整除但不能被100整除。
也就是

(yr % 400 == 0) || (yr % 4 == 0 && yr % 100 != 0)

因此选择B。

3、在C++中,下列不可做变量的是( )。
A. five-Star
B. five_star
C. fiveStar
D. _fiveStar

答案:A
解析:变量的命名规则有:
(1)由数字、字母、下划线组成
(2)数字不能开头
(3)不能是关键字
(4)区分大小写
A 选项有一个连接符,不可以做变量名,因此选 A。

4、在C++中,与 for(int i=0; i<10; i++) 效果相同的是( )。
A. for(int i=0; i<10; i+=1)
B. for(int i=1; i<=10; i++)
C. for(int i=10; i>0; i–)
D. for(int i=10; i<1; i++)

答案:A
解析:for(int i = 0; i < 10; i++) 含义有:初始化:i = 0,条件:i < 10(即循环从 0 到 9),每次循环后:i++(即 i = i + 1
各个选项的分析如下表,A 选项中的 i+=1 等价于 i++,所以 A 选项正确。

image.png

5、在C++中, cout << (5 % 2 && 5 % 3) 的输出是( )。
A. 1
B. 2
C. true
D. false

答案:A
解析:
5 % 2 → 结果是 1 (因为 5 ÷ 2 = 2 余 1)
5 % 3 → 结果是 2 (因为 5 ÷ 3 = 1 余 2)
1 && 2 && 是逻辑与运算符,在 C++ 中,非零即真,1 为 1!=0,结果为 true,2 为 2!=0,结果为 true,true && true = true,而 cout 只会输出数值,因此 true 转换为整数 1。

6~10 题

6、执行下面的C++代码时输入 1 ,则输出是( )。

int month;
cin >> month;
switch(month){
	case 1:
		cout << "Jan ";
	case 3:
		cout << "Mar ";
		break;
	default:
		;
}

A. Jan
B. Mar
C. Jan Mar
D. 以上均不对

答案:C
解析:
考察 switch 语句的用法,month 的值为 1,符合 case 1,因此输出 Jan,但由于这个 case 没有 break 语句,因此 case 3 也会跟着执行,直到遇到 break,所以 Mar 也会输出,因此选 C。

7、执行下面C++代码后,有关说法错误的是( )。

int a, b;
cin >> a >> b;
if (a && b)
	cout << "1";
else if (!(a || b))
	cout << "2";
else if (a || b)
	cout << "3";
else
	cout << "4";

A. 如果先后输入1和1,则将输出1
B. 如果先后输入0和1或者1和0,则将输出3
C. 如果先后输入0和0,则将输出2
D. 如果先后输入0和0,则将输出4

答案:D
解析:
先补充代码,将缺失的符号不全,这样方便查看代码。

if (a!=0 && b!=0)
	cout << "1";
else if (!(a!=0 || b!=0)!=0)
	cout << "2";
else if (a!=0 || b!=0)
	cout << "3";
else
	cout << "4";

else if d1条件看起来还是比较复杂,调整一下:

else if ((a!=0 || b!=0)==0)

再调整就是:

else if(a==0&&b==0)

简化代码之后,依次判断各个选项,A选项,a=1,b=1,符合第一个 if 条件,输出 1,A正确。
B选项,a=0,b=1,符合第三个 else if(a!=0||b!=0),输出 3,a=1,b=0,也符合条件,因此输出 3,B选项正确。
C选项,a=0,b=0,符合第二个条件,输出 2,C选项正确。
D选项,a=0,b=0,只符合第二个条件,不符合第四个条件,因此不会输出 4,错误,选D。

8、某货币由5元,2元和1元组成。输入金额(假设为正整数),计算出最少数量。为实现其功能,横线处应填入代码是( )。

int N;
cin >>N;
int M5,M2,M1;
M5 = N / 5;
M2 = ______________;
M1 = ______________;
printf("5*%d+2*%d+1*%d", M5, M2, M1);

A. 第1横线处应填入:N / 2,第2横线处应填入:N - M5 - M2
B. 第1横线处应填入:(N - M5 * 5) / 2,第2横线处应填入:N - M5 * 5 - M2 * 2
C. 第1横线处应填入:N - M5 * 5 / 2,第2横线处应填入:N - M5 * 5 - M2 * 2
D. 第1横线处应填入:(N - M5 * 5) / 2,第2横线处应填入:N - M5 - M2

答案:B
解析:根据题目意思,我们要用最少数量的纸币组成金额 N,这些纸币由 5 元、2 元、1 元构成,使得最少数量的纸币,优先用大额纸币,即先用 5 元。
所以 M5 可以计算,接下来计算的是 M2,也就是 2元,我们需要从剩下的钱中找,也就是 N-M5*5,取的张数为:M2 = (N - M5 * 5) / 2,所以A选项和C选项不正确。
接着就剩下 1 元的额度,一样使用减法,即:M1 = N - M5 * 5 - M2 * 2,所以B 选项正确。

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

int loopCount = 0;
for (int i=0; i < 10; i++)
	for (int j=1; j < i; j++)
		loopCount += 1;
cout << loopCount;

A. 55
B. 45
C. 36
D. 28

答案:C
解析:逐步分析代码,外层循环:for (int i = 0; i < 10; i++),i 的取值有:0、1、2、3、…、9,一共 10 次,而内层循环:for (int j = 1; j < i; j++) 会根据 i 的值变化而变化,当 i = 0i = 1 时,j=1 不满足 j < i,不进入循环,从 i = 2 开始才开始执行内层循环,可以列出下表,loopCount 每次加 1,所以 1+2+3+…+8 结果等于 36,选C。

image.png

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

int loopCount = 0;
for (int i=0; i < 10; i++){
	for (int j=0; j < i; j++)
		if (i * j % 2)
			break;
	loopCount += 1;
}
cout << loopCount;

A. 25
B. 16
C. 10
D. 9

答案:C
解析:
需要补充代码,将条件补充上去,可得以下代码。

int loopCount = 0;
for (int i=0; i < 10; i++){
	for (int j=0; j < i; j++)
		if (i*j%2!=0)
			break;
	loopCount += 1;
}
cout << loopCount;

loopCount 变量是在外层循环的每次迭代末尾无条件加 1,只有遇到 if (i * j % 2) 这个条件才能 break,跳出内层循环,也就是计算 i*j 的值是否能被 2 整除,可以列得下表,每一轮的 i 都会执行 loopCount 加 1,一共执行了 10 次,内层循环和 loopCount 无关,不影响结果,所以 loopCount 的值为 10。

image.png

11~15 题

11、假设下面C++代码执行过程中仅输入正负整数或0,有关说法错误的是( )。

int N,Sum = 0;
cin >> N;
while (N){
	Sum += N;
	cin >> N;
}
cout << Sum;

A. 执行上面代码如果输入0,将终止循环
B. 执行上面代码能实现所有非0整数的求和
C. 执行上面代码第一次输入0,最后将输出0
D. 执行上面代码将陷入死循环,可将 while (N) 改为 while (N==0)

答案:D
解析:依次判断每个选项。
A选项,逻辑正确,while (N) 表示只要 N ≠ 0 就继续循环;输入为 0 时,while (0) 条件不成立,循环结束,描述正确。
B选项,程序每次输入一个整数 N,如果 N ≠ 0,就将其加入 Sum,直到输入为 0 时终止。实现了非零整数(正负皆可)的求和,描述也正确。
C选项,若第一次输入就是 0,则 while (N) 直接跳过循环体,Sum 保持初值 0,输出也是 0,描述也是正确的。
D选项,while (N==0) 的意思是:当输入是 0 时继续循环。这样就会只在 N 为 0 时才执行循环体,但在代码中如果输入的不是 0,就不会进入循环,而一旦进入循环(即输入了 0),也无法输入新值改变 N,因为死循环就卡住了,故说法错误,正确的终止逻辑是用 while (N),而不是 while (N==0)

12、执行下面的C++代码,有关说法正确的是( )【质数是指仅能被1和它本身整除的正整数】。

int N;
cin >> N;
bool Flag = true;
for ( int i = 2; i < N; i++){
	if (i * i > N)
		break;
	if (N % i == 0){
		Flag = false;
		break;
	}
}
if (Flag)
	cout << N << "是质数" << endl;
else
	cout << N << "不是质数" << endl;

A. 如果输入正整数,上面代码能正确判断N是否为质数
B. 如果输入整数,上面代码能正确判断N是否为质数
C. 如果输入大于等于0的整数,上面代码能正确判断N是否质数
D. 如将 Flag = true 修改为 Flag = N>=2? true:false 则能判断所有整数包括负整数、0、正整数是否为质数

答案:D
解析:依次判断每个选项。
A选项,代码逻辑中循环条件是 i < N,当 N=2 时,i=2 不满足循环条件(2 < 2不成立),循环不执行,Flag 仍为 true,判断正确。
但当 N=1N=0 等非质数正整数时,代码没有处理这类情况,Flag 初始为 true,错误地判断为质数。
因此代码只能正确判断大于2的正整数,不能完全覆盖所有正整数。
B选项,输入负整数或0时,Flag 初始化为 true,但负数和0不是质数,代码没有正确排除这类情况。
C选项,类似前面的分析,0 和 1 都不是质数,但代码初始Flag=true且循环不修改 Flag,会错误判为质数,所以错误。
D选项,通过 Flag = (N >= 2) ? true : false;,这是一个三目运算符,当条件成立,Flag 值等于 true,否则等于 false,初始就排除了 N < 2 的情况(包括负数、0、1),只有满足 N >= 2 才认为有资格是质数。结合后续循环判断,能正确处理所有整数,因此选D。

13、下面C++代码用于实现如下图所示的效果,其有关说法正确的是( )。
image.png

for (int i = 1; i < 6; i++){ // L1
	for (int j = 1; j < i+1; j++) //L2
		cout << i*j << " ";
	cout << endl;
}

A. 当前代码能实现预期效果,无需调整代码
B. 如果 cout << endl; 移到循环L2内部,则可实现预期效果
C. 如果 cout << endl; 移到循环L1外部,则可实现预期效果
D. 删除 cout << endl; 行,则可实现预期效果

答案:A
解析:
分析图片的输出,每一行都是行的倍数,第一行是 1 个 1 的倍数,第二行是两个 2 的倍数,第三行是 3 个 3 的倍数,以此类推。
在代码中,可以写成每一行的作用,如下:

for (int i = 1; i < 6; i++){      // 外层循环控制行数,共5行
    for (int j = 1; j < i + 1; j++)  // 内层循环控制每行元素个数
        cout << i * j << " ";     // 输出每个数,末尾带空格
    cout << endl;                 // 每行输出结束换行
}

分析每个选项,A选项正确,代码每行打印 i 个数字(j 从 1 到 i),每个数字是 i*j,并在内层循环后换行,符合输出情况。
B选项,如果将换行语句放在内层循环体内,每打印一个数字就换行,输出变成一列数字,而非每行一组,输出结构被破坏,错误。
C选项,如果将换行放到外层循环外部,所有数字都在一行输出,失去了分行显示的效果,所以 C选项错误。
D选项,删除换行,所有数字连成一行输出,格式不符合要求,因此错误。

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

int cnt1 = 0, cnt2 = 0;
for (int i = 0; i < 10; i++){
	if (i % 2 == 0)
		continue;
	if (i % 2)
		cnt1 += 1;
	else if (i % 3 == 0)
		cnt2 += 1;
}
cout << cnt1 << " " << cnt2;

A. 5 2
B. 5 0
C. 0 2
D. 0 0

答案:B
解析:遇到 if 语句缺少条件的,要补充好,方便判断,if(i%2) 实际上是 if(i%2!=0),所以按代码顺序执行,cnt1=0,cnt2=0,之后执行 for 循环,循环从 0 开始到 9 结束,循环体中的 if 语句会判断 i 的值,可列出下表,所有 i 是奇数的情况,都执行了 cnt1 += 1else if (i % 3 == 0) 永远不会被执行,因为 i % 2 == 0 的情况已经 continue 跳过了,而剩下的是奇数,进入不了 else 分支,所以 cnt1=5,cnt2=0,故选 B。

image.png

15、在下面的C++代码中,N必须是小于10大于1的整数,M为正整数(大于0)。如果M被N整除则M为幸运数,如果M中含有N且能被N整除,则为超级幸运数,否则不是幸运数。程序用于判断M是否为幸运数或超级幸运数或非幸运数。阅读下面代码,有关说法正确的是( )。

int N, M;
cout << "请输入幸运数字:";
cin >> N;
cout << "请输入正整数:";
cin >> M;
bool Lucky;
if (M % N == 0)
	Lucky = true;
else
	Lucky = false;
while (M){
	if (M % 10 == N && Lucky){
		printf("%d是%d的超级幸运数!", M, N);
		break;
	}
	M /= 10;
}
if (M == 0)
	if (Lucky)
		printf("%d是%d的幸运数!", M, N);
	else
		printf("%d非%d的幸运数!", M, N);

A. 如果N输入3,M输入36则将输出:36是3的超级幸运数!
B. 如果N输入7,M输入21则将输出:21是7的幸运数!
C. 如果N输入8,M输入36则将输出:36非8的超级幸运数!
D. 如果N输入3,M输入63则将输出:63是3的超级幸运数!

答案:D
解析:
该题需要按选项顺序依次判断。

A选项,N=3,M=36,先进行第一个判断:36%3=0,所以 Lucky=true,之后进行循环,因为 36!=0,因此执行循环体,先判断 36%10 是否等于 3,并且 Lucky 是否不等于 0,根据计算,36%10=6、Lucky=true,因为是逻辑与运算,所以判断为假,之后 M/=10,M=3,再次进入循环,3%10=3,刚好等于 N,Lucky 的值没变,所以会输出:3是3的超级幸运数,随后 M 的值变为 0,因为 Lucky=true,所有还会输出 0 是 3 的幸运数,A选项错误。

B选项,N=7,M=21,先进行第一次判断:21%7=0,所以 Lucky=true,之后进入循环,因为 21!=0,因此执行循环体,先判断 21%10 是否等于 7,Lucky 是否不等于 0,由于 21%10=1,所以条件不为真,执行 M/=10,M 的变成 2,接着判断 2%10 是否等于 7,Lucky 是否不等于 0,条件不符合,不执行 if 中的语句,M 变为 0,Lucky=true,所以会输出:0是7的幸运数,B选项也错误。

C选项,N=8,M=36,36%8=4,因此 Lucky=fasle,由于 36!=0 因此进入循环,先判断 36%10 是否等于 8,并且 Lucky 值是否不等于 0,由于 Lucky 的值是 false,因此条件永远为假,M 最终值为 0,Lucky=fasle,所以会输出:0 非8的幸运数,C选项错误。

D选项,N=3,M=63,63%3=0,因此 Lucky=true,由于 63!=0 因此进行循环,先判断 63%10 是否等于 3,并且 Lucky 是否不等于 0,两个条件都为真,所以判断为真,执行语句输出:63是3的超级幸运数,之后 break,跳出循环,M没发生变化,因此后续代码不会再执行,所以D选项正确。

判断题部分。

二、判断题

1~5 题

1、执行C++代码 cout << ‘9’+‘1’; 的输出为10。( )

答案:错误
解析:C++ 会将字符自动识别成 ASCII 码,字符 ‘9’ 对应的是 57,字符 ‘1’ 对应的是 49,两数相加结果是:106,输出的数据是 106,因此错误。

2、C++表达式 -12 % 10 的值为2。( )

答案:错误
解析:
在 C++ 中,取模运算符 % 的结果具有与被除数相同的符号,计算结果为 -2,故错误。

3、C++表达式 int(12.56) 的值为13。( )

答案:错误
解析:int() 为强制转换,会将数值强制转换为 int 类型,自动截断小数部分,保留整数,不进行四舍五入,结果是 12。

4、C++的整型变量N被赋值为10,则语句 cout << N / 3 << “-” << N % 3 执行后输出是3-1。 ( )

答案:正确
解析:/ 是整数除法,结果只保留整数部分,% 是取模(余数)运算符,根据计算规则,N=10,整除之后结果是 3,余数为 1,双引号里面的内容直接输出,因此输出为:3-1

5、在C++代码中,不可以将变量命名为scanf,因为scanf是C++语言的关键字。( )

答案:错误
解析:scanf 只是一个函数名,并不是 C++ 的关键字,所以可以用作变量名。
C++ 保留关键字包括:ifwhileintreturnclasspublic 等,scanf 是标准的输入函数,来源于 C 标准库,但其实不建议这样起变量名,会导致混淆和引发错误。

6~10 题

6、下面C++代码执行后将导致死循环。( )

for (int i = 0; i < 10; i++)
	continue;

答案:错误
解析:for 循环结构分为三部分:
初始值:int i=0,判断条件为 i<10,每次加 1,循环体为 continue,continue 是跳过,跳过当前这次循环中余下的语句,直接进行下一轮循环,程序还是会继续执行的,这段 for 循环会正常执行 10 次后退出,因此不会死循环。

7、下面C++代码执行后将输出10。( )

int cnt = 0;
for (int i = 0; i < 10; i++)
	for (int j = 0; j < i; j++){
		cnt += 1;
		break;
	}
cout << cnt;

答案:错误
解析:
使用列表法,将程序模拟运行,cnt 的结果是 9,说法错误。
分析代码,从 i = 1 到 9(共 9 次),每次都进入内层循环,执行一次 cnt += 1,内层循环中的 break 的作用是 一进入内层循环就跳出该循环,所以当 i>=1 时,cnt 只加了一次。

image.png

8、下面C++代码执行后,将输出5。( )

int cnt = 0;
for (int i = 1; i < 5; i++)
	for (int j = i; j < 5; j +=i)
		if (i * j % 2 == 0)
			cnt += 1;
cout << cnt;

答案:正确
解析:

9、下面C++代码能实现正整数各位数字之和。( )

int N,Sum = 0;
cin >> N;
while (N){
	Sum += N % 10;
	N /= 10;
}
cout << Sum;

答案:正确
解析:
分析代码,输入一个正整数 N,初始化 Sum 为 0,用来存储数字各位的和,- 每次循环,N % 10 获取 N 的最后一位数字,加到 Sum 中,然后 N /= 10 去掉这一位,循环直到 N == 0,也就是所有位都处理完,最后输出的是所有位数之和。

10、GESP测试是对认证者的编程能力进行等级认证,同一级别的能力基本上与编程语言无关。( )

答案:正确
解析:
GESP(编程能力等级认证)主要评估的是编程思维、算法设计和解决问题的能力,而不是特定的编程语言语法。
因此,同一级别的能力认证基本上与具体使用的编程语言无关,重点在于算法的理解和实现能力。