1 条题解

  • 0
    @ 2026-5-15 22:48:19

    《星火征途》初赛模拟卷(六)

    一、单选题(每题5分,共75分)

    1. 有关下面 C++ 代码的说法,错误的是( B

    int tnt = 0;
    for (int i = 1; i < 10; i += 2) // L1
        tnt += i; // L2
    cout << tnt;
    

    【答案:B】

    • A. L1 的 i < 10 改为 i < 11 结果相同 ✅ 正确!i 取值 1,3,5,7,9,i=11 时已不满足 i<10,改为 i<11 后 i=11 仍不满足 i+=2 的递增规律(i 最大为 9),结果不变
    • B. L1 的 i = 1 改为 i = 0 结果相同 ❌ 错误!i 从 1 开始:1+3+5+7+9=25;i 从 0 开始:0+2+4+6+8=20,结果不同
    • C. tnt += i 与 tnt = tnt + i 效果相同 ✅ 正确!+= 是复合赋值运算符,等价于先加再赋值
    • D. tnt += i 与 tnt = i + tnt 效果相同 ✅ 正确!加法满足交换律,两者结果一致

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

    int i;
    for (i = 10; i < 100; i += 10){
        if (i % 10 == 0)
            continue;
        printf("%d#",i);
    }
    if(i >= 100) printf("%d END",i);
    

    【答案:C】

    • A. 10#20#30#40#50#60#70#80#90#100 END ❌ i 每次都是 10 的倍数,i%10==0 始终为真,continue 跳过所有 printf
    • B. 100#100 END ❌ 循环内从未执行过 printf
    • C. 100 END ✅ 正确!i 取值 10,20,...,90,每次 i%10==0 成立,continue 跳过循环体内 printf;当 i=100 时退出循环,i>=100 成立,输出 "100 END"
    • D. 没有输出 ❌ 循环结束后会执行 if(i>=100) 分支输出

    3. 如果一个正整数能被 3 整除,或者某一位能被 3 整除,则称之为 "漂亮数"。下面的 C++ 代码用于判断正整数 N 是否为漂亮数,L1 行的横线处应该填入的代码是( D

    int N, Flag;
    cin >> N;
    Flag=0; // "非漂亮数"
    if(N%3==0)
        Flag=1; // "漂亮数"
    else
        while (N!=0){
            if(______________) { // L1
                Flag=1;
                break;
            }
            N/=10;
        }
    cout << (Flag?"漂亮数":"非漂亮数");
    

    【答案:D】

    • A. N%10==0 ❌ 判断末位是否为 0,与"某一位能被 3 整除"无关
    • B. N%3%10==0 ❌ 先判断 N 能否被 3 整除再取模 10,逻辑错误
    • C. N%10%3 ❌ 表达式值非零即真,但缺少与 0 比较,且语义不完整
    • D. N%10%3==0 ✅ 正确!N%10 取出个位数字,%3==0 判断该位是否能被 3 整除

    4. 如果正整数 N 的所有奇因数(即能将 N 整除的正奇数)的和是 27 的倍数,则称 N 是 27 的神秘数。下面的 C++ 代码用于判断输入的 N 是否为 27 的神秘数,横线处应该填入的代码是( C

    int i,N,cnt=0;
    cin >> N;
    for(i=1;i <=N;i++){
        if(______________)
            cnt+=i;
    }
    if(cnt%27==0)
        cout << 'Y';
    else
        cout << 'N';
    

    【答案:C】

    • A. (N%i) && (i%2)N%i 非零表示不能整除,逻辑反了
    • B. (N%i0) && (i%20)i%2==0 筛选的是偶数,题目要求奇因数
    • C. (N%i==0) && (i%2) ✅ 正确!N%i==0 判断 i 是 N 的因数,i%2 非零表示 i 是奇数,两者同时满足即为奇因数
    • D. (N%i) && (i%2==0) ❌ 既不能整除又是偶数,完全不符合要求

    5. 执行以下 C++ 语言程序后,输出结果是( C

    #include <iostream>
    using namespace std;
    int main() {
        int sum = 0;
        for(int i = 1; i <= 20; i++)
            if (i % 3 == 0 || i % 5 == 0)
                sum += i;
        cout << sum << endl;
        return 0;
    }
    

    【答案:C】

    • A. 210 ❌ 计算错误
    • B. 113 ❌ 计算错误
    • C. 98 ✅ 正确!1~20 中 3 或 5 的倍数:3,5,6,9,10,12,15,18,20,求和 = 3+5+6+9+10+12+15+18+20 = 98
    • D. 15 ❌ 仅计算了部分值

    6. 在下列代码的横线处填写( D ),可以使得输出是 5

    #include<iostream>
    using namespace std;
    int main()
    {
    	int cnt = 0;
    	for(char ch = '1'; ch <= '9'; ch++)
    		if(______)//此处填入代码
    			cnt++;
    	cout << cnt << endl;
    	return 0;
    }
    

    【答案:D】

    • A. ch < '5' ❌ ch 取 '1','2','3','4' 共 4 个,cnt=4
    • B. ch >= 5 ❌ 字符与整数比较,'1' 的 ASCII 码为 49,所有字符都 ≥5,cnt=9
    • C. ch >= '4' ❌ ch 取 '4'~'9' 共 6 个,cnt=6
    • D. ch % 2 == 1 ✅ 正确!字符 '1','3','5','7','9' 的 ASCII 码均为奇数,ch%2==1 筛选出 5 个字符,cnt=5

    7. 以下代码是一个程序的部分代码,能够正确执行,输出的结果是( D

    int arr[5] = {1, 2, 3, 4, 5};
    int p = arr[1];
    cout << (p + 2) << endl;
    

    【答案:D】

    • A. 1 ❌ 这是 arr[0] 的值
    • B. 2 ❌ 这是 arr[1] 的值
    • C. 3 ❌ 计算错误
    • D. 4 ✅ 正确!arr[1] = 2p = 2p + 2 = 4

    8. 以下代码执行后,数组 arr 的内容是( A

    int arr[6] = {1, 2, 3, 4, 5, 6};
    for (int i = 0; i < 6; i += 2) {
        arr[i] = arr[i] + arr[i+1];
        arr[i+1] = arr[i] - arr[i+1];
        arr[i] = arr[i] - arr[i+1];
    }
    

    【答案:A】

    • A. {2, 1, 4, 3, 6, 5} ✅ 正确!这是经典的两数交换算法(不使用临时变量)。i=0 时交换 arr[0] 和 arr[1]:{2,1,...};i=2 时交换 arr[2] 和 arr[3]:{2,1,4,3,...};i=4 时交换 arr[4] 和 arr[5]:{2,1,4,3,6,5}
    • B. {1, 2, 3, 4, 5, 6} ❌ 原数组未变化
    • C. {3, 1, 4, 2, 5, 3} ❌ 计算错误
    • D. {1, 3, 2, 5, 4, 6} ❌ 计算错误

    9. 如果字符串 s 的值是 "GESP",以下代码执行后 s 的最后结果是( D

    for (int i = 0; i < s.length(); i++) {
        s[i] = toupper(s[i] + i);
    }
    cout << s;
    

    【答案:D】

    • A. GESP ❌ 未考虑 toupper 和偏移
    • B. HFTR ❌ 仅加了偏移但未正确计算 toupper
    • C. hesp ❌ 小写结果,toupper 返回大写
    • D. GFUS ✅ 正确!s[0]='G'+0='G'→toupper→'G';s[1]='E'+1='F'→toupper→'F';s[2]='S'+2='U'→toupper→'U';s[3]='P'+3='S'→toupper→'S',结果为 "GFUS"

    10. 下列代码段执行后,变量 sum 的值是( D

    int sum = 0;
    for (int i = 1; i <= 10; i++) {
        if (i % 3 == (8 >> 2))
            continue;
        sum += i;
    }
    cout << sum;
    

    【答案:D】

    • A. 12 ❌ 计算错误
    • B. 17 ❌ 计算错误
    • C. 33 ❌ 计算错误
    • D. 40 ✅ 正确!8 >> 2 = 2(8 的二进制 1000 右移 2 位得 0010 = 2)。当 i % 3 == 2 时执行 continue 跳过累加,跳过的 i 有 2, 5, 8;否则累加,累加的 i 有 1, 3, 4, 6, 7, 9, 10。sum = 1+3+4+6+7+9+10 = 40

    11. 已知字符串 s = "C++ Programming",下列程序运行的结果是( B

    cout << (int)(s.length() | 3) << endl;
    

    【答案:B】

    • A. 14 ❌ 计算错误
    • B. 15 ✅ 正确!字符串 "C++ Programming" 长度为 15(C,+,+,空格,P,r,o,g,r,a,m,m,i,n,g),15 | 3:15 的二进制 1111,3 的二进制 0011,按位或得 1111 = 15
    • C. 16 ❌ 计算错误
    • D. 17 ❌ 计算错误

    12. 以下代码运行后,sum 的结果是( B

    int arr[5] = {2, 4, 6, 8, 10};
    int sum = 0;
    for (int i = 0; i < 5; i++) {
        switch (arr[i] % (1 | 2)) {
            case 0: sum += 1; break;
            case 1: sum += 2; break;
            case 2: sum += 3; break;
        }
    }
    cout << sum;
    

    【答案:B】

    • A. 10 ❌ 计算错误
    • B. 11 ✅ 正确!1 | 2 = 3(二进制 01 | 10 = 11 = 3)。arr[0]=2, 2%3=2→sum+=3=3;arr[1]=4, 4%3=1→sum+=2=5;arr[2]=6, 6%3=0→sum+=1=6;arr[3]=8, 8%3=2→sum+=3=9;arr[4]=10, 10%3=1→sum+=2=11
    • C. 14 ❌ 计算错误
    • D. 15 ❌ 计算错误

    13. 小杨用一个二维数组表示棋盘,其中 1 表示有棋子,0 表示没有棋子。他想知道第 2 行第 3 列有没有棋子,可采用的代码是( B

    int a[3][4] = {
        {1, 0, 1, 0},
        {0, 1, 0, 1},
        {1, 1, 0, 0}
    };
    

    【答案:B】

    • A. cout << a[1, 2] << endl; ❌ C++ 中逗号运算符 1,2 结果为 2,等价于 a[2],不是二维访问
    • B. cout << a[1][2] << endl; ✅ 正确!C++ 二维数组使用 a[行][列] 语法,第 2 行第 3 列对应 a[1][2](索引从 0 开始),值为 0
    • C. cout << a(1, 2) << endl; ❌ 这是函数调用语法,不能用于数组访问
    • D. cout << a{1}{2} << endl; ❌ 这不是合法的 C++ 数组访问语法

    14. 执行完下面的代码后,sum 的值是( B

    int arr[2][3][2] = {
        {{1,2}, {3,4}, {5,6}},
        {{7,8}, {9,10}, {11,12}}
    };
    int sum = 0;
    for(int i = 0; i < 2; i++)
        for(int j = 0; j < 3; j++)
            for(int k = 0; k < 2; k++)
                if((i+j+k) % 2 == 0)
                    sum += arr[i][j][k];
    

    【答案:B】

    • A. 36 ❌ 计算错误
    • B. 39 ✅ 正确!遍历三维数组,当 (i+j+k)%2==0 时累加。满足条件的元素:arr[0][0][0]=1, arr[0][1][1]=4, arr[0][2][0]=5, arr[1][0][1]=8, arr[1][1][0]=9, arr[1][2][1]=12,总和 = 1+4+5+8+9+12 = 39
    • C. 78 ❌ 这是全部元素之和
    • D. 30 ❌ 计算错误

    15. 表达式 ((3 == 0) + 'A' + 1 + 3.0) 的结果类型为( A

    【答案:A】

    • A. double ✅ 正确!3==0 为 false,隐式转换为整数 0;'A' 的 ASCII 值为 65;0 + 65 + 1 + 3.0 = 69.0,由于 3.0 是 double 类型,整个表达式自动提升为 double
    • B. int ❌ 表达式中有 double 类型参与运算,结果会提升为 double
    • C. char ❌ 算术运算中 char 会被提升为 int,且最终有 double 参与
    • D. bool ❌ 表达式结果不是布尔类型

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


    16. 下面 C++ 代码执行后将输出 0。( ✗ 错误

    int i;
    for(i=0;i<10;i++){
        if(i%3==0)
            continue;
        else
            break;
    }
    cout << i;
    

    【答案:错误 ✗】 解析:

    • i=0 时:0%3==0 成立,执行 continue,i++ 后 i=1
    • i=1 时:1%3==0 不成立,执行 else 分支的 break,退出循环
    • 此时 i=1,输出 1,而不是 0
    • 因此"输出 0"的说法是错误的 ✗

    17. 在 C++ 中,数组名不能改变,数组名不能被赋值。( ✓ 正确

    【答案:正确 ✓】 解析:

    • 数组名是常量指针:数组名代表数组首元素的地址,是一个指针常量
    • 不能对数组名进行赋值操作,例如 arr = newArr; 是非法的
    • 数组名可以参与表达式(如 arr+1 表示第二个元素的地址),但不能作为左值被修改
    • 这是 C++ 数组的重要特性!

    18. strcmp(str1, str2) 返回 0 表示 str1 大于 str2,返回正数表示两者相等。( ✗ 错误

    【答案:错误 ✗】 解析:

    • strcmp 返回值规则
      • 返回 0:两个字符串相等
      • 返回 正数:str1 大于 str2(字典序)
      • 返回 负数:str1 小于 str2(字典序)
    • 题目说法完全颠倒,因此错误 ✗
    • 记忆技巧:strcmp = string compare,返回 0 表示"没有差异"即相等

    19. 在 C++ 中,定义如下二维数组:int a[3][4];,数组 a 在内存中是按行优先连续存放的,即 a[0][0]a[0][1]a[0][2]a[0][3] 在内存中是连续的。( ✓ 正确

    【答案:正确 ✓】 解析:

    • C++ 二维数组采用行优先(Row-Major)存储
    • int a[3][4] 在内存中的排列顺序为: a[0][0], a[0][1], a[0][2], a[0][3], a[1][0], a[1][1], ..., a[2][3]
    • 同一行的元素在内存中确实是连续存放的
    • 这也是为什么可以用 int* p = &a[0][0]; 然后通过 *(p + i*4 + j) 访问 a[i][j]

    20. 整型变量 a 的值为 3,浮点数变量 b 的值为 3.5,在 C++ 编译环境下,经过 a *= b 计算后,a 的值变为 10.5,此时如果输出 a,将输出 10.5。( ✗ 错误

    【答案:错误 ✗】 解析:

    • a *= b 等价于 a = a * b
    • 3 * 3.5 = 10.5,但 aint 类型
    • 赋值给 int 变量时会发生隐式类型转换(截断小数部分),10.5 → 10
    • 因此 a 的实际值为 10,输出也是 10,而不是 10.5
    • 这是整型与浮点型混合运算时的常见陷阱!
    • 1

    信息

    ID
    4874
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    42
    已通过
    5
    上传者