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 < 10 为 1 <= i && i < 10 ,输出同样为 45 ,因为加上 0 不影响结果。
B. 如果将 i = 0 和 tot = 0 合并为 i = tot = 0 ,执行结果与修改前相同。
C. 将 tot += 1 与 i += 1 交换顺序,执行结果与修改前相同。
D. 将 i = 0 与 tot = 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) / 60 和 pos == 0
B. (start + n) % 60 和 pos == 0
C. (start + n) / 60 和 pos <= 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 *= i 即 rst = 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。两者输出不同,因此判断为错误。
浙公网安备 33010602011771号