GESP 2025年03月认证 C++ 2级真题

1 单选题(每题 2 分,共 30 分)

题号123456789101112131415
答案DCAADADACBCDBCC

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

  • A. 《哪吒2》是一款新型操作系统
  • B. DeepSeek是深海钻探软件
  • C. 《哪吒2》可以生成新的软件
  • D. DeepSeek可以根据《哪吒2》的场景生成剧情脚本

知识点解析

本题考查对人工智能与媒体产品的理解, 以及热点时事的了解。DeepSeek 是人工智能系统,具备生成剧情脚本的能力;《哪吒2》是电影,属于文化产品,无法生成软件。选项 D 正确。


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

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

知识点解析: 流程图中的输出操作应放在平行四边形框中,表示输入/输出操作。菱形框用于条件判断,圆形/椭圆形框用于开始/结束。选项 C 正确。


第 3 题 下面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 == bb == a 是逻辑判断,未修改 ab 的值,因此输出 3 4。知识点:逻辑运算符无副作用


第 4 题 求三色彩球的颜色。有数量无限的红(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

知识点解析: 每组彩球周期为 10(5红 + 3绿 + 2蓝),正确逻辑应为 N % 10 计算余数。选项 D 正确,原代码错误使用 N % 10,需改为 N / 10


第 5 题 下面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

知识点解析: 循环中 i % 3 为真时累加 1,否则累加 2。

  • i % 3 != 0i:1, 2, 4, 5, 7, 8 → 6 次 → 累加 6
  • i % 3 == 0i:0, 3, 6, 9 → 4 次 → 累加 8 总和为 6 + 8 = 14。选项 D 正确。

第 6 题 下面C++代码执行后输出是( )。

int i;
for (i = 10; i > 0; i -= 2)
    break;
cout << i;
  • A. 10
  • B. 8
  • C. 0
  • D. 因为循环执行时会执行break语句而终止循环,所以的值不确定

知识点解析break 立即终止循环,i 保持初始值 10。知识点:循环的提前终止


第 7 题 下面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#1#
  • C. 0#0#0#0#1#
  • D. 0#0#0#0#0#1#

知识点解析i % 3 == 0 时跳过输出,符合条件的 i 为3、6、9,其它值 1, 2, 4, 5, 7, 8 → 6 次输出 0#。循环结束后 i = 10,额外输出 1#。最终输出 0#0#0#0#0#0#1#。选项 D 正确。


第 8 题 下面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

知识点解析: 外层循环 i 从 0 到 4,内层循环 ji 递减到 1。具体执行过程:

  • i=0:无输出
  • i=1:输出 1-
  • i=2:输出 2-1-
  • i=3:输出 3-2-1-
  • i=4:输出 4-3-2-1- 最终输出 1-2-1-3-2-1-4-3-2-1-。选项 A 正确。

第 9 题 下面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))

知识点解析: 题目要求“能被 2 整除且除以 7 余 2”。选项 C 的条件是“能被 2 整除且能被 7 整除”,与题意矛盾。


第 10 题 下面C++代码用于求1到N之间正整数中含有3的数的个数,比如123和32都是符合条件的数。则前后两处横线应填入代码分别是( )。

int i,j;
int cnt = 0, N;
cout << "请输入正整数N: ";
cin >> N;
for (i = 1; (j=1) < 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

知识点解析: 代码需遍历每个数字的每一位,若某位为 3 则计数。空白处应为 break 终止当前数字的检查,并执行 j /= 10 处理下一位。选项 B 正确。


第 11 题 在数学中N表示N的阶乘,即1到N的乘积,如3! = 123,且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. 虽然实现2的代码短小,但效率并不高
  • B. 实现1的代码效率更高,且更易于理解
  • C. 实现1因为应用了前项计算结果,计算量更小,因此效率高
  • D. 两种实现,效率几乎一致

知识点解析: 实现 1 通过累积计算阶乘(如 3! = 2! * 3),时间复杂度为 O(N);实现 2 每次重新计算阶乘,时间复杂度为 O(N²)。选项 C 正确。


第 12 题 哥德巴赫猜想是指大于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. 即使将外层循环中的上界1000修改为很大的整数,也不能说从数学上证明了哥德巴赫猜想
  • D. 根据题意,break语句应该移到if语句块之外

知识点解析break 应放在 if 语句内,找到第一对质数后跳出内层循环。若移到外部,会导致无法验证其他可能的质数对。选项 D 错误。


第 13 题 已知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");
}

期望输出

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执行效果相同

知识点解析last += 1last = last + 1 效果相同。选项 B 正确。其他选项中,printf("\n") 可以输出换行,无需修改为 cout


第 14 题 在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

知识点解析rand() % 10 + 1 生成 1~10 的随机数。选项 C 正确。


第 15 题 在C++中,如果ab均为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)

知识点解析: 浮点数相等需用绝对值差判断,abs(b - a) <= 0.000001。选项 C 正确。


2 判断题(每题 2 分,共 20 分)

题号12345678910
答案××

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

知识点解析: 高级语言需通过编译器或解释器转换为机器指令执行。C++需要编译型语言,Python是解释型语言,各位要了解并区分。

第 2 题 在C++代码中,假设N为正整数,则N - N / 10 * 10N % 10都将获得N的个位数。( )

知识点解析N - N/10*10 等价于 N % 10,均为取个位数。

第 3 题 C++语句 cout << ((10 <= N <= 12)? "true":"false") 中,假设整型变量N为12,则其输出为 true。原因是执行 10 <= N 后其值为 truetrue 与12相比仍然是 true。( )

知识点解析: C++ 不支持链式比较 10 <= N <= 12,实际会先计算 10 <= N(结果为 0 或 1),再与 12 比较。

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

知识点解析: 浮点数运算存在精度误差,sqrt(N)*sqrt(N) 可能与原值有微小差异。

第 5 题 下面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=3, b=2,输出 3*2=6

第 6 题 下面C++代码执行后将输出10。( )

int i;
for (i = 0; i < 10; i++)
    continue;
cout << i << endl;

知识点解析: 循环结束后 i=10,输出 10。

第 7 题 下面C++代码执行后将输出1。( )

int i;
for (i = 1; i < 10; i++) {
    break;
    continue;
}
cout << i << endl;

知识点解析break 使循环立即终止,i 保持初始值 1。

第 8 题 下面的C++代码执行后将输出10行”OK”。( )

for (int i = 0; i < 5; i++)
    for(int j = 0; j < i; j++)
        printf("OK\n");

知识点解析: 总循环次数为 0+1+2+3+4=10 次,但 j < ii=0 时不执行,实际输出 10 行。

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

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

知识点解析i=1 时累加 1+2+3+4=10;i=0 时累加 0+1+2+3+4=10,输出相同。

第 10 题 下面C++代码执行后将输出 0123。( )

for (i = 0; i < 5; i++)
    for (i = 0; i < i; i++)
        continue;
printf("%d\n", i);

知识点解析: 内层循环变量错误使用 i,导致外层循环仅执行一次,最终输出 5。


3 编程题(每题25分,共50分)

3.1 编程题1

  • 时间限制: 1.0 s
  • 内存限制: 512.0 MB

3.1.1 等差矩阵

3.1.2 题目描述

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

3.1.3 输入格式

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

3.1.4 输出格式

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

3.1.5 样例

输入样例1

3 4

输出样例1

1 2 3 4
2 4 6 8
3 6 9 12

3.1.6 数据范围

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

3.1.7 参考程序

#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;
}

知识点解析: 矩阵元素为行号与列号的乘积,每行和每列均为等差数列。直接遍历行列输出即可。

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) 
            cout << i * j << " \n"[j == m];
    }
    return 0;
}

3.2 编程题2

  • 试题名称: 时间跨越
  • 时间限制: 1.0 s
  • 内存限制: 512.0 MB

3.2.8 题目描述

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

3.2.9 输入格式

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

3.2.10 输出格式

输出四个正整数,代表 ( y’, m’, d’, h’ )。

3.2.11 样例

输入样例

2008
2
28
23
1

输出样例

2008 2

知识点解析: 处理时间进位需注意:

  1. 小时进位到日;
  2. 日进位时考虑月份天数(注意闰年);
  3. 月进位到年。
#include <iostream>
using namespace std;

bool isLeap(int y) {
    return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}

int getDays(int y, int m) {
    if (m == 2) return isLeap(y) ? 29 : 28;
    if (m == 4 || m == 6 || m == 9 || m == 11) return 30;
    return 31;
}

int main() {
    int y, m, d, h, k;
    cin >> y >> m >> d >> h >> k;
    h += k;
    d += h / 24;
    h %= 24;
    while (d > getDays(y, m)) {
        d -= getDays(y, m);
        m++;
        if (m > 12) {
            m = 1;
            y++;
        }
    }
    cout << y << " " << m << " " << d << " " << h;
    return 0;
}