#1633. 信息素养大赛——中学组模拟卷 3

信息素养大赛——中学组模拟卷 3

信息素养大赛——中学组模拟卷 3

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

1.2026 年春节联欢晚会上一个武术表演节目《武 BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备 ( )

{{ select(1) }}

  • 检测重心的重力传感器
  • 预装的 AI 算法程序
  • 接收动作指令的遥控器
  • 拍摄其他机器人的摄像头

2.下面代码用来找出输入的 N 个正整数中最大的一个。如果将代码段用流程图来表示,则 L1 标记的代码行应该使用的图形是 ( )

int N, max=0, val; cin >> N;
while(N){ cin >> val; if(val > max) // L1 N--; max = val;
}

{{ select(2) }}

cout << max;

  • 圆形框
  • 椭圆形框
  • 平行四边形框
  • 菱形框

3.下面 C++ 代码可以执行,有关说法正确的是 ( )

double PI = 3.1415926; cout << (PI);

{{ select(3) }}

  • 为了方便初学者,cout <<(PI) 和 cout << (pi) 效果相同,即变量的大小写不敏感
  • cout << (PI) 修改为 cout << (Pi) 能正常执行
  • 不能用 PI 做变量名,因为要保存圆周率这个常量
  • 将程序中全部 PI 都改写为 Pai ,将能正常执行,不会报错

4.下面选择项中,与 C++ 表达式!(x> 5 && y <= 10) 等价的是 ( )

{{ select(4) }}

  • x <= 5 && y > 10
  • x>5 || y<=10
  • x <= 5 || y > 10
  • ! x > 5 && ! y <= 10

5.某同学执行 C++ 代码 cout <<((0.1 + 0.2) == 0.3) 时输出 0,下面最可能的原因是 ( )

{{ select(5) }}

  • C++ 的 + 运算符在处理小数时存在 bug
  • 0.1、0.2 和 0.3 在计算机中无法用二进制浮点数精确表示,导致 0.1 + 0.2 的结果与 0.3 存在微小误差
  • == 运算符不能用于比较浮点数,只能用于整数
  • 因为 0.1 + 0.2 的数学结果不等于 0.3

6.下面的 C++ 代码段执行后其输出是 ( )

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

{{ select(6) }}

  • 0#1#3#6#10#10
  • 1#2#3#4#5#6#7#8#9#10#10
  • 10#10
  • 10

7.下面的 C++ 代码执行之后的输出是 ( )


for ( int i = -2; i < 2; i++) if (not i % 3) cout << i << "#";

{{ select(7) }}

  • 0#
  • -2#-1#1#
  • -1#0#
  • -2#0#1#

8.下面 C++ 代码执行后输出是 ( )

int count = 0;
for (int i = 1; i < 4; i++)
for (int j = 1; j < 5; j++){
if (j == 3)
if (i == 2) continue;
break;
count += 1;
}
cout << (count);

{{ select(8) }}

  • 2
  • 4
  • 6
  • 8

9.下面 4 个选项中,与下面 C++ 代码段具有相同效果的是 ( )


i = 0; while (i < 5){ 
    i += 1; cout << i;
}

{{ select(9) }}

  • for (i = 0; i < 5; i++) cout << i;
  • for (i = 1; i < 5; i++) cout << i;
  • for (i = 0; i < 6; i++) cout << i;
  • for (i = 1; i < 6; i++) cout << i;

10.某学校图书馆的借阅卡号由 6 位整数组成。前 5 位是顺序编号,第 6 位是校验码,用于防止输错。校验码规则如下:将前 5 位数字相加,然后除以 10 的余数,就是第 6 位数字。如卡号 123455 的前 5 位之和为 15,除以 10 的余数是 5,故第 6 位为 5。下面的 C++ 代码段用于判断卡号是否正确,横线处应填入的代码是 ( )


cout << "请输入卡号:"; cin >> N;
order_num = N / 10; // 获得前5位顺序号
check_num = N % 10; // 获得最后一位
tnt = 0; // 保存前5位之和
for (i = 0; i < 5; i++){
________________
order_num /= 10;
}
if (__________________)
cout << "符合校验规则";
else cout << "不符合校验规则";

{{ select(10) }}

  • tnt += order_num / 10;tnt / 10 == check_num
  • tnt += order_num % 10;tnt % 10 == check_num
  • tnt = order_num / 10 + tnt;tnt % 10 == check_num
  • tnt = order_num % 10;tnt / 10 == check_num

11.如果字符变量_1 的值是字符 1,那么 (int)_1 的值是?( )

{{ select(11) }}

  • 1
  • -1
  • 49
  • +1 或者 -1

12.a,b 是整型变量,各自有互不相同的初始值。下列程序实现了什么效果 ( )

a=a^b;
b=a^b;
a=a^b;

{{ select(12) }}

  • a,b 的值从始至终都没有改变
  • a,b 的值实现了互换
  • a,b 的值互换了以后,又还回去了,相当于没有变化
  • a,b 的值最后和原值不一样,没有任何意义

13.关于下列正确的程序段,说法正确的是 ( )

char str1[] = "Hello";
char str2[] ={'H','e','l','l','o'};

{{ select(13) }}

  • 字符数组 str1 和 str2 完全相同
  • 这段程序多次执行将输出不同的结果
  • 字符数组 str1 和 str2 不相等
  • 这两个赋值方式完全相同

14.8 位二进制下,十进制数 - 15 的补码是 ( )

{{ select(14) }}

  • 11110000
  • 10001111
  • 10010000
  • 11110001

15.二进制数 10110101 是某数的 8 位补码,该数的十进制是 ( )

{{ select(15) }}

  • -73
  • -75
  • -77
  • 75

16.已知 unsigned char c = 0x0F; 执行 c = c <<3; 后,c 的十进制值是 ()

{{ select(16) }}

  • 64
  • 72
  • 80
  • 120

17.补码的情况下,关于按位取反运算,说法错误的是 ( )

{{ select(17) }}

  • ~5 的结果是 -6 (int 类型,32 位)
  • ~0 的结果是 0 (int 类型,32 位)
  • ~(-3) 的结果是 2 (int 类型,32 位)
  • ~8 的结果是 -9 (int 类型,32 位)

18.执行以下 C++ 代码后,sub 的值是 ( )

string str = "GESP2026";
string sub = str.substr(4, 2);

{{ select(18) }}

  • 20
  • 02
  • 2026
  • 026

19.以下问题中,最不适合用枚举法解决的是 ( )

{{ select(19) }}

  • 找出 1~100 之间所有能被 7 整除的数
  • 找出 100~200 之间的所有质数
  • 计算 1+2+3+…+1000 的和
  • 找出三位数中个位、十位、百位数字之和等于 10 的数

20.模拟 “字符串加密”:规则为 “每个字符 ASCII 码 + 3,若超过 z (122) 则从 a 重新开始”,以下代码中正确的条件判断是 ( )


for (int i = 0; i < str.length(); i++) {
// 需补充条件:
str[i] += 3;
}

{{ select(20) }}

  • if (str[i]> 122) str[i] = str[i] + 3 - 26;
  • if (str[i] > 122) str[i] = str[i] - 26;
  • if (str[i] + 3 > 122) str[i] = str[i] - 26;
  • if (str[i] + 3 > 'z') str[i] = 'a' + (str[i] + 3 - 'z') - 1;

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

第一题:



#include <iostream>
using namespace std;
int main() {
    int L, R, ans = 0;
    cin >> L >> R;
    for (int i = L; i <= R; i++) {
        int cnt = 0, t = i;
        while (t) {
            if (t % 10 == 2)
                cnt++;
            t /= 10;
        }
        if (cnt == 3)
            ans++;
    }
    cout << ans;
    return 0;
}

1.判断题

(1) 若输入 2221 2223,程序输出为 2。 ( ) {{ select(21) }}

  • 错 (2) 将 while (t) 改为 while (t != 0),程序功能不变。 ( ) {{ select(22) }}
  • 错 (3) 若输入 2000 3000,程序会统计所有包含恰好三个数字2的数。 ( ) {{ select(23) }}

2.选择题

(1) 输入 1 100,输出是( ) {{ select(24) }}

  • 0
  • 1
  • 2
  • 3

(2) 若将 if (cnt == 3) 改为 if (cnt >= 3),输入 2222 2222,输出为( ) {{ select(25) }}

  • 0
  • 1
  • 2
  • 无法确定

第二题:




#include <iostream>
using namespace std;
int main() {
    int n, a[50] = {0}, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int t = i, pos = 0;
        while (t) {
            a[pos++] = t % 2;
            t /= 2;
        }
        bool ok = true;
        for (int j = 0; j < pos; j++)
            if (a[j] != a[pos - j - 1]) {
                ok = false;
                break;
            }
        ans += ok;
    }
    cout << ans;
    return 0;
}

1.判断题

(1) 该程序的功能是统计 1 到 n 之间二进制表示是回文数的个数。 ( ) {{ select(26) }}

  • 错 (2) 输入 15,输出为 7。 ( ) {{ select(27) }}
  • 错 (3) 删除 bool ok = true; 并将 ans += ok; 改为 ans += 1; 后,程序输出不会改变。 ( ) {{ select(28) }}

2.选择题

(1) 输入 1,输出为( ) {{ select(29) }}

  • 0
  • 1
  • 2
  • 无法确定

(2) 若将内层循环条件改为 j < pos/2,则( ) {{ select(30) }}

  • 程序输出结果不变
  • 程序输出结果可能变大
  • 程序输出结果可能变小
  • 程序会编译错误

第三题:



#include <iostream>
using namespace std;
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (j == 0 || j == n - 1) {
                if (i == 0 || i == n - 1)
                    cout << '+';
                else
                    cout << '|';
            } else {
                if (i == 0 || i == n - 1)
                    cout << '-';
                else
                    cout << '*';
            }
        }
        cout << endl;
    }
    return 0;
}

1.判断题

(1) 输入 5 时,第一行输出为 +---+。 ( ) {{ select(31) }}

  • 错 (2) 输入 3 时,输出图形中间一行为 |*|。 ( ) {{ select(32) }}
  • 错 (3) 若将 j == n - 1 改为 j == n,程序会发生数组越界。 ( ) {{ select(33) }}

2.选择题

(1) 输入 4,输出图形中 '*' 的个数是( ) {{ select(34) }}

  • 4
  • 6
  • 8
  • 10

(2) 若将 cout << '+' 和 cout << '-' 互换,输入 5 时,第一行输出为( ) {{ select(35) }}

  • +---+
  • -+-+ -

  • | |

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

(1)幸运数字

题目描述 如果一个正整数在十进制下的所有数位都不包含数字7,则称它为“幸运数字”。 例如:1、2、3、4、5,6、8、9、10、11.....都是幸运的,7、17、70,71等不是。 给定一个正整数n,请你统计不超过n的正整数中,一共有多少个幸运数字。 输入格式 一行,一个正整数n(1≤n≤10000)。 输出格式 一行,一个整数,表示幸运数字的个数。 样例输入1: 10 样例输出1:(1~10中只有7不是幸运数字) 9 样例输入2: 20 样例输出2:(1~20中7和17不是幸运数字,其余18个都是) 18 代码(请将下划线处填写正确的选项)




#include <iostream>
using namespace std;
int main() {
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int t = i;
        int lucky = 1;          // 假设 i 是幸运数字
        while ( ____(1)____ ) {
            if ( ____(2)____ ) {
                lucky = 0;
                break;
            }
            ____(3)____;
        }
        if ( ____(4)____ )
            ____(5)____;
    }
    cout << ans;
    return 0;
}

(1) 循环继续的条件是 t 中还有未检查的数字,应填( ) {{ select(36) }}

  • t == 0
  • t > 0
  • t >= 0
  • t < 0 (2) 判断当前末位是否为7,应填( ) {{ select(37) }}
  • t % 10 == 7
  • t % 10 != 7
  • t / 10 == 7
  • t / 10 != 7 (3) 去掉已经检查过的末位,应填( ) {{ select(38) }}
  • t %= 10
  • t /= 10
  • t = t % 10
  • t = t / 10 (4) 如果仍然是幸运数字,则累加计数,应填( ) {{ select(39) }}
  • lucky == 1
  • lucky == 0
  • t == 0
  • i == 0 (5) 正确的计数累加语句,应填( ) {{ select(40) }}
  • ans += i
  • ans += 1
  • ans += lucky
  • ans = ans + i

###(2)二进制回文数 题目描述 对于一个正整数n,将其转换为不含前导零的二进制表示。如果这个二进制序列从左向右读与从右向左读完全相同,则称该数为二进制回文数。 例如:9的二进制是1001,是回文数;12的二进制是1100,不是回文数。给定一个正整数n,请你统计在1到n的范围内二进制回文数的数量。 输入格式 一行,一个正整数n(1≤n≤105)。 输出格式 一行,一个整数,表示二进制回文数的个数。 样例输入1: 15 样例输出1:(1、3、5、7、9、15 共6个) 6 样例输入2: 20 样例输出2:(1、3、5、7、9、15 、17共7个) 7 代码(请将下划线处填写正确的选项)




#include <iostream>
using namespace std;
int main() {
    int n, ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        int t = i;
        int bits[50] = {0};
        int pos = 0;
        while ( ____(1)____ ) {
            bits[pos++] = t % 2;
            ____(2)____;
        }
        int ok = 1;
        for (int j = 0; j < pos; j++) {
            if ( ____(3)____ ) {
                ok = 0;
                break;
            }
        }
        if ( ____(4)____ )
            ____(5)____;
    }
    cout << ans;
    return 0;
}

(1) 循环继续的条件是 t 不为0,应填( ) {{ select(41) }}

  • t > 0
  • t == 0
  • t >= 0
  • t != 1 (2) 去掉二进制最低位,应填( ) {{ select(42) }}
  • t %= 2
  • t /= 2
  • t = t % 2
  • t = t / 2 (3) 判断对称位置上的二进制位是否不同,应填( ) {{ select(43) }}
  • bits[j] != bits[pos - j - 1]
  • bits[j] == bits[pos - j - 1]
  • bits[j] != bits[j + 1]
  • bits[j] == bits[j + 1] (4) 如果是二进制回文数,则累加计数,应填( ) {{ select(44) }}
  • ok == 1
  • ok == 0
  • pos > 0
  • i % 2 == 1 (5) 正确的计数累加语句,应填( ) {{ select(45) }}
  • ans += i
  • ans += 1
  • ans += ok
  • ans = ans + i