#1628. 信息素养大赛——初中组模拟卷 1

信息素养大赛——初中组模拟卷 1

信息素养大赛——初中组模拟卷 1

一、单选题(共20题,每题2分,共40分)

1 执行以下 C++代码后,变量 c 的值是()。

int a = 10, b = 3;
double c = a / b;

{{ select(1) }}

  • 3.33333
  • 3.333
  • 3.0
  • 3

2 下列逻辑表达式中,结果为 true 的是()。

{{ select(2) }}

  • (5 <= 5) && (7 < 5)
  • !(10 > 5)
  • (10 != 10) || (5 >= 3)
  • (5 == 3) && (4 > 2)

3 关于 C++数组,下列说法错误的是()。

{{ select(3) }}

  • 数组的下标通常从0开始
  • int arr[5]; 声明了一个包含5个整数的数组
  • 数组的大小必须在编译时确定,不能使用变量定义大小
  • 可以通过 arr[5] 来访问 int arr[5]; 数组的最后一个元素

4 执行以下代码后,变量sum的值是()

int sum = 0;
for (int i = 1; i <= 5; i += 2) {
    sum += i;
    int sum = 0;
}

{{ select(4) }}

  • 6
  • 9
  • 15
  • 死循环

5 有数组定义:int arr[4] = {1, 2, 3}; 执行 arr[3] = arr[0] + arr[2]; 后,数组arr的内容是()。

int arr[4] = {1,2,3};
arr[3] = arr[0] + arr[2];

{{ select(5) }}

  • {1,2,3,3}
  • {1,2,3,4}
  • {1,2,3,5}
  • {1,2,3,6}

6 以下代码中,count++ 语句执行的次数是()。

int i = 10, count = 0;
while (i > 0) {
    i = 3;
    continue;
    count++;
}

{{ select(6) }}

  • 0
  • 1
  • 无限次
  • 2

7 执行以下嵌套循环后,输出结果是()。

for (int i = 0; i < 3; i++) {
    for (int j = 0; j <= i; j++)
        cout << j;
    cout << "#";
}

{{ select(7) }}

  • 0#01#012#
  • 0#1#2#
  • 1#12#123#
  • 0#01#012#

8 关于变量作用域错误的是:

{{ select(8) }}

  • 在for循环语句中声明的变量,其作用域仅限于该循环体内
  • 在函数内部声明的变量(局部变量),仅在函数内部有效
  • 在所有函数外部声明的变量,在整个程序中都有效
  • 不同函数中的局部变量可以同名,它们代表不同的内存单元

9 给定整数x=120,执行以下代码后,reversed的值是()。

int reversed = 0;
while (x) {
    int digit = x % 10;
    x /= 10;
    reversed = reversed * 10 + digit;
}

{{ select(9) }}

  • 21
  • 12
  • 120
  • 0

10 以下函数用于查找数组中的最大值,横线处应填入()。

int findMax(int arr[], int size) {
    int maxVal = ______;
    for (int i = 1; i < size; i++)
        if (arr[i] > maxVal) maxVal = arr[i];
    return maxVal;
}

{{ select(10) }}

  • 0
  • arr[-1]
  • arr[0]
  • size

11 以下代码中存在几处错误?()

const int SIZE = 5;
int arr[SIZE];
for (int i = 0; i <= SIZE; i++)
    arr[i] = i * 2;
cout << arr[SIZE];

{{ select(11) }}

  • 0处
  • 1处
  • 2处
  • 3处

12 关于C++中string类和字符数组(char[]),下列说法错误的是()。

{{ select(12) }}

  • string对象可以使用 = 进行赋值,而字符数组需要使用 strcpy
  • string对象的长度可以使用 length() 成员函数获取,而字符数组需要使用 strlen()
  • string对象在内存中是动态分配空间的,因此可以自动处理字符串长度的变化
  • string对象和字符数组都可以使用 == 运算符来直接比较两个字符串的内容是否相同

13 已知正整数N=1234,M=2(表示从右向左取第2位),以下代码输出为()。

int N = 1234, M = 2, div = 1;
for (int i = 0; i < M - 1; i++) div *= 10;
cout << N / div % 10;

{{ select(13) }}

  • 1
  • 2
  • 3
  • 4

14 执行以下代码后,输出结果是()。

int a = 5, b = 10, c;
c = a == b;
cout << c;

{{ select(14) }}

  • 0
  • 1
  • 5
  • 10

15. 以下代码执行后,cnt的值为()。

int cnt = 0;
for (int i = 1; i <= 9; i++)
    for (int j = 0; j < i; j++)
        cnt++;
cout << cnt;

{{ select(15) }}

  • 36
  • 45
  • 55
  • 90

16. 以下代码的输出是()。

for (int i = 1; i <= 5; i++) {
    if (i % 2 == 0) continue;
    cout << i;
}

{{ select(16) }}

  • 135
  • 12345
  • 24
  • 无输出

17. 执行以下代码后,变量a的值是()。

int a = 'a' + 'b';
int b = 'a' - 'b';
a = a - b;

{{ select(17) }}

  • 196
  • -1
  • 1
  • 0

18. 以下代码实现了欧几里得算法,输入a=12, b=18,输出结果是()。

int a, b, r;
cin >> a >> b;
while (b != 0) {
    r = a % b;
    a = b;
    b = r;
}
cout << a;

{{ select(18) }}

  • 6
  • 12
  • 18
  • 3

19. 优美的数字定义为十进制下所有数位相同。不超过100的正整数中,优美的数字有()个。

{{ select(19) }}

  • 9
  • 18
  • 20
  • 100

20. 对于菱形输出,给定n=5(奇数),中心点位于第3行第3列。以下哪个条件可以判断位置(i,j)是否需要输出'#'?(其中k=n/2=2)

{{ select(20) }}

  • abs(k-i) + abs(k-j) == k
  • abs(k-i+1) + abs(k-j+1) == k
  • abs(k-i) + abs(k-j) == 0
  • i == j

二、阅读程序(共3题,判断题2分/题+选择题3分/题,共30分)

第一题:

阅读下面的C++代码,回答后面的问题。程序功能:输入正整数n,统计1到n之间“与5有关的数”的个数(含有数字5或者能被5整除)。

#include <iostream>
using namespace std;
int main() {
    int n, cnt = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int x = i;
        bool has5 = false;
        while (x > 0) {
            if (x % 10 == 5) {
                has5 = true;
                break;
            }
            x /= 10;
        }
        if (has5 || i % 5 == 0)
            cnt++;
    }
    cout << cnt;
    return 0;
}

1.判断题

(1) 当输入n=5时,输出为1。()

{{ select(21) }}

(2) 当输入n=10时,输出为3。()

{{ select(22) }}

(3) 代码中的 break 语句可以替换为 continue,结果不变。()

{{ select(23) }}

2.选择题

(1) 输入n=20,输出结果是()。

{{ select(24) }}

  • 4
  • 5
  • 6
  • 7
(2) 若将 while (x > 0) 改为 while (x >= 0),则()。

{{ select(25) }}

  • 程序运行结果不变
  • 程序可能死循环
  • 编译错误
  • 输出始终为0

第二题:

阅读下面的C++代码,回答后面的问题。

#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    int min_val, max_val, x;
    cin >> x;
    min_val = max_val = x;
    while (x != -999) {
        if (x > max_val) max_val = x;
        if (x < min_val) min_val = x;
        cin >> x;
    }
    cout << min_val << " " << max_val;
    return 0;
}

程序功能:输入若干整数,以-999结束,输出其中的最小值和最大值(不包括-999)。

1.判断题

(1) 如果第一个数就是-999,则输出“-999 -999”。()

{{ select(16) }}

(2) 如果输入中没有-999,程序会一直等待输入,不会输出结果。()

{{ select(27) }}

(3) 将 cin >> x; 移到 while 循环体的最后一行(原来位置删除)结果不变。()

{{ select(28) }}

2.选择题

(1) 输入序列为:5 2 8 -1 3 -999,输出结果是()。

{{ select(29) }}

  • -1 8
  • 2 8
  • -1 5
  • 2 5
(2) 若将 if (x > max_val) 改为 if (x >= max_val),则当输入中有多个相同最大值时,()。

{{ select(30) }}

  • 结果不变
  • max_val会变成最后一个最大值
  • min_val会改变
  • 程序出错

第三题:

阅读下面的C++代码,回答后面的问题。

#include <iostream>
using namespace std;
int main() {
    int N;
    cin >> N;
    int k = N / 2;
    for (int i = 1; i <= N; i++) {
        for (int j = 1; j <= N; j++) {
            if (abs(k - i + 1) + abs(k - j + 1) == k)
                cout << "#";
            else
                cout << ".";
        }
        cout << endl;
    }
    return 0;
}

程序功能:输入一个奇数N,输出一个由#和.组成的菱形图案。

1.判断题

(1) 当N=3时,输出菱形只有一行有#。()

{{ select(31) }}

(2) 当N=5时,输出图案的中心位置(第3行第3列)是#。()

{{ select(32) }}

(3) 将条件中的 == k 改为 <= k,输出图案会变成实心菱形。()

{{ select(33) }}

2.选择题

(1) 输入N=3,输出图案共有()个#。

{{ select(34) }}

  • 3
  • 4
  • 5
  • 6
(2) 若将 k = N / 2 改为 k = N / 2 + 1,且N=5,则图案()。

{{ select(35) }}

  • 不变
  • 变大
  • 变小
  • 偏移

三、完善程序(共2题,每题5个空,每空3分,共30分)

(1)优美的数字

题目描述 如果一个正整数在十进制下的所有数位都相同,则称它为"优美的数字”。 例如:6、77、888、9999都是优美的;123、101、2025都不是优美的。 给定一个正整数n,请你统计不超过n的正整数中,一共有多少个优美的数字。 输入格式 一行,一个正整数n(1<=n<=2025)。 输出格式 一行,一个整数,表示优美的数字的个数。 样例输入1: 6 样例输出1: 6 样例输入2: 20 样例输出3: 10 代码(请将下划线处填写正确的选项)

#include <iostream>
using namespace std;
int main() {
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int v = i % 10;          // 取个位数
        int t = i / 10;
        int chk = 1;             // 假设 i 是优美的
        while ( ____(1)____ ) {
            if ( ____(2)____ ) {
                chk = 0;
                break;
            }
            ____(3)____;
        }
        if ( ____(4)____ )
            ____(5)____;
    }
    cout << ans;
    return 0;
}
(1) 循环继续的条件是 t 中还有未检查的数字,应填

{{ select(36) }}

  • t == 0
  • t > 0
  • t >= 0
  • t < 0
(2) 判断当前末位是否与个位数不同

{{ select(37) }}

  • t % 10 != v
  • t % 10 == v
  • t / 10 != v
  • t / 10 == v
(3) 去掉已经检查过的末位

{{ select(38) }}

  • t %= 10
  • t /= 10
  • v *= 10
  • v /= 10
(4) 如果仍然是优美的,则累加计数

{{ select(39) }}

  • chk == 1
  • chk == 0
  • i == v
  • t == 0
(5) 正确的计数累加语句

{{ select(40) }}

  • ans += i
  • ans += 1
  • ans += chk
  • ans = ans + i

(2)数组清零(模拟操作)

题目描述 小A有一个由n个非负整数构成的数组a=[a1,a2,...,an]。他会对数组重复进行以下操作,直到所有元素都变成0: 1.在数组中找到最大的整数(如果有多个最大值,选择其中下标最大的那个),记其位置为k。 2.在数组所有非零的整数中找到最小的整数aj。 3.将第1步找到的ak减去第2步找到的aj(即ak = ak一aj)。 例如:数组[2,3,4]需要7次操作才能变成[0,0,0]。 给定一个数组,请计算需要多少次操作才能让所有元素变成0。题目保证有限步内可以完成。输入格式 第一行一个正整数n(1≤n≤100)。 第二行n个非负整数ai(0≤ai≤100)。 输出格式 一行一个整数,表示最少操作次数。 样例输入1: 3 2 3 4 样例输出1: 7 样例输入2: 5 1 3 2 2 5 样例输出2: 13 代码(请将下划线处填写正确的选项)

#include <iostream>
using namespace std;
int main() {
    int n, a[105];
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    int op = 0;
    while (true) {
        // 1. 找到最大值(下标最大的)
        int maxPos = -1, maxVal = -1;
        for (int i = 0; i < n; i++) {
            if (a[i] > 0 && a[i] >= maxVal) {
                maxVal = a[i];
                maxPos = i;
            }
        }
        // 2. 若全为0则退出
        if ( ____(1)____ ) break;

        // 3. 找到所有非零数中的最小值
        int minVal = 1000000;
        for (int i = 0; i < n; i++) {
            if (a[i] > 0 && a[i] < minVal)
                minVal = a[i];
        }

        // 4. 执行减法
        ____(2)____;
        op++;

        // 5. 循环继续
    }
    cout << op;
    return 0;
}
(1) 判断是否所有元素都已为0

{{ select(41) }}

  • maxPos == -1
  • maxVal == -1
  • maxVal == 0
  • maxPos == n
(2) 将最大值减去最小值

{{ select(42) }}

  • a[maxPos] -= minVal
  • a[maxPos] = minVal
  • minVal -= a[maxPos]
  • a[maxPos] = 0
(3) 查找最大值时使用条件 a[i] >= maxVal 的目的是

{{ select(43) }}

  • 确保选中第一个最大值
  • 确保选中最后一个最大值(下标最大)
  • 避免相等时更新
  • 提高效率
(4) 若将查找最小值的初始值 minVal = 1000000 改为 minVal = 0,则程序可能

{{ select(44) }}

  • 正确运行,结果不变
  • 永远找不到最小值,导致死循环
  • 编译错误
  • 输出结果变小
(5) 若输入数组中包含负数(与题目保证矛盾),则程序可能

{{ select(45) }}

  • 正常运行并正确输出
  • 无限循环
  • 数组越界
  • 输出负数