GESP认证C++编程真题解析 | 202606 一级

附上汇总帖:GESP认证C++编程真题解析 | 汇总


单选题

第1题

学校组织到未来农场参观,小明听讲解员介绍,在智能温室中,湿度传感器可以连续检测土壤的湿度变化,并将检测到的湿度数据实时发送给中央控制器。中央控制器根据这些数据判断是否开启灌溉系统。请问,这里的湿度传感器所发挥的作用,类似于计算机系统中的哪一类组件?( )

A. 处理器

B. 存储器

C. 输入设备

D. 输出设备

【答案】:C

【解析】

湿度传感器的作用是采集外界环境数据(土壤湿度)并将数据传送给中央控制器,这与计算机中"输入设备"的功能完全一致——输入设备负责将外部信息转换为计算机可识别的数据送入系统。处理器负责运算和控制,存储器负责保存数据,输出设备负责将计算机处理结果向外呈现,均不符合传感器“采集并送入数据“的特征。故选C。

第2题

在使用某集成开发环境(比如 Dev-C++)来编辑源代码文件时,程序员经常需要在编辑区中对代码进行各种修改。以下关于在编辑区中执行的操作描述不正确的( )。

A. 可以将变量名 count 统一修改为 number

B. 可以连续撤销最近 \(2\) 次输入的内容

C. 可以调整代码行的缩进(如按 Tab 键)

D. 在注释文本中间不能混用中英文

【答案】:D

【解析】

集成开发环境的编辑区支持查找替换功能,可以批量将变量名 count 改为number,A正确。编辑器支持多步撤销,可以连续撤销最近的多次操作,B正确。按Tab键可以调整缩进,C正确。注释文本只是被编译器忽略的文字,其中完全可以混用中文和英文,没有任何限制,D的说法不正确。故选D。

第3题

有关如下 C++ 代码的说法,正确的是( )。

float a = 3 + 3.5;
cout << a;

A. 代码执行将报错。如果将 a = 3 + 3.5 改为 a = 3 + 3 + 1/2 将能正常执行。

B. 代码执行将报错。如果将 a = 3 + 3.5 改为 a = 3.0 + 3.5 将能正常执行。

C. 代码能正常执行,将输出 6

D. 代码能正常执行,将输出 6.5

【答案】:D

【解析】

表达式式 3+3.5 中,3是int 类型,3.5是double 类型。C++在混合运算时会将整型自动提升为浮点型,因此3+3.5=6.5,赋值给 float 类型的 a 后值为6.5,输出6.5,代码不会报错。A选项和B选项都认为代码会报错,不正确;且A选项中的1/2是整数除法结果为0,并非等价写法。C选项输出值应为6.5而非6。故选D。

第4题

下列 C++ 表达式与 - 2 * 2 % 4 的值不同的是( )。

A. - (2 * 2) % 4

B. (- 2 * 2) % 4

C. - 2 * (2 % 4)

D. (2 * 2) % - 4

【答案】:C

【解析】

一元负号 - 的优先级高于 * 和 % ,且 * 和 % 同优先级从左到右结合。原式 -2 * 2 % 4 中一元负号先作用于2得到-2,然后 -2 * 2 = -4,最后 -4 % 4 = 0。A选项 -(2*2)%4 = -(4)%4 = -4%4 = 0,相同。B选项(-2*2)%4 = -(4)%4 = 0,相同。C选项 -2*(2%4) = -2*2 = -4,结果为-4,与原式0不同。D选项(2*2)%-4 = 4%-4 = 0,相同。故选C。

第5题

执行如下 C++ 代码片段,其输出是( )。

int a = 3;
int b = a;
a = 4;
printf("%d %d", a, b);

A. 3 3

B. 4 3

C. 4 4

D. 3 4

【答案】:B

【解析】

执行 int a = 3 后 a 为3,int b = a 将 a 的当前值3赋给b,此时b为3。随后a=4讲a修改为4,但b中保存的是之前拷贝的值3,不受影响。因此输出 4 3。故选B。

第6题

如下 C++ 代码执行时输入 2026-6-27 ,下列说法正确的是( )。

int N;
cin >> N;
cout << N;

A. 输入失败,不允许输入减号,没有输出

B. 允许输入,输出 1993

C. 允许输入并原样输出 2026-6-27

D. 允许输入并输出 2026

【答案】:D

【解析】

cin >> N 中N是int 类型,cin 在读取整数时会逐字符解析,遇到非数字字符(减号 - 不是负号开头位置)即停止读取。输入 2026-6-27 时,cin 读取到 2026 后遇到减号 - 停止,N的值为2026,缓冲区中剩余 -6-27 未被读取。因此输出2026。故选D。

第7题

如下 C++ 代码执行时,其说法错误的是( )。

int N, M;
cin >> N >> M;

if (N > M)
	cout << "A " << (N - M);
else
	cout << "B " << (M - N);

A. 如果输入 4 3 ,将输出 A 1

B. 如果输入 3 4 ,将输出 B 1

C. 如果输入 3 3 ,将输出 A 0

D. 如果输入 4 4 ,将输出 B 0

【答案】:C

【解析】

代码逻辑为:当 N>M 时输出 A 和 N-M,否则(包括N == M的情况)输出 B 和 M-N。输入 4 3 时,4>3成立,输出 A 1,A正确。输入 3 4 时,3>4不成立,走else分支,输出 B 1,B正确。输入 3 3 时,3>3不成立,走else分支,输出 B 0 而非 A 0,C说法错误。输入 4 4 时,4>4不成立,走else 分支,输出 B 0,D正确。故选C。

第8题

阅读如下 C++ 代码,下列说法错误的是( )。

int cnt = 0;
for (int i = 0; i < 5; i++)
	cnt += 1;
cout << cnt;

A. 将 cnt += 1 修改为 cnt = cnt + 1 ,执行效果相同

B. 将 cnt += 1 修改为 cnt = 1 + cnt ,执行效果相同

C. 将 cnt += 1 修改为 cnt =+ 1 ,执行效果相同

D. 将 cnt += 1 修改为 cnt = + 1 + cnt ,执行效果相同

【答案】:C

【解析】

cnt += 1等价于cnt= cnt +1,A正确。cnt = 1 + cnt 与cnt=cnt + 1结果相同,B正确。。cnt =+ 1实际上被编译器解析为cnt=(+1),即把cnt赋值为正整数1,而非在原值上加1,执行效果完全不同,C错误。cnt =+1+cnt 解析为cnt =(+1)+cnt ,即cnt=1+cnt ,效果相同,D正确。故选C。

第9题

如下 C++ 代码执行后输出是 1 2 3 4 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 8 9 10 11 5 6 7 。横线处应该先后依次填入的运算符是( )。

int num = 1;
for (int i = 0; i < 35; i++) {
	printf("%d ", num);
	if (num _______ 10)
		num _______ 2;
	else
	num _______ 1;
}

A. > /= +=

B. >= %= +=

C. > %= +=

D. > /= =+

【答案】:A

【解析】

观察输出序列:1到11递增,到11后回到5,再递增到11,如此循环。这说明num到11后执行了除以2的操作(11/2=5),其余时候每次加1。因此第一个空填>(大于10时触发除法),第二个空填 /=(除以2),第三个空填 += (加1)。A选项 > /= += 完全匹配。B选项用 %= 会让num对2取余,11%2=1,不符合输出。D选项 =+ 会被解析为 = + (赋正值),num会变为1而非加1。故选A。

第10题

如下 C++ 代码可以执行,其输出是( )。

int i;
for (i = 1; i < 5; i++)
	if (i % 2 == 0) {
		continue;
		cout << i << "#";
	}
cout << i << "END#";

A. 5END#

B. 5#END

C. 1#3#4#END

D. 1#3#4 END#

【答案】:A

【解析】

循环中当 i % 2 == 0(即i为偶数)时执行 continue,跳过后面的 cout 语句直接进入下一次循环。continue 之后的 cout << i << "#" 永远不会执行。循环正常结束后 i 的值为5(i 从 1 到 4 循环,退出时 i 自增为5)。因此输出 5END#。故选A。

第11题

如下 C++ 代码执行时,下列说法正确的是( )。

int N, i;
cin >> N;
for (i = 2; i < N; i++)
	if (N % i == 0) {
		cout << "1#";
		break;
	} else
		cout << "0#";

A. 如果输入 2 ,将输出 1#

B. 如果输入 15 ,将输出 0#1#

C. 如果输入 1 ,将输出 0#

D. 如果输入 3 ,将输出 1#

【答案】:B

【解析】

代码从 i=2 开始试探 N 是否能被 i 整除,若能整除则输出 1# 并跳出,否则输出 0# 继续循环。输入 2 时,循环条件 i<N 即 2<2 为假,循环不执行,无输出,A错误。输入15时,i=2时 15%2≠0 输出 0#,i=3 时 15%3 == 0 输出 1# 并 break,最终输出 0#1#,B正确。输入1时,2<1为假,循环不执行,无输出,C错误。输入3时,i=2时3%2≠0输出 0#,循环结束(i=3不满足i<3),输出 0# 而非 1#,D错误。故选B。

第12题

有关如下 C++ 代码,下列说法中错误的是( )。

int i, tot;
i = 0, tot = 0;
while (0 <= i && i < 10) {
	tot += 1;
	i += 1;
}
cout << tot;

A. 如果调整 0 <= i && i < 101 <= i && i < 10 ,输出同样为 45 ,因为加上 0 不影响结果。

B. 如果将 i = 0tot = 0 合并为 i = tot = 0 ,执行结果与修改前相同。

C. 将 tot += 1i += 1 交换顺序,执行结果与修改前相同。

D. 将 i = 0tot = 0 交换顺序,执行结果与修改前相同。

【答案】:A

【解析】

原代码中 i 从0到9共循环10次,tot 最终为10,并非45。A选项声称输出为45且修改条件后结果不变,这个说法本身就是错误的——实际输出为10。B选项i = tot = 0从右向左赋值,i和tot都被赋为0,与原代码效果相同,B正确。C选项交换tot +=1和i +=1的顺序不影响结果,因为两者之间无依赖关系,循环仍执行10次,tot为10,C正确。D选项交换i=0和tot=0的顺序,两个独立赋值交换不影响结果,D正确。故选A。

第13题

以下 C++ 代码可以找出千位、百位、十位和个位满足特定条件的四位数(例如各位数字的四次方和等于原 数,即“四叶玫瑰数”),横线处应该填入的是( )。

int count = 0;
for (int n = 1000; n <= 9999; n++) {
	int a = n / 1000;
	int b = (n / 100) % 10;
	_________________________ // L1
	int d = n % 10;
	if (a * a * a * a + b * b * b * b + c * c * c * c + d * d * d * d == n) { // 特定条件
		count++;
	}
}

A. int c = (n / 10) / 10;

B. int c = (n / 10) % 10;

C. int c = (n % 10) / 10;

D. int c = (n % 10) % 10;

【答案】:B

【解析】

代码中a取千位(n/1000),b取百位((n/100)%10)、d取个位(n%10),缺少的是十位c的取法。取十位数字的方法是先将n除以10去掉个位,再对10取余得到十位数字,即(n/10)%10。A选项(n/10)/10得到的是n/100,会包含百位和千位,不是单个数字。C选项(n%10)/10中n%10是个位数字(0-9),再除以10结果恒为0。D选项(n%10)%10等于n%10是个位数字而非十位。故选B。

第14题

下面的 C++ 代码用于计算经过 n 秒后的秒针位置( \(0\sim 59\) ),两处横线处分别应填入的代码是( )。

int start, n, pos;
cout << "当前秒数(0-59): ";
cin >> start;
cout << "经过多少秒: ";
cin >> n;

pos = ____________; // L1
if (____________) // L2
	cout << n << "秒后回到12点方向" << endl;
else
	cout << n << "秒后指向" << pos << "秒刻度" << endl;

A. (start + n) / 60pos == 0

B. (start + n) % 60pos == 0

C. (start + n) / 60pos <= 0

D. (start + n) % 60 和 pos = 0

【答案】:B

【解析】

秒针在0-59秒之间循环,经过n秒后的位置应该用取模运算(start +n) % 60来计算,排除A和C。当秒针回到12点方向时pos为0,判断条件应为pos == 0(相等比较)。D选项中pos = 0是赋值语句而非比较,会在条件中把 pos 赋为0且条件恒为真,逻辑错误。故选B。

第15题

如果正整数 N 只能被 1 和它本身整除,则它是一个质数(或素数)。下面的 C++ 代码用于判断正整数 N 是否为质数(素数)。若 N 是质数,输出 YES ,否则输出 NO 。横线处不应填入的代码是( )。

int N, i;
cin >> N;
if (N <= 1) {
	cout << "NO";
	return 0;
}
for (i = 2; ______; i++) {
	if (N % i == 0) {
		cout << "NO";
		return 0;
	}
}
cout << "YES";

A. i < N

B. i <= N

C. i <= N / 2

D. i * i <= N

【答案】:B

【解析】

判断质数需要在2到N-1范围内试探是否有因子。A选项i<N是标准写法,正确。C选项 i<=N/2也是可行的,因为N的最小因子不超过N/2(除了N本身),正确。D选项 i * i <= N 利用了因子成对出现的性质,只需试到 √N 即可,是优化写法,正确。B选项 i <= N 会让循环执行到 i=N,此时N %N == 0必然成立,导致所有正整数都被判为非质数(包括真正的质数),因此B是不应填入的代码。故选B。

判断题

第1题

又到期末考试周,小明发现这次许多闭卷考试不仅禁止携带手机、平板电脑,还有最近比较时髦的各类 AI 眼镜(也有叫智能眼镜)也同样不允许带入考场。这些 AI 眼镜应该也是内置了操作系统并可能支持 Wi-Fi 或蓝牙连接。

A. 正确

B. 错误

【答案】:A

【解析】

AI眼镜(智能眼镜)是一种可穿戴计算设备,内部集成了处理器、存储器等硬件组件,运行嵌入式操作系统,并通常支持Wi-Fi或蓝牙等无线连接方式,可以独立进行计算和通信。因此将其视为带有操作系统和网络连接能力的设备是正确的,考场禁止携带也正是因为其具备信息获取和通信能力。

第2题

如果 n 为大于 的整数,则 C++ 表达式 (n / 10) % 10(n % 100) / 10 的结果相同。

A. 正确

B. 错误

【答案】:A

【解析】

两个表达式都是取十位数字。(n/10)%10先去掉个位再取余得到十位。(n%100)/10先取后两位(十位和个位),再除以10去掉个位得到十位。对于任意正整数n,两种写法的结果都是n的十位数字,结果相同。

第3题

下面 C++ 代码执行后将输出 19

int i;
for (i = 0; i < 20; i += 3)
	if (i % 3 != 0)
		break;
cout << i;

A. 正确

B. 错误

【答案】:B

【解析】

i 从0开始,每次加3,因此的 i 值依次为0、3、6、9、12、15、18。每次循环中i%3的结果都是0,条件 i%3!=0 恒为假,break 永远不会执行。循环正常结束时i=21(i=18时满足条件,加3后i=21不满足i<20退出),输出21而非19。

第4题

在数学中,\(N!\) 称之为 \(N\) 的阶乘,其含义是 \(1\)\(N\) 之积,包括 \(N\)。如 \(3!=1\times 2\times 3 = 6\)。如下 C++ 代码能输出 \(N!\) 的结果。

int N;
cout << "请输入正整数:";
cin >> N;
int rst = 0;
for (int i = 1; i < N + 1; i++)
	rst *= i;
cout << rst;

A. 正确

B. 错误

【答案】:B

【解析】

阶乘是从1乘到n的累乘,初始值应为1。但代码中rst 初始化为0,rst *= irst = rst * i,0乘以任何数都是0,因此无论输入什么N,输出始终为0,无法正确计算阶乘。应将int rst=0改为int rst =1才能正确计算。

第5题

如下 C++ 代码能实现输出正整数 \(N\) 的各位数字。

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

A. 正确

B. 错误

【答案】:A

【解析】

代码通过N%10取个位数字,N/10去掉个位,循环执行可以逐位输出N的各个数字。虽然输出顺序是从低位到高位(先个位、再十位、再百位……),但题目表述为"输出正整数N的各位数字",并未限定必须按从高位到低位的顺序。因此该代码能够实现逐位输出N的各位数字,判断正确。若题目要求按原数顺序输出,则需要先将各位数字保存下来再逆序输出。

第6题

将如下 C++ 代码中的 printf("\n") 更换为 printf("%c", '\n') ,输出效果相同。

for (int i = 0; i < 100; i++) {
	if (i % 5 == 0)
		printf("\n");
	printf("%2d ", i);
}

A. 正确

B. 错误

【答案】:A

【解析】

printf("\n")直接输出换行符字符串。printf("%c", '\n')通过格式符%c 输出字符'\n'(换行符)。两者都是向输出流写入一个换行字符,效果完全相同。'\n'是转义字符表示换行,与字符串“\n"中包含的换行符一致。

第7题

C++ 代码 cout << (2.5 % 2) 能够生成可执行代码,但执行时将报错,因为 % 只能适用于正整数。

A. 正确

B. 错误

【答案】:B

【解析】

取模运算符%的操作数必须是整型,2.5是浮点数(double 类型)因此2.5%2在编译阶段就会报错("invalid operands of types 'double' and 'int' to binary 'operator%"),无法生成可执行代码。题目说"能够生成可执行代码"是错误的,实际上编译就不会通过。此外%适用于所有整型(包括负整数),并非只能用于正整数。

第8题

下面的 C++ 代码执行后将输出 24

int total;
for (int n = 1; n <= 4; n++) {
	total *= n;
}
cout << total;

A. 正确

B. 错误

【答案】:B

【解析】

代码中 total 声明后未初始化,其值是未定义的(在C++中局部变量未初始化时为随机值)。total *= n 在未初始化的随机值基础上累乘,结果不可预测。即使假设 total 恰好为1,4的阶乘确实是24,但由于未初始化,结果并非确定的24。因此"将输出24"的说法不正确。

第9题

如果 a 是 C++ 的整型变量,值为 4 ,则表达式 (a % 2 == 0) + (a / 2) 的值为 4

A. 正确

B. 错误

【答案】:B

【解析】

a 为4时,a% 2 == 0 即 4%2 == 0 为 true,在C++中 true 转换为整型值为1。a/2 即 4/2 为2。因此 (a % 2 == 0)+ (a / 2) = 1 + 2 = 3。编译验证结果为3,而非4。题目说值为4是错误的。

第10题

删除下面 C++ 代码中的 continue 后,其输出与原来相同。

int x = 0;
while (x < 4) {
	x++;
	if (x == 2) continue;
	cout << x << ",";
}

A. 正确

B. 错误

【答案】:B

【解析】

原始代码中,当 x == 2 时执行 continue 跳过 cout 语句,不输出2,输出为1,3,4。删除 continue 后,if (x == 2) 的条件判断为空语句(或条件成立后继续执行cout),x为2时也会输出,输出变为1,2,3,4。两者输出不同,因此判断为错误。

编程题

题解:洛谷 B4551 [GESP202606 一级] 去旅行

题解:洛谷 B4552 [GESP202606 一级] 交税

posted @ 2026-07-06 22:06  团爸讲算法  阅读(66)  评论(0)    收藏  举报