欢迎光临
我们一直在努力

2025年03月 GESP等级认证C++编程(二级)试题解析

【单选题】

1、(2分)2025年春节有两件轰动全球的事件,一个是DeepSeek横空出世,另一个是贺岁片《哪吒2》票房惊人,入了全球票房榜。下面关于DeepSeek与《哪吒2》的描述成立的是?( )

A、《哪吒2》是一款新型操作系统    B、DeepSeek是深海钻探软件    C、《哪吒2》可以生成新的软件    

D、DeepSeek可以根据《哪吒2》的场景生成剧情脚本    

正确答案:D

试题解析:《哪吒2》 是一部电影,并不是操作系统,也不直接生成软件。

DeepSeek 是一个AI模型,可以根据电影场景生成剧情脚本,描述合理。

2、(2分)对整型变量N,如果它能够同时被3和5整除,则输出 N 是含有至少两个质因数 。如果用流程图来描述处理过程,则输出语句应该在哪种图形框中?( )

A、圆形框    B、椭圆形框    C、平行四边形框    D、菱形框    

正确答案:C

试题解析:条件判断(N 是否能被 3 和 5 整除)→ 菱形框。

输出结果(N是含有至少两个质因数)→ 平行四边形框。

3、(2分)下面C++代码执行,其输出是?( )

int a = 3, b = 4;

a == b;

b == a;

cout << a << ' ' << b << endl;

A、3 4    B、3 3    C、4 4    D、4 3    

正确答案:A

试题解析:==表示判断两数是否相等,不会改变变量的值,所以输出结果仍是:3 4。

4、(2分)求三色彩球的颜色。有数量无限的红(Red)绿(Green)蓝(Blue)三种彩球排成一行,每组先为5个红色球,随后3个绿色,最后为2个蓝色。

每个球都有编号,从左到右依次为1,2,3……。输入整数代表编号,求该编号球的颜色。下面是C++代码的实现,正确说法是?( )

int N, remainder;

cin >> N;

remainder = N % 10; // remainder变量保存余数

if((1 <= remainder) && (remainder<= 5))

cout << "Red";

else if ((6 <= remainder) && (remainder <= 8))

cout << "Green";

else if ((remainder == 9) || (remainder == 0))

cout << "Blue";

A、将 else if ((remainder == 9) || (remainder == 0)) 修改为 else 效果相同    

B、将 ((1 <= remainder) && (remainder<= 5)) 修改为 (remainder <= 5) 效果相同    

C、else if ((6 <= remainder) && (remainder <= 8)) 写法错误,应修改为 else if (6 <=remainder <= 8)    

D、根据题意 remainder = N % 10 应修改为 remainder = N / 10    

正确答案:A

试题解析:选项B错误,修改为remainder <= 5后包括了余数为0的情况;

选选C错误,C++中,6 <=remainder <= 8会先执行6 <=remainder,结果为布尔值(0或者1),再执行<=8判断,结果恒为真;

选项D错误,求余数不能改为N/10;

选项A正确,前面已经判断红色和绿色的情况,剩下的就是蓝色的,可以修改为else。

5、(2分)下面C ++ 代码执行后其输出是?( )

int tnt = 0;

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

if (i % 3)

tnt += 1;

else

tnt += 2;

cout << tnt;

A、18    B、17    C、16    D、14    

正确答案:D

试题解析:for循环i值为0到9;

当i除以3的余数不为0时tnt加1,否则tnt加2;

所以结果为:2 + 1 + 1 + 2 + 1 + 1 + 2 + 1 + 1 + 2 = 14。

6、(2分)下面C++代码执行后输出是?( )

int i;

for (i = 10; i > 0; i -= 2)

break;

cout << i;

A、10    B、8    C、0    D、因为循环执行时会执行break语句而终止循环,所以i的值不确定    

正确答案:A

试题解析:for循环中,i初值为10,第一次循环就使用break终止循环,所以i的值为10。

7、(2分)下面C++代码执行后输出是?( )

int i;

for (i =0; i < 10; i++) {

if (i % 3 == 0)

continue;

cout << "0" << "#";

}

if (i >= 10)

cout << "1" << "#";

A、0#0#0#0#0#0#    B、0#0#0#0#0#0#0#1#    C、0#0#0#0#1#    D、0#0#0#0#0#0#1#    

正确答案:D

试题解析:for循环中i从0到9;

如果i是3的倍数,跳过本次循环,否则输出0#;

所以输出0#的i有:1、2、4、5、7、8,共6个0#,即选项D。

8、(2分)下面C++代码执行后的输出是?( )

int i,j;

for (i = 0; i < 5; i++)

for (j = i; j > 0; j -= 1)

printf("%d-", j);

A、1-2-1-3-2-1-4-3-2-1-    B、1-2-1-3-2-1-4-3-2-1    C、0-0-1-0-1-2-0-1-2-3-    D、0-0-1-0-1-2-0-1-2-3    

正确答案:A

试题解析:外循环i从0到4,内循环j从i到1;

当i为0时,内循环执行0次,不输出;

当i为1时,内循环执行1次,输出:1-;

当i为2时,内循环执行2次,输出:2-1-;

当i为3时,内循环执行3次,输出:3-2-1-;

当i为4时,内循环执行3次,输出:4-3-2-1-;

所以本题答案为选项A。

9、(2分)下面C++代码执行后,将输出能被2整除且除以7余数为2的数。下列选项不能实现的是?( )

for (int i = 0; i < 100; i++)

if _______________________

cout << i << " ";

A、((i % 2 == 0) && (i % 7 == 2))    B、((!(i % 2)) && (i % 7 == 2))    C、((!(i % 2)) && (!(i % 7)))    

D、((i % 2 != 1) && (i % 7 == 2))    

正确答案:C

试题解析:选项C的,i%7表示i除以7的余数不为0,再使用!(逻辑非),则表示i%7的余数为0,和题目要求不符。

10、(2分)下面C++代码用于求 1 到 N 之间正整数中含有 3 的数的个数,比如 123 和 32 都是符合条件的数。

则前后两处横线应填入代码分别是?( )

int i, j;

int cnt = 0, N;

cout << "请输入正整数N:";

cin >> N;

for (i = 1; (j=i) < N; i++)

while (j != 0)

if (j % 10 == 3){

cnt +=1;

__________;

}

else

__________;

cout << cnt << " ";

A、continue

j /= 10    

B、break

j /= 10    

C、continue

j %= 10    

D、break

j %= 10    

正确答案:B

试题解析:程序外层for循环遍历1到N之间的整数,内层while 循环对每个整数的每一位进行判断,当j % 10 == 3时,说明某一位是3,进行计数器cnt加1,此时不需要再对其它位进行判断,while循环break。

else的情况则是某一位不是3,需要进行下一位的判断,将j赋为j/10。

11、(2分)在数学中N!表示N的阶乘,即1到N的乘积,如 3!=1*2*3 ,且 0! = 1 。

下面的两段C++代码用于求1到N的阶乘之和,如N为3,则结果是9( 1!+2!+3! 的值)。选项中的说法正确的是?( )

// 实现1

int i,N;

cin >> N;

int tnt = 0, last = 1;

for (i = 1; i < N + 1; i++){

last *= i;

tnt += last;

}

cout << tnt << endl;

// 实现2

int i,N;

cin >> N;

int tnt = 0, tmp;

for (i = 1; i < N + 1; i++){

tmp = 1;

for (int j = 1; j < i + 1; j++)

tmp *= j;

tnt += tmp;

}

cout << tnt << endl;

A、虽然实现1的代码短小,但效率并不高    B、实现2的代码效率更高,且更易于理解    

C、实现1因为应用了前项计算结果,计算量更小,因此效率高    D、两种实现,效率几乎一致    

正确答案:C

试题解析:实现1只进行了一次for循环,使用了前项计算结果,效率更高;

实现2对1到N每个都进行了重复的计算,效率较低。

12、(2分)哥德巴赫猜想是指大于 2 的偶数都可以分解为两个质数之和,下面的代码用于验证 4-1000 之内的偶数能否分解为两个质数之和。

下面C++代码中假设isPrime()是已经定义好用于判断正整数 N 是否为质数, 返回 bool值。对该段代码,【错误】的说法是?( )

for (i = 4; i < 1000; i += 2)

for (j = 2; j < i; j++)

if (isPrime(j) && isPrime(i-j)) {

printf("%d=%d+%d\\n", i, j, i-j);

break;

}

A、将代码 isPrime(j) && isPrime(i-j) 修改为

isPrime(j) == true && isPrime(i-j) == true 效果相同    B、代码执行后,输出的一对质数,一定是小的数在前    

C、即便将外层循环中i的上界1000修改为很大的整数,也不能说从数学上证明了哥德巴赫猜想    

D、根据题意,break语句应该移到if语句块之外    

正确答案:D

试题解析:选项A显然是正确的,只是写法的不同;

选项B也是正确的,内层for循环从2到i,判断满足两个质数之和,输出两个质数,较小的数在前,则循环终止;

选项C正确,哥德巴赫猜想是一个数学猜想,尚未被严格证明或否定;

选项D错误,break移到if语句外面,则内层for循环第一次就会结束,无法正确判断。

13、(2分)已知C++代码和执行后的期望输出如下,相关说法正确的是?( )

int i, j;

int last, N;

cout << "请输入层数N:";

cin >> N;

last = 1;

for (i = 1; i < N; i++) {

for (j = 1; j < i + 1; j++) { // L1

if (last > 9)

last = 1;

cout << last << " ";

last += 1;

}

printf("\\n");

}

请输入层数N:10

1

2 3

4 5 6

7 8 9 1

2 3 4 5 6

7 8 9 1 2 3

4 5 6 7 8 9 1

2 3 4 5 6 7 8 9

1 2 3 4 5 6 7 8 9

A、倒数第二行的 printf("\\n") 有错,应该修改为 cout << endl; ,printf( )函数不能输出换行    

B、last += 1 修改为 last = last + 1 执行效果相同    C、代码中L1标记行中的 j < i + 1 应修改为 j < i    

D、外层for循环前的 last = 1 修改为 last = 0 执行效果相同    

正确答案:B

试题解析:选项A错误,printf("\\n")和cout << endl效果是一样的,都是输出换行;

选项C错误,因为i从1开始,改为j<i,则会少打印一行;

选项D错误,修改为 last = 0,则输出的第一个数是0,和期望结果不符;

本题答案为选项B。

14、(2分)在C++中,( )最适合填入横线处连续 5 次正确生成 1 到 10 之间的随机整数?

for(int i = 0; i < 5; i++)

__________________;

A、rand() % 11    B、rand() % 10    C、rand() % 10 + 1    D、rand() % 9 + 1    

正确答案:C

试题解析:rand() % 10是生成0到9之间的随机数,再加上1则是1到10之间的随机数。

本题答案为选项C。

15、(2分)在C++中,如果 a 和 b 均为 float 类型的变量,那么二者如果相差足够小(比如0.000001),就可以视作相等。

比如 2.2345676 和 2.2345677 就可以视作相等。下列哪个表达式能用来正确判断“a等于b”?( )

A、((b-a) < 0.000001 )    B、((b-a) <= 0.000001 )    C、(abs(b-a) <= 0.000001 )    D、(sqrt(b-a) <= 0.000001 )    

正确答案:C

试题解析:使用计算二者差的绝对值,判断相差是否足够小。即使用abs()函数计算绝对值。

【判断题】

16、(2分)C++、Python都是高级编程语言,它们的每条语句最终都要通过机器指令来完成。( )

正确答案:正确

试题解析:正确,高级语言最终需要通过编译或者解释器将其转换为机器指令,计算机才能执行。

17、(2分)在C++代码中,假设N为正整数,则 N – N / 10 * 10 与 N % 10 都将获得 N 的个位数。( )

正确答案:正确

试题解析:N % 10直接求除以10的余数,可以获得N的个位数;

N/10*10是先进行N/10,直接去掉个位数,再进行乘以10,个位数置0;最后使用N- N / 10 * 10也是可以取得个位数。

18、(2分)C++语句 cout << ((10 <= N <= 12)? "true":"false") 中,假设整型变量N为12,则其输出为true 。

原因是执行 10 <= N 后其值为 true , true 与 12 相比仍然是 true 。( )

正确答案:正确

试题解析:正确,如果判断N>=10并且N<=12,C++不能这样写,(10 <= N <= 12),原因如题目描述。

19、(2分)C++表达式 (sqrt(N) * sqrt(N)) == N 中的 N 如果为正整数,则表达式的值为true,相当于开平方后平方是本身。( )

正确答案:错误

试题解析:表达式 (sqrt(N) * sqrt(N)) == N,通常用于判断N是一个完全平方数,如N=4、9、16等。

如果 N 不是完全平方数,由于浮点数精度问题,结果可能是false。

20、(2分)下面C++执行后将输出 3*2=6 。( )

int a = 2, b = 3;

a = a – b;

b = a + b;

a = b – a;

printf("%d*%d=%d\\n", a, b, a*b);

正确答案:正确

试题解析:初值a = 2, b = 3;

执行a = a – b后a为-1;

执行b = a + b后b为2;

执行a = b – a后a为3;

所以打印结果是3*2=6,本题答案为正确。

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

int i;

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

continue;

cout << i << endl;

正确答案:正确

试题解析:for循环的条件为i<10,执行完成后,i的值为10,本题答案为正确。

22、(2分)下面C++代码执行后将输出1。( )

int i;

for (i = 1; i < 10; i++) {

break;

continue;

}

cout << i << endl;

正确答案:正确

试题解析:for循环中,i初值为1,第一次循环就break了,所以i的值是1。

23、(2分)下面的C++代码执行后将输出 10 行 "OK"。( )

for (int i = 0; i < 5; i++)

for(int j = 0; j < i; j++)

printf("OK\\n");

正确答案:正确

试题解析:外层for循环执行5次,i值为:0、1、2、3、4;

内层for循环,当i为0时,执行0次;

当i为1时,执行1次;

当i为2时,执行2次;

当i为3时,执行3次;

当i为4时,执行4次;

所以共输出10行 OK。

24、(2分)将下面C++代码中的for循环中的 i = 1 调整为 i = 0 的输出结果相同。( )

int tnt = 0;

for (int i = 1; i < 5; i++) // i=1

tnt += i;

cout << tnt;

正确答案:正确

试题解析:正确,对1到5求和,和对0到5求和结果是相同的。

25、(2分)下面C++代码执行后将输出 0123 。( )

for (i = 0; i < 5; i++)

for (i = 0; i < i; i++)

continue;

printf("%d\\n", i);

正确答案:错误

试题解析:外层循环和内层循环不能使用同一个循环变量i,并且内循环的执行条件是i<i,结果是恒为false。

程序输出结果为:00000。

【编程题】

26、(25分)等差矩阵

时间限制:1 s,内存限制:512 MB

【问题描述】

小 A 想构造一个 n 行 m 列的矩阵,使得矩阵的每一行与每一列均是等差数列。小 A 发现,在矩阵的第 i 行第 j 列填入整数 i×j,得到的矩阵能满足要求。你能帮小 A 输出这个矩阵吗?

【输入描述】

一行,两个正整数 n、m。

【输出描述】

共 n 行,每行 m 个由空格分割的整数,表示小 A 需要构造的矩阵。

【样例输入1】

3 4

【样例输出1】

1 2 3 4

2 4 6 8

3 6 9 12

【数据范围】

对于所有测试点,保证 1<=n<=50, 1<=m<=50。

【参考程序】

#include <bits/stdc++.h>

using namespace std;

int n, m;

int main() {

scanf("%d%d", &n, &m);

assert(1 <= n && n <= 50 && 1 <= m && m <= 50);

for (int i = 1; i <= n; i++)

for (int j = 1; j <= m; j++)

printf("%d%c", i * j, " \\n"[j == m]);

return 0;

}

27、(25分)时间跨越

时间限制:1 s,内存限制:512 MB

【问题描述】

假设现在是 y 年 m 月 d 日 h 时而 k 小时后是 y' 年 m' 月 d' 日 h' 时,对于给定的 y、m、d、h、k,小杨想请你帮他计算出对应的 y'、m'、d'、 h' 是多少。

【输入描述】

输入包含五行,每行一个正整数,分别代表 y、m、d、h、k。

【输出描述】

输出四个正整数,代表 y'、m'、d'、 h'。

【样例输入1】

2008

2

28

23

1

【样例输出1】

2008 2 29 0

【数据范围】

对于全部数据,保证有 2000<=y<=3000,1<=m<=12,1<=d<=31,0<=h<=23,1<=k<=24。数据保证为合法时间。

【提示】闰年判断规则

普通闰年:年份能被 4 整除,但不能被 100 整除。

世纪闰年:年份能被 400 整除。

满足以上任意一条规则的年份就是闰年,否则是平年。

【参考程序】

#include <iostream>

using namespace std;

int main() {

int y, m, d, h, k;

cin >> y >> m >> d >> h >> k;

h += k;

if (h >= 24) {

h -= 24;

d += 1;

int days = 0;

if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {

days = 31;

} else if (m == 4 || m == 6 || m == 9 || m == 11) {

days = 30;

} else if (m == 2) {

if ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0)) {

days = 29;

} else {

days = 28;

}

}

if (d > days) {

d -= days;

m += 1;

if (m > 12) {

m = 1;

y += 1;

}

}

}

cout << y << " " << m << " " << d << " " << h << "\\n";

return 0;

}

赞(0)
未经允许不得转载:171主机测评 » 2025年03月 GESP等级认证C++编程(二级)试题解析
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址