2025年09月 GESP等级认证C++编程(一级)试题解析
【单选题】
1、(2分)人工智能现在非常火,小杨就想多了解一下,其中就经常听人提到“大模型”。那么请问这里说的“大模型”最贴切是指?( )
A、大电脑模型 B、大规模智能 C、智能的单位 D、大语言模型
正确答案:D
试题解析:大电脑模型,一般没有此说法;
大规模智能,范围太宽泛,表述模糊;
智能的单位,和题意不符;
目前提到的“大模型”就是指 大语言模型,比如 GPT 系列、ChatGPT 等。
因此最贴切的答案是D:大语言模型。
2、(2分)小杨这学期刚开学就选修了一门编程课,然后就想编写程序来计算1到10001之间的所有偶数的和。
他希望程序采用简单累加整数的方法,同时希望源程序尽可能清晰、简洁,则下面关于实现累加时采用的主要控制结构的哪个说法最不合适?( )
A、使用循环结构 B、使用循环和分支的组合 C、仅使用顺序结构 D、不使用分支结构
正确答案:C
试题解析:循环从 1 到 10001,判断每个数是否为偶数,然后累加。选项A、B均可以实现。
不使用分支结构也可以做到,比如循环步长为 2,选项D可以实现。
顺序结构没有循环和分支,如果不用循环,逐个累加10000次,这显然不现实。
3、(2分)下面的C++代码用于输入姓名,然后输出姓名,正确的说法是?( )
string XingMing; cout << "请输入您的姓名:"; cin >> XingMing; cout << XingMing;A、XingMing 是汉语拼音,不能作为变量名称 B、可以将 XingMing 改为 Xing Ming
C、可以将 XingMing 改为 xingming D、可以将 XingMing 改为 Xing-Ming
正确答案:C
试题解析:变量名只能包括英文半角字母和数字,并且不能以数字开头;
XingMing是符合变量的定义规则,选项A错误;
变量名不能包括空格,选项B错误;
变量名中不能包括-符号,选项D错误;
本题答案为选项C。
4、(2分)下列C++ 代码中a和b都是整型变量,执行后,其结果是?( )
a = 13; b = 5; cout << a / b << a % // b << a % b; a * b;A、2 3 B、23 C、20 D、以上都不准确
正确答案:C
试题解析:C++中,一行中//后面的部分为注释内容,可以忽略,因此输出语句相当于:
cout << a / b << a % a * b;
计算 a / b是整数除法,结果舍弃小数为整数2;
先计算a % a结果为0,再计算,0*b=0,因此输出0;
故执行结果为:20。
5、(2分)C++表达式 3 * 4 % 5 / 6 的值是?( )
A、10 B、5 C、2 D、0
正确答案:D
试题解析:根据优先级,先计算3*4=12,再计算12%5=2,最后计算:2/6,整数除法,结果为0。
6、(2分)下面的C++代码中变量 N 和 M 都是整型,则执行时如果先输入 10 并输入一个制表符后输入 20 并回车,其输出的数值是?( )
scanf("%d", &N); scanf("%d", &M); printf("{%d}",N+M);A、{30} B、1020 C、{N+M} D、不输出,继续等待输入
正确答案:A
试题解析:scanf() 读取整数,遇到空白字符(包括空格、制表符、回车),会停止读取;
所以scanf("%d", &N);读取整数10,遇到制表符,读取N的值为10;
scanf("%d", &M);读取整数20,遇到回车,读取M的值为20;
所以N+M的值为30,按照printf()输出格式为:{30}。
7、(2分)当前是9月,编写C++代码求 N 个月后的月份。横线处应填入的代码是?( )
int N, M; cin >> N; M = _____________; if (M == 0) printf("%d个月后12月", N); else printf("%d个月后是%d月", N, M);A、N % 12 B、9 + N % 12 C、(9 + N) / 12 D、(9 + N) % 12
正确答案:D
试题解析:当前是 9 月,经过 N 个月后,月份应该是 (9 + N) % 12,结果范围是0-11,但月份是 1~12,所以这里的0代表12月。
本题答案为选项D。
8、(2分)下面C++代码执行后的输出是?( )
int n = 0; for (int i = 0; i < 100; i++) n += i % 2; cout << n;A、5050 B、4950 C、50 D、49
正确答案:C
试题解析:循环i的值为0到99,如果i为偶数,i%2为0,n += i%2 相当于没加;
如果i为奇数,i%2为1,n的值加1,0到99有50个奇数,所以n最终为50。
9、(2分)下面的C++代码执行后输出是?( )
int N = 0, i; for (i = -100; i < 100; i++) N += i % 10; cout << N;A、900 B、100 C、0 D、-100
正确答案:C
试题解析:循环中i从-100到99,其中i是10的倍数时候,i%10为0,不会改变 N 的值;
所以N 的值为:-9、-8、……、-1,……,1、2、……、9,这些数相加,所有正数和负数刚好抵消,结果为0。
10、(2分)下面C++代码执行后输出是?( )
int i; for(i = 1; i < 5; i++) { if(i % 3 == 0) break; printf("%d#", i); } if(i > 5) printf("END\n");A、1#2# B、1#2#END C、1#2 D、1#2#3#4#END
正确答案:A
试题解析:循环中,i从1开始,当i为1、2时候输出1#2#,当i为3时候,满足i%3==0的条件,循环终止,所以i最终为3,不满足i>5的条件,不会输出:END。
11、(2分)下面的C++代码用于求 N 的镜面数(N 的个位到最高位的各位数字依次反过来出现在数字中,但高位 0 将被忽略,不输出),如输入1234,则将输出 4321 ,又如输入120,则将输出 21 ,错误的选项是?( )
cout << "请输入个位数不为0的正整数:"; cin >> N; rst = 0; // 保存逆序结果 while (______________) { rst = rst * 10 + N % 10; N = N / 10; } cout << rst << endl;A、N != 0 B、not (N == 0) C、N = 0 D、N > 0
正确答案:C
试题解析:程序是求 N 的逆序数,循环需要取出N的各位数字。
选项 A和B,都是 N 不为 0,选项D,N 〉0,循环条件都可以逐位取出;
选项C是赋值语句,循环条件始终为假,循环不执行,故C错误。
12、(2分)下面C++代码用于交换两个正整数 a 和 b 的值,不能实现交换的代码是?( )
A、
cout << "输入第一个正整数: "; cin >> a; cout <<"输入第二个正整数: "; cin >> b; temp = a; a = b; b = temp; cout << "a=" << a << " b=" << b << endl;B、
cout << "输入第一个正整数: "; cin >> a; cout <<"输入第二个正整数: "; cin >> b; b = a - b; a = a - b; b = a + b; cout << "a=" << a << " b=" << b << endl;
C、
cout << "输入第一个正整数: "; cin >> a; cout <<"输入第二个正整数: "; cin >> b; a = a + b; b = a - b; a = a - b; cout << "a=" << a << " b=" << b << endl;D、
cout << "输入第一个正整数: "; cin >> a; cout <<"输入第二个正整数: "; cin >> b; a, b = b, a; cout << "a=" << a << " b=" << b << endl;正确答案:D
试题解析:C++不支持使用a, b = b, a;的形式进行交换,实际上 a, b = b, a 被解析为三条语句:
(a), (b = b), (a),即a、b值无变化。
本题答案为选项D。
13、(2分)下面C++代码用于获得正整数 N 的第 M 位数,约定个位数为第1位,如 N 等于1234,M 等于2,则输出3。
假设 M 的值是大于等于1且小于等于 N 的位数。横线处应填入的代码是?( )
int N, M, div=1; cout << "请输入一个正整数:"; cin >> N; cout <<"请输入从右到左取第几位数:"; cin >> M; for (int i =0; i < (M - 1); i++) div *= 10; cout << (______________);A、N % div / 10 B、N / div / 10 C、N % div % 10 D、N / div % 10
正确答案:D
试题解析:要获取 N 的第 M 位(从右到左),先将 N 除以 (M-1)次 10,去掉右边的 M-1位,再对 10 取余,得到当前的最后一位,即第 M 位。
程序先计算div为 M - 1 个10相乘,所以横线处应为:N / div % 10。
14、(2分)下面C++代码执行后输出是?( )
num = 0; while (num <= 5) { num += 1; if (num == 3) continue; printf("%d#", num); }A、1#2#4#5#6# B、1#2#4#5#6 C、1#2#3#4#5#6# D、1#2#3#4#5#6
正确答案:A
试题解析:第1次循环,num加1后为1,输出1#;
第2次循环,num加1后为2,输出2#;
第3次循环,num加1后为3,执行continue;
第4次循环,num加1后为4,输出4#;
第5次循环,num加1后为5,输出5#;
第6次循环,num加1后为6,输出6#;
此时不满足num<=5条件,循环结束。
本题答案为选项A。
15、(2分)下面C++代码用于记录多个输入数中的最大数和最小数(输入 -999 则输入结束),相关说法【错误】的是?( )
cin >> now_num; min_num = max_num = now_num; while (now_num != -999) { if (max_num < now_num) max_num = now_num; if (min_num > now_num) min_num = now_num; cin >> now_num; } cout << min_num << ' ' << max_num;A、程序运行时如果第一个数输入 -999 ,则输出将是 -999 -999
B、程序输入过程中,如果输入的第一个数不是 -999 ,则如果待输入的数据中没有 -999 ,则程序能求出已输入整数中的最大数和最小数
C、如果用于输入考试成绩,即成绩中不可能有 -999 ,则程序能求出已输入成绩中的最高成绩和最低成绩
D、可以将第一个 cin >> now_num; 移动到 while (now_num != -999) { 下面,结果不变
正确答案:D
试题解析:选项A,若第一个数输入 -999,循环不执行,直接输出:-999 -999,正确;
选项
B,若第一个数不是 -999,如果输入中无 -999,程序循环不会结束,可以计算已输入数的最大最小数,正确;
选项C,考试成绩无-999,程序能正常读取所有成绩并求最值,正确;
选项D,若将第一个 cin >〉 now_num; 移到循环内,进入循环前 now_num 值不确定,可能导致错误。
【判断题】
16、(2分)在集成开发环境里调试程序时,要注意不能修改源程序,因为如果修改,就要终止调试、关闭该文件并重新打开,才能再次开始调试。( )
正确答案:错误
试题解析:多数集成开发环境如 VS 等,调试时修改源程序,无需关闭文件,保存后重新编译即可继续调试。
17、(2分)执行C++表达式 10 % 0.5 将报错,因为 0.5 所在位置只能是整数。( )
正确答案:正确
试题解析:C++ 中 % 运算符要求操作数必须是整数,0.5 是浮点数,使用 10 % 0.5 会报错。
18、(2分)下面C++代码执行后将输出 9 。( )
for (i = 0; i < 10; i++) break; cout << i;正确答案:错误
试题解析:循环中 i 初始为 0,第一次进入循环就执行 break,循环结束,此时输出 i 的值为 0 而非 9。
19、(2分)下面C++代码执行后将输出 55 。( )
n = 0; for (int i = 0; i > -10; i--) n = n + i * -1; cout << n;正确答案:错误
试题解析:i的初始为0,循环执行的条件是 i>-10,i值每次减少1,所以i的值为:0、-1、-2、……、-9;
循环体内把i的值乘以-1后累计到n中,即累计:0、1、2、……、9,结果为45。
20、(2分)将下面C++代码中的 L1 行的 i = 0 修改为 i = 1 , 其输出与当前代码输出相同。( )
cnt = 0; for (int i = 0; i < 100; i++) // L1 cnt += i; cout << cnt正确答案:正确
试题解析:程序是求1到100的和,修改为 i = 1,少累加一个0,结果不变。
21、(2分)将下面C++代码中的 i < 10 修改为 i <= 10 ,其执行后输出相同。( )
int n, i; n = i = 0; while (i < 10) { n += i; i += 1; } cout << n;正确答案:错误
试题解析:while循环中i每次加1,修改为i<=10后,循环将多执行一次,会多累加一次i,执行结果会改变。
22、(2分)下面的C++代码执行后将输出 45 。( )
int n, i; n = i = 0; while (i < 10){ i += 1; n += i; } cout << n;正确答案:错误
试题解析:n和i初值为0,循环条件是i<10;
循环中,每次i的值先加1,然后累加到n中,最后一次循环,i为9(满足i<10),i加1后为10,然后将10累计到n,所以n的值是:1+2+……+10,结果应该是55。
23、(2分)执行C++代码 cout << (12 + 12.12) 将报错,因为 12 是 int 类型,而 12.12 是 float 类型,不同类型不能直接运算。( )
正确答案:错误
试题解析:在 C++ 中,当 int 类型和 double 类型进行算术运算时,会进行隐式类型转换(整型提升为浮点型),然后进行计算,结果类型为 double,cout << (12 + 12.12) 会输出 24.12,不会报错。
24、(2分)下面C++代码执行时将导致无限循环(也称死循环)。( )
while (count < 5) { count += 1; if (count == 3) continue; cout << count << ' '; }正确答案:错误
试题解析:while的循环条件是count<5,循环体内count值每次加1,虽然count的初值没有给出,但无论count是<5或者>=5,始终会达到<5的条件不成立的时候,此时循环会结束,不会形成死循环。
25、(2分)下列C++代码用于求斐波那契数列,即第1个数为0,第2个数为1,从第三个数开始,依次是其前两个数之和。如果输入的值为大于 1 的正整数,该代码能实现所求。( )
cin >> n; a = 0, b = 1; for (int j = 0; j < n; j++) { cout << a << " "; b = b + a; a = b - a; }正确答案:正确
试题解析:代码中 a 初始为 0(第 1 个数) ,b 为 1(第 2 个数)。
循环 n 次,每次输出 a 后,通过计算更新 a 和 b,依次得到 0、1、1、2、3… 符合斐波那契数列规律,输入大于 1 的正整数时可正确输出。
【编程题】
26、(25分)商店折扣
时间限制:1 s,内存限制:512 MB
【问题描述】
商店正在开展促销活动,给出了两种方案的折扣优惠。第一种方案是购物满 x 元减 y 元;第二种方案是直接打 n 折,也就是说价格变为原先的 n / 10。这里的 x、y、n 均是正整数,并且 1 <= y < x,1<= n <10 。
需要注意的是,第一种方案中满减优惠只能使用一次。例如购物满 10 元减 3 元时,若挑选了价格总和为 33 元的物品,只能减免 3 元,需要支付 30 元。
小明在商店挑选了价格总和为 p 元的物品,结账时只能使用一种优惠方案。小明最少需要支付多少钱呢?
【输入描述】
四行,四个正整数 x、y、n、p,含义见题目描述。
【输出描述】
一行,一个小数,表示小明最少需要支付多少钱,保留两位小数。
【样例输入1】
8
7
9
10
【样例输出1】
3.00
【样例输入2】
8
7
2
11
【样例输出2】
2.20
【数据范围】
对于所有测试点,保证 1 <= y < x,1<= n <10,1 <= p < 100。
【参考程序】
#include <iostream> using namespace std; int x, y, n, p; float a1, a2; int main() { cin >> x >> y >> n >> p; a1 = p; if (a1 >= x) a1 -= y; a2 = p * n / 10.0; printf("%.2f\n", min(a1, a2)); return 0; }27、(25分)金字塔
时间限制:1 s,内存限制:512 MB
金字塔由 n 层石块垒成。从塔底向上,每层依次需要 n×n、(n-1)× (n-1)、……、2× 2、1× 1 块石块。请问搭建金字塔总共需要多少块石块?
【输入描述】
一行,一个正整数 n,表示金字塔的层数。
【输出描述】
一行,一个正整数,表示搭建金字塔所需的石块数量。
【样例输入1】
2
【样例输出1】
5
【样例输入2】
5
【样例输出2】
55
【数据范围】
对于所有测试点,保证 1 <= n <= 50 。
【参考程序】
#include <iostream> using namespace std; int n, ans; int main() { cin >> n; for (int i = 1; i <= n; i++) ans += i * i; cout << ans << endl; return 0; }