A. 全国信息素养大赛初中组C++算法应用主题赛初赛模拟试卷02

    客观题

全国信息素养大赛初中组C++算法应用主题赛初赛模拟试卷02

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

一、单项选择题(每题 5 分,共 50 分)

第 1 题

在 C++ 中,表达式 (7 / 2 * 2 == 7) 的值是( )。

{{ select(1) }}

  • true(或 1)
  • false(或 0)
  • 编译错误
  • 结果不确定

第 2 题

"丝路历法"程序中,需要根据年份判断闰年。阅读以下代码,若 year = 1900,输出结果是( )。

int year = 1900;
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)
    cout << "闰年" << endl;
else
    cout << "平年" << endl;

{{ select(2) }}

  • 闰年
  • 平年
  • 编译错误
  • 无法确定

第 3 题

"丝路商队"行军计划中,第 1 天行军 10 里,之后每天比前一天多行军 5 里。以下代码使用递推思想计算前 6 天共行军多少里,输出结果是( )。

int total = 0, step = 10;
for (int i = 1; i <= 6; i++) {
    total += step;
    step += 5;
}
cout << total;

{{ select(3) }}

  • 120
  • 135
  • 150
  • 165

第 4 题

"锦绣中华"地砖铺设中,需要在 5 行 5 列的方格地面中标记两条对角线上所有的方格。以下代码统计两条对角线共有多少个方格被标记(中心交叉方格不重复计数),输出结果是( )。

int cnt = 0;
for (int i = 1; i <= 5; i++) {
    for (int j = 1; j <= 5; j++) {
        if (i == j || i + j == 6) cnt++;
    }
}
cout << cnt;

{{ select(4) }}

  • 5
  • 8
  • 9
  • 10

第 5 题

"算盘珠算"模拟中,需逐位处理一个整数:偶数值直接累加,奇数值加倍后再累加。执行以下代码,输出结果是( )。

int n = 3456, s = 0;
while (n > 0) {
    int d = n % 10;
    if (d % 2 == 0) s += d;
    else s += d * 2;
    n /= 10;
}
cout << s;

{{ select(5) }}

  • 22
  • 24
  • 26
  • 28

第 6 题

"丝路驿站"物资配送中,使用前缀和技术快速计算任意区间内驿站间距之和。数组 d[6] = {5, 8, 15, 7, 12, 9} 存储了 6 段相邻驿站间的距离。以下代码先构建前缀和数组 prepre[i] 表示前 i 段距离之和),再输出 pre[4] - pre[1](即第 2 段到第 4 段的总距离),结果是( )。

int d[6] = {5, 8, 15, 7, 12, 9};
int pre[7] = {0};
for (int i = 0; i < 6; i++) {
    pre[i + 1] = pre[i] + d[i];
}
cout << pre[4] - pre[1];

{{ select(6) }}

  • 20
  • 30
  • 35
  • 42

第 7 题

"敦煌遗书"数字化项目中,需要在一段文字中统计相邻两字符为 "ab" 的出现次数。执行以下代码,输出结果是( )。

string text = "ababcabcab";
int cnt = 0;
for (int i = 0; i <= text.length() - 2; i++) {
    if (text.substr(i, 2) == "ab") cnt++;
}
cout << cnt;

{{ select(7) }}

  • 3
  • 4
  • 5
  • 6

第 8 题

"汉诺塔"传说中,僧侣将 N 层金盘从一根柱子移至另一根。以下递归函数计算所需最少步数:

int f(int n) {
    if (n == 1) return 1;
    return 2 * f(n - 1) + 1;
}

执行 cout << f(5) - f(4); 的输出是( )。

{{ select(8) }}

  • 8
  • 15
  • 16
  • 31

第 9 题

"勾股弦方"是中国古代数学的重要成就。以下代码使用枚举算法统计三边均为正整数且均不超过 20 的勾股数组 (a, b, c) 的个数,其中 a < b < c 且 a² + b² = c²。输出结果是( )。

int cnt = 0;
for (int a = 1; a <= 18; a++)
    for (int b = a + 1; b <= 19; b++)
        for (int c = b + 1; c <= 20; c++)
            if (a * a + b * b == c * c)
                cnt++;
cout << cnt;

{{ select(9) }}

  • 4
  • 5
  • 6
  • 8

第 10 题

"非遗工坊"管理系统记录了各工坊的存货数据:

struct Item {
    string name;
    int price;
    int qty;
};
Item goods[4] = {
    {"丝绸", 20, 5},
    {"茶叶", 15, 8},
    {"瓷器", 30, 3},
    {"香料", 25, 4}
};

以下代码使用冒泡排序按"库存价值(price × qty)"从大到小排序。排序后数组第一个元素(索引 0)的 name 是( )。

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3 - i; j++) {
        if (goods[j].price * goods[j].qty < goods[j + 1].price * goods[j + 1].qty) {
            Item tmp = goods[j];
            goods[j] = goods[j + 1];
            goods[j + 1] = tmp;
        }
    }
}

{{ select(10) }}

  • 丝绸
  • 茶叶
  • 瓷器
  • 香料

二、多项选择题(每题 5 分,共 25 分)

注意:多选题输入,请按照顺序填入,不需要用空格隔开,如有ACD三个选项,则填入ACD即可!

第 11 题

以下关于 C++ 变量和运算的说法,正确的有( )。

A. int a = 3.99; 执行后,变量 a 的值为 3
B. char 类型变量占用 1 个字节,只能存储一个字符
C. double 类型属于浮点类型,可以存储带小数的数值
D. 取模运算符 % 的两个操作数必须都是整型

{{ input(11) }}

第 12 题

"丝路驿站"路线图中,二维数组 dist[3][3] 存储了 3 个城市之间的里程。阅读以下代码,说法正确的有( )。

int dist[3][3] = {{0, 15, 8}, {15, 0, 12}, {8, 12, 0}};
int total = 0, mx = dist[0][0];
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        total += dist[i][j];
        if (dist[i][j] > mx) mx = dist[i][j];
    }
}

A. 变量 total 的最终值为 70
B. 变量 mx 的最终值为 15
C. 该数组表示的是无向图的邻接矩阵(对称矩阵)
D. 对角线元素 dist[i][i] 均为 0,表示城市到自身距离为 0

{{ input(12) }}

第 13 题

执行以下代码,关于输出结果的描述,正确的有( )。

for (int i = 10; i <= 50; i += 10) {
    if (i % 20 == 0)
        cout << "A";
    else if (i % 30 == 0)
        cout << "B";
    else
        cout << "C";
}

A. 输出结果中包含字符 'A'
B. 输出结果中包含字符 'B'
C. 输出结果中包含字符 'C'
D. 输出的字符总数为 4 个

{{ input(13) }}

第 14 题

"红色密码"破译中,需要选择合适的算法和数据结构。以下说法正确的有( )。

A. 二分查找算法要求被查找的数据必须事先排好序
B. 栈(stack)的特点是"先进后出"(FILO)
C. 队列(queue)通常用于实现广度优先搜索(BFS)
D. 前缀和(Prefix Sum)技术可以在 O(1) 时间内求出任意区间的元素之和

{{ input(14) }}

第 15 题

"非遗技艺"模拟程序中定义了如下函数。关于该函数,以下说法正确的有( )。

int mystery(int a, int b) {
    if (b == 0) return a;
    return mystery(b, a % b);
}

A. 该函数使用了递归
B. 调用 mystery(12, 8) 的返回值是 4
C. 该函数的功能是计算 a 和 b 的最大公约数(GCD)
D. 该算法被称为"辗转相除法",时间复杂度为 O(log min(a, b))

{{ input(15) }}


三、判断题(每题 5 分,共 25 分)

第 16 题

在 C++ 中,if 语句的条件表达式必须用圆括号 () 括起来。( )

{{ select(16) }}

  • 正确
  • 错误

第 17 题

执行以下代码,循环结束后变量 i 的值为 10。( )

int i = 0;
while (i < 10) {
    i++;
}

{{ select(17) }}

  • 正确
  • 错误

第 18 题

在 C++ 中定义数组 int arr[5]; 后,访问 arr[5] 会导致数组下标越界,属于未定义行为。( )

{{ select(18) }}

  • 正确
  • 错误

第 19 题

在 C++ 的循环语句中,continue 语句会跳过本次循环体中剩余的代码,直接进入下一次迭代的条件判断;而 break 语句则完全退出当前循环。( )

{{ select(19) }}

  • 正确
  • 错误

第 20 题

"活字印刷"排版检测中,以下代码的输出结果为 3。( )

string s = "Hello2026World";
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
    if (s[i] >= '0' && s[i] <= '9') cnt++;
}
cout << cnt;

{{ select(20) }}

  • 正确
  • 错误