GESP认证C++编程真题解析 | 202606 二级
附上汇总帖:GESP认证C++编程真题解析 | 汇总
单选题
第1题
学校组织到未来农场参观,小明听讲解员介绍,在智能温室中,湿度传感器可以连续检测土壤的湿度变化,并将检测到的湿度数据实时发送给中央控制器。中央控制器根据这些数据判断是否开启灌溉系统。请问,这里的湿度传感器所发挥的作用,类似于计算机系统中的哪一类组件?( )
A. 处理器
B. 存储器
C. 输入设备
D. 输出设备
【答案】:C
【解析】
湿度传感器采集外界环境数据(土壤湿度)并传送给中央控制器,这与计算机中"输入设备"的功能一致——输入设备负责将外部信息转换为计算机可识别的数据送入系统。处理器负责运算和控制,存储器负责保存数据,输出设备负责将处理结果向外呈现,均不符合传感器"采集并送入数据"的特征。故选C。
第2题
小明去农场参观回来后就在自己的电脑上安装了一个 3D 农场仿真模拟系统,因为他今年买的二手电脑有点老旧,系统运行时经常弹出“系统内存不足”的警告,导致系统卡顿严重。他计划通过增加物理内存来解决问题。请问他应该购买以下哪种硬件组件?( )
A. 机械硬盘
B. 内存条
C. 图形显卡
D. 移动硬盘
【答案】:B
【解析】
"系统内存不足"指的是运行内存(RAM)不足。运行内存是CPU在运行程序时临时存放数据的地方,由内存条提供。增加物理内存即购买并安装内存条。机械硬盘和移动硬盘是外存储器,用于长期保存文件,不能解决运行内存不足的问题。图形显卡(GPU)负责图形计算,与内存无关。故选B。
第3题
有关如下 C++ 代码的说法,正确的是( )。
float a = 3 + 3.5;
cout << a;
A. 代码执行将报错。如果将 a = 3 + 3.5 改为 a = float(3) + 3.5 将能正常执行。
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++在混合运算时会自动将整型提升为浮点型,结果为6.5,赋值给float 类型的a后值为6.5,代码正常执行输出6.5。A选项和B选项都认为代码会报错,不正确;float(3)+3.5和3.0+3.5本身都能正常执行,但原代码本身就不会报错。C 选项输出值应为6.5而非6。故选D。
第4题
下面选择项中,与 C++ 表达式 not (x > 5 or y <= 10) 等价的是( )。
A. x <= 5 or y > 10
B. x > 5 and y <= 10
C. x <= 5 and y > 10
D. not x > 5 and not y <= 10
【答案】:C
【解析】
根据德摩根定律,not (A or B)等价于not A and not B 。将X > 5取否定得x<=5,将y<=10取否定得y>10,因此 not (x > 5 or y <= 10)等价于x<=5 and y > 10。A选项用了 or 而非 and,错误。B选项完全相反。D选项not x >5 and not y <= 10由于运算符优先级问题,not 优先级高于比较运算符,会被解析为(not x) > 5 and (not y) <= 10与原式不等价。故选C。
第5题
小明在某开发环境中执行 C++ 代码 cout << (2.5 + 2.25) << ' ' << (2.2 + 2.1) 时输出 4.75 4.300000000000001 ,其原因最可能是( )。
A. C++ 的 + 运算符在处理浮点数时有时正确,有时错误
B. 某些浮点数难以精确表示,导致微小误差
C. + 运算符不能用于浮点数,只能用于整数
D. 因为 cout 函数难以输出太长的数值
【答案】:B
【解析】
计算机中浮点数采用二进制存储,许多十进制小数(如2.2和2.1)无法被精确表示为有限位二进制小数,只能存储近似值。运算时这些微小的表示误差会累积,导致2.2+2.1的结果不是精确的4.3而是带有极小误差的4.300000000000001。而2.5和2.25恰好可以精确表示为二进制小数,因此2.5+2.25=4.75完全精确。这不是运算符的问题,也不是cout的问题,而是浮点数本身的精度特性。故选B。
第6题
执行如下 C++ 程序后,当输入 4 时,输出的最后一行是( )。
int n;
cin >> n;
for (int i = n; i > 0; i--) {
for (int j = 0; j < i; j++)
cout << j + 1 << ' ';
cout << endl;
}
A. 0
B. 1
C. 1 2
D. 1 2 3 4
【答案】:B
【解析】
外层循环 i 从 n 递减到1,内层循环输出1到i。输入4时,第一次i=4输出1234,第二次i=3输出1 2 3,第三次i=2输出1 2,第四次i=1输出1。因此最后一行是1。故选B。
第7题
下面的 C++ 代码执行后其输出是( )。
int tnt = 0;
for (int i = 1; i < 5; i += 3) {
for (int j = 0; j < i; j++)
tnt += 1;
cout << tnt << "#";
}
cout << tnt;
A. 1#5#5
B. 1#5#5#
C. 1#5#12#12
D. 0
【答案】:A
【解析】
外层循环i取值为1和4(i从1开始,每次加3,i<5)。当i=1时,内层循环执行1次,tnt从0增到1,输出1#。当i=4时,内层循环执行4次,tnt从1增到5,输出5#。循环结束后输出tnt的值5。因此完整输出为1#5#5。故选A。
第8题
下面的 C++ 代码执行之后的输出是( )。
int i;
for (i = -2; i < 2; i++)
if (not i % 3 == 0)
cout << i << "#";
cout << i;
A. -2#-1#1#2
B. -2#-1#1#2#3
C. 1#2#3
D. 0#1#2#3
【答案】:A
【解析】
循环i从-2到1。not 在C++中是!的替代关键字,优先级高于%和 == ,因此not i %3 == 0 被解析为 ((not i) % 3) == 0。逐项验证:i=-2时not(-2)即!(-2),-2非零为真,!(-2)为假即0,0 % 3 = 0,0 == 0 为真,输出-2#。i=-1时 not(-1)=0,0 % 3 = 0,0 == 0 为真,输出-1#。i=0时not(0)=1,1 % 3 = 1,1 == 0为假,不输出。i=1时not(1)=0,0 % 3 = 0,0 == 0为真,输出1#。循环结束后i=2,输出2。完整输出为-2#-1#1#2。故选A。
第9题
下面的 C++ 代码执行后其输出是( )。
int cnt = 0, i, j;
for (i = 0; i < 3; i++) {
j = i;
while (j) {
cnt += 1;
j -= 1;
}
}
cout << i << ' ' << j << ' ' << cnt;
A. 3 0 3
B. 2 0 4
C. 2 0 5
D. 3 0 5
【答案】:A
【解析】
外层循环i从0到2。i=0时,j=0,while(j)条件为假,不执行内层循环。i=1时,j=1,内层循环执行1次,cnt=1,j减到0。i=2时,j=2,内层循环执行2次,cnt=3,j减到0。循环结束后i=3,j=0(最后一次内层循环结束时j为0),cnt=3。输出3 0 3。故选A。
第10题
下面 C++ 代码执行后其输出是( )。
int count = 0, i, j;
for (i = 1; i < 4; i++)
for (j = 0; j < i; j++) {
if (j % 3 != 0)
continue;
count += 1;
break;
}
cout << i << ' ' << j << ' ' << count;
A. 4 0 4
B. 3 0 0
C. 3 2 0
D. 4 0 3
【答案】:D
【解析】
外层循环i从1到3。每次内层循环j从0开始,当j % 3 == 0(即j=0)时,j % 3 != 0为假,不执行continue,执行count +=1然后 break 跳出内层循环。因此每次内层循环只执行一次(j=0时就break),count 每次加 1。i=1时count=1,i=2时count=2,i=3时count=3。外层循环结束后i=4。内层循环最后一次执行时j=0,break时j保持为0。输出4 0 3。故选D。
第11题
如下 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++) {
cout << num << " ";
if (num _______ 10)
num _______ 2;
else
num _______ 1;
}
A. > /= +=
B. >= %= +=
C. > /= =+
D. >= %=
【答案】:A
【解析】
观察输出序列:1到11递增,到11后回到5,再递增到11,如此循环。这说明num大于10时执行除以2的操作(11/2=5),其余时候每次加1。因此三个空分别填>(大于10时触发)、/=(除以2)、+=(加1)。A选项> /= += 完全匹配。B选项用 >= 会在num=10时就触发取余,10%2=0,不符合输出。C和D选项中 =+ 被解析为 = + (赋正值),num会变为1而非加1。故选A。
第12题
如下数字图形在通过执行后续的 C++ 代码时,输入 10 来输出。横线处应填入的代码是( )。
1 1 1 1 1 1 1 1 1 1
1 1 0 0 0 0 0 0 0 1
1 0 1 0 0 0 0 0 0 1
1 0 0 1 0 0 0 0 0 1
1 0 0 0 1 0 0 0 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 1 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 0 1 1
1 1 1 1 1 1 1 1 1 1
int N;
cin >> N;
for (int i = 1; i < N + 1; i++) {
for (int j = 1; j < N + 1; j++)
if (________)
cout << "1 ";
else
cout << "0 ";
cout << endl;
}
A. i == j and i == 1 and j == 1 and i == N and j == N
B. i == j or i == 1 or j == 1 or i == N or j == N
C. i == j or i == 0 or j == 0 or i == (N + 1) or j == (N + 1)
D. i == j and i == 1 and j == 1 and i == (N + 1) and j == (N + 1)
【答案】:B
【解析】
观察图形:第一行和最后一行全为1(i=1或i=N),第一列和最后一列全为1(j=1或j=N),此外主对角线(i == j)也为1。这些条件之间是"或"的关系,任一满足即输出1。B选项 i == j or i == 1 or j == 1 or i == N or j == N 完整覆盖了这五种情况。A选项用 and 要求所有条件同时满足,不可能成立。C 选项中i == 0和 j == 0 在循环范围内(1到N)永远不成立,i == N+1和j == N+1 同理,因此C实际上只判断了 i == j,缺少边框。D选项同样用 and,不正确。故选B。
第13题
英文 corner case 通常翻译为极端案例或边角案例,通常指正常范围以外的问题或者情形。在如下 C++ 代码中,变量都是整型,则 corner case 最应该是( )。
int tnt = 0, cnt = 0;
while (1) {
int score;
cin >> score;
if (score == -1)
break;
tnt += score;
cnt += 1;
}
cout << tnt / cnt;
A. tnt = 0, cnt = 0 是 corner case ,应分为两行
B. while(1) 是 corner case ,因为 while(1) 将会导致死循环
C. cin >> score 是 corner case ,因为输入数据前应该提示整型数据
D. cout << tnt / cnt 是 corner case ,因为如果直接输入 -1 ,将导致执行错误,虽然这种情况较为罕见
【答案】:D
【解析】
corner case 指极端或边界情况。代码中tnt / cnt 是求平均分,如果用户第一个输入就是-1,则cnt为0,执行tnt / cnt 会发生除零错误导致程序崩溃。虽然这种情况较为罕见,但正是典型的corner case。A选项 tnt=0, cnt=0 写在一行是合法的逗号表达式,不是问题。B选项while(1)虽然是死循环,但循环体内有break 可以正常退出,不是 corner case。C选项输入前是否提示只是编程风格问题,不影响正确性。故选D。
第14题
如下 C++ 代码执行后,输入 4 后,输出的数字图形是( )。
int n;
cin >> n;
for (int i = n; i > 0; i--) {
for (int j = 0; j < n - i; j++)
cout << "0 ";
for (int k = 0; k < i; k++)
cout << k + 1 << " ";
cout << endl;
}
A.
1 2 3 4
1 2 3 0
1 2 0 0
1 0 0 0
B.
1 2 3 4
0 1 2 3
0 0 1 2
0 0 0 1
C.
1 2 3 4
2 3 4 0
3 4 0 0
4 0 0 0
D.
0 0 0 1
0 0 1 2
0 1 2 3
1 2 3 4
【答案】:B
【解析】
输入4时,外层循环i从4递减到1。i=4时,第一个内层循环 j<0 不执行(不输出0),第二个循环输出1 2 3 4。i=3时,第一个循环 j<1 输出一个0,第二个循环输出1 2 3,整行为 0 1 2 3。i=2时,第一个循环输出 0 0,第二个循环输出1 2,整行为 0 0 1 2。i=1时,第一个循环输出 0 0 0,第二个循环输出1,整行为0 0 0 1。选B。
第15题
某学校举办“校园演讲比赛”,每位选手由 \(8\) 位评委打分(分数为 \(0\sim 10\) 的整数),且每位评委必须打分。计分规则:去掉一个最高分,去掉一个最低分。如下程序通过键盘先输入选手编号,然后依次输入 \(8\) 个分数,并计算最终得分。下列说法正确的是( )。
for (int i = 0; i < 10; i++) {
int id, score;
printf("输入选手编号: ");
scanf("%d", &id);
int max_score = 0, min_score = 100; // 最高分和最低分
int total_score = 0; // 总分
for (int j = 1; j < 9; j++) {
printf("输入选手第%d个成绩:", j);
scanf("%d", &score);
if (max_score < score)
max_score = score;
if (min_score > score)
min_score = score;
total_score += score;
}
total_score = total_score - max_score - min_score;
printf("%d号选手的成绩:\
去掉一个最高分%d,\
去掉一个最低分%d,\
最后成绩是:%d", id, max_score, min_score, total_score);
}
A. 上述代码能完成题目要求
B. max_score = 0, min_score = 100 应修改为 max_score = 0, min_score = 0
C. max_score < score 和 min_score > score 必须相应修改为 <= 和 >=
D. total_score = total_score - max_score - min_score 不能达到预期,可修改如下:
int total = total_score - max_score - min_score;
total_score = total;
【答案】:A
【解析】
代码中8位评委对应内层循环j从1到8共8次,正确。max_score 初始化为0(分数最小为0),min_score 初始化为100(分数最大为100),能正确追踪最高分和最低分。使用<和>比较可以正确找到最高分和最低分的值(即使有多个相同最高分,max_score 也会被更新为该值)。最后total_score - max_score - min_score 从总分中去掉一个最高分和一个最低分,逻辑正确。B选项将min_score 改为0会导致无法正确找到最小值。C选项改为<=和>=不影响结果,不是必须的。D选项的修改只是换了一种写法,原代码本身就能达到预期。故选A。
判断题
第1题
又到期末考试周,小明发现这次许多闭卷考试不仅禁止携带手机、平板电脑,还有最近比较时髦的各类 AI 眼镜(也有叫智能眼镜)也同样不允许带入考场。这些 AI 眼镜应该也是内置了操作系统并可能支持 Wi-Fi 或蓝牙连接。
A. 正确
B. 错误
【答案】:A
【解析】
AI眼镜(智能眼镜)是一种可穿戴计算设备,内部集成了处理器、存储器等硬件组件,运行嵌入式操作系统,并通常支持Wi-Fi或蓝牙等无线连接方式,可以独立进行计算和通信。因此将其视为带有操作系统和网络连接能力的设备是正确的,考场禁止携带正是因为其具备信息获取和通信能力。
第2题
C++ 代码 cout << (not ('5' % 2 == 0) == ((not '5' % 2) == 0)) 执行后的输出是 1 。
A. 正确
B. 错误
【答案】:A
【解析】
逐步分析:字符'5'的ASCII码为53。'5'%2即53%2=1,1 == 0 为假(0),not 0为真(1)。再看右半部分:not '5'即not 53,53非零为真,not 真为假(0),0%2=0,0 == 0 为真(1)。最终1 == 1为真(1),输出1。
第3题
执行 C++ 语句 cout << (int(3.5) * 2) 将输出 6 。
A. 正确
B. 错误
【答案】:A
【解析】
int(3.5) 是强制类型转换,将浮点数3.5转换为整型,截断小数部分得到3。3 * 2 = 6,输出6。
第4题
下面 C++ 代码执行后将输出 1-4-7- 。
for (int i = 1; i < 10; i += 3) {
if (not i % 3)
break;
cout << i << "-";
}
A. 正确
B. 错误
【答案】:A
【解析】
循环 for (int i =1; i< 10; i += 3)中i取值为1、4、7。每次循环检查 not (i % 3),即判断 i 能否被3整除(若能整除则i%3为0,not 0即为真)。i=1时1%3=1,not 1为假,不break,输出1-。i=4时4%3=1,not 1为假,输出4-。i=7时7%3=1,not 1为假,输出7-。i=10时不满足循环条件退出。完整输出为1-4-7-。
第5题
执行如下 C++ 代码,将从小到大依次输出 abs(N) 个整数,并在最后输出 1 。
int N;
cin >> N;
int start_num = 1, end_num = N + 1, i;
if (N < 0)
start_num = N, end_num = 0;
for (i = start_num; i < end_num; i++)
cout << i << " ";
cout << endl << ((i - 1) == abs(N)) << endl;
A. 正确
B. 错误
【答案】:B
【解析】
当N为正数时,如N=5,输出1 2 3 4 5共5个数(等于abs(5)=5),循环结束后i=6,i-1=5=abs(5),最后输出1。但当N为负数时,如N=-3,start_num=-3,end_num=0,输出-3 -2 -1共3个数(等于abs(-3)=3),循环结束后i=0,i-1=-1,-1 == abs(-3) 即 -1 == 3 为假,最后输出0而非1。因此题目说"最后输出1"在N为负数时不成立。
第6题
如下 C++ 代码执行后,输出值为 9 。
int cnt = 0, i;
for (i = 0; i < 10; i++) {
for (int j = 0; j < i; j++)
cnt += 1;
break;
}
cout << i;
A. 正确
B. 错误
【答案】:B
【解析】
外层循环第一次执行时i=0,内层循环j < 0 不执行,cnt 保持0。随后执行 break 跳出外层循环,此时 i 仍为0。输出 i 的值为0,而非9。break 直接跳出外层循环,循环只执行了一次。
第7题
如下 C++ 代码执行时如输入 10 ,输出将是 100 。
int cnt = 0, N;
cout << "请输入正整数:";
cin >> N;
for (int i = 0; i < N; i++)
for (int j = -i; j < i; j++)
cnt += 1;
cout << cnt;
A. 正确
B. 错误
【答案】:B
【解析】
输入N=10时,外层循环i从0到9。内层循环j 从 -i 到 i-1,执行次数为 i-(-i) == 2i 次。i=0时执行0次,i=1时执行2次,i=2时执行4次,...,i=9时执行18次。总次数为0+2+4+...+18=2×(1+2+...+9)=2×45=90。输出90而非100。
第8题
如下 C++ 代码执行其输出是 3 。
int count = 0;
int i = 0;
while (i < 3) {
int j = 0;
while (j < 3) {
if (i + j >= 3)
count += 1;
j += 1;
}
i += 1;
}
cout << count;
A. 正确
B. 错误
【答案】:A
【解析】
外层循环 i 取0、1、2,内层循环 j 取0、1、2。统计 i+j >=3 的组合数:i=0时无满足的j;i=1时j=2满足(1+2=3),1个;i=2时j=1(2+1=3)和j=2(2+2=4)满足,2个。总共0+1+2=3。输出3。
第9题
如下 C++ 代码执行时如果输入正整数,其输出将是输入的正整数。
int N;
cin >> N;
int i = 0, Nbase = 1;
int rst = 0;
while (N != 0) {
rst = rst + N % 10 * Nbase;
N /= 10, Nbase *= 10;
i += 1;
}
cout << rst;
A. 正确
B. 错误
【答案】:A
【解析】
代码逐位提取N的各位数字并按原位置重建:每次取出N的个位(N % 10),乘以当前位权Nbase(依次为1、10、100...),累加到 rst 中,然后N去掉个位(N /= 10),位权进位(Nbase *= 10)。这个过程实际上是将 N 的各位数字重新拼接为原数。例如输入123:第一次取3×1=3,第二次取2×10=20,第三次取1×100=100,rst=123。对于任意正整数,输出就是输入本身。
第10题
如下 C++ 代码执行时如输入 5 ,将输出代码后的字符图形。
int n;
cin >> n;
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < n - i + 1; j++)
cout << 0;
for (int k = 1; k < 2 * i; k++) {
if (k <= i)
cout << k;
else
cout << 2 * i - k;
}
for (int j = 1; j < n - i + 1; j++)
cout << 0;
cout << endl;
}
000010000
000121000
001232100
012343210
123454321
A. 正确
B. 错误
【答案】:A
【解析】
输入5时,外层循环i从1到5。每行由三部分组成:前导0(n-i 个)、中间数字金字塔、后缀0(n-i 个)。中间部分k从1到2i-1,当k<=i 时输出k(递增),当k>i 时输出2i-k (递减),形成1、121、12321、1234321、123454321的金字塔形。i=1时前导4个0,中间1,后缀4个0,即000010000。i=5时无前后0,输出1234543211。
浙公网安备 33010602011771号