1 条题解

  • 0
    @ 2026-5-15 22:47:10

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

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

    1. 下面有关 C++ 变量的说法,正确的是( A

    A. 不可以用 for 作为变量名,因为 for 是 C++ 的关键字(保留字)
    B. _tnt 不可以是变量名,因为变量名的第一个字符必须是英文字母
    C. *tnt* 不可以是变量名,因为最后一个字符容易与减号混淆
    D. 可以用 printf 作为变量名,因为 printf 是关键字,但这不是好习惯,因为 printf 有约定的功能与含义
    

    【答案:A】

    • A. 不可以用 for 作为变量名,因为 for 是 C++ 的关键字(保留字) ✅ 正确!C++ 的关键字(如 for、int、if、return 等)被语言保留使用,不能作为变量名
    • B. _tnt 不可以是变量名,因为变量名的第一个字符必须是英文字母 ❌ 错误!C++ 标识符可以以下划线 _ 开头,_tnt 是合法的变量名
    • C. *tnt* 不可以是变量名,因为最后一个字符容易与减号混淆 ❌ 错误!变量名中不能包含 * 字符,* 是指针运算符,不是合法的标识符字符
    • D. 可以用 printf 作为变量名,因为 printf 是关键字 ❌ 错误!printf 不是 C++ 的关键字,它是 C 标准库中的函数名。虽然技术上可以作为变量名,但这不是好习惯,且题目说"printf 是关键字"这个前提就是错的

    2. C++ 表达式 2 + 3 * 4 % 5 的值为( B

    A. 0
    B. 4
    C. 14
    D. 50
    

    【答案:B】

    • A. 0 ❌ 计算错误
    • B. 4 ✅ 正确!按照运算符优先级:先算 3 * 4 = 12,再算 12 % 5 = 2,最后 2 + 2 = 4
    • C. 14 ❌ 错误地按从左到右计算:2+3=5, 5*4=20, 20%5=0,忽略了运算符优先级
    • D. 50 ❌ 计算错误

    3. 下面的 C++ 代码执行时如果先输入 10 回车后输入 20 并回车,其输出是( C

    int N,M;
    printf("第一个数:");
    scanf("%d", &N);
    printf("第二个数:");
    scanf("%d", &M);
    printf("%%(N+M)=%d", N+M);
    
    A. 30=30
    B. 10+20=30
    C. %(N+M)=30
    D. 错误提示
    

    【答案:C】

    • A. 30=30 ❌ 没有正确理解 printf 格式化输出中 %% 的含义
    • B. 10+20=30 ❌ 错误地认为会输出变量名
    • C. %(N+M)=30 ✅ 正确!在 printf 的格式字符串中,%% 是转义序列,表示输出一个字面量 %。所以 printf("%%(N+M)=%d", N+M) 输出 %(N+M)=30(N+M=10+20=30)
    • D. 错误提示 ❌ 代码语法正确,不会报错

    4. 下面 C++ 代码执行后的输出是( D

    int i, tnt = 0;
    for (i = 0; i < 100; i++)
        tnt += 1;
    cout << tnt << ' ' << i;
    
    A. 99 99
    B. 100 99
    C. 99 100
    D. 100 100
    

    【答案:D】

    • A. 99 99 ❌ 两个值都算错了
    • B. 100 99 ❌ i 的值算错了,循环退出时 i=100 而非 99
    • C. 99 100 ❌ tnt 算错了,tnt 累加了 100 次应为 100
    • D. 100 100 ✅ 正确!循环 for(i=0; i<100; i++) 执行 100 次(i=0,1,2,...,99),每次 tnt 加 1,所以 tnt=100;当 i=99 时执行循环体后 i++ 变成 100,然后判断 100<100 为假退出循环,此时 i=100

    5. 两个正整数,只要不相等,就一直进行如下操作:最大数减去最小数得到一个值,该值和两个数的最小数构成新的两个正整数,重复操作,直到两个数相等,此时输出该数。下面的 C++ 代码用于实现该操作,横线处应该填写的代码是( A

    int N,M;
    cin >> N >> M;
    while (N!=M){
        if(N>M)
            _____________;
        else
            _____________;
    }
    cout << N;
    
    A. N=N-M; M=M-N;
    B. M=M-N; N=N-M;
    C. M=N-M; N=M-N;
    D. N,M=M,N; M,N=N,M;
    

    【答案:A】

    • A. N=N-M; M=M-N; ✅ 正确!这是辗转相减法(欧几里得算法的减法版本)。当 N>M 时,用 N-M 替换 N;当 M>N 时(else 分支),用 M-N 替换 M。注意 else 分支中此时 M>N,所以应该执行 M=M-N
    • B. M=M-N; N=N-M; ❌ 两个分支的逻辑反了
    • C. M=N-M; N=M-N; ❌ 赋值顺序错误,N 的值已被修改,导致 M=N-M 使用了错误的 N 值
    • D. N,M=M,N; M,N=N,M; ❌ 这是交换两个变量的值,不是辗转相减

    6. 执行下面 C++ 代码可以找出千位与个位的和恰好等于中间两位的四位数,横线处应该填入( C

    int count=0;
    int a, bc, d, tmp;
    for (int i=1000;i<=9999;i++) {
        a=(tmp=i)/1000;
        ______________;
        bc=tmp/10;
        d=tmp-bc*10;
        if(a+d==bc) {
            count++;
        }
    }
    cout << count;
    
    A. tmp=i/10;
    B. tmp=i%100;
    C. tmp-=a*1000;
    D. tmp=i-i%1000;
    

    【答案:C】

    • A. tmp=i/10; ❌ 这样 tmp 变成了去掉个位后的数,但后面 bc=tmp/10 会再除以 10,导致错误
    • B. tmp=i%100; ❌ 这样 tmp 只保留了后两位,丢失了百位和十位的信息
    • C. tmp-=a*1000; ✅ 正确!a 是千位数字(如 i=1234 时 a=1),tmp-=a*1000 相当于去掉千位,tmp 变成 234。然后 bc=tmp/10=23(中间两位),d=tmp-bc*10=4(个位)。判断 a+d==bc1+4==23?不成立。这个逻辑是正确的
    • D. tmp=i-i%1000; ❌ 这样 tmp 只保留了千位,丢失了后三位

    7. 常量 7.0 的数据类型是( A

    A. double
    B. float
    C. void
    D. int
    

    【答案:A】

    • A. double ✅ 正确!在 C++ 中,带小数点的字面常量(如 7.0、3.14)默认是 double 类型
    • B. float ❌ float 类型的字面常量需要加后缀 f 或 F,如 7.0f
    • C. void ❌ void 是"无类型",不是数据类型
    • D. int ❌ int 是整数类型,7.0 有小数点所以不是 int

    8. 如果 a 和 b 均为 int 类型的变量,下列表达式不能正确判断"a 等于 0 且 b 等于 0"的是( B

    A. (a == 0) && (b == 0)
    B. (a == b == 0)
    C. (!a) && (!b)
    D. (a == 0) + (b == 0) == 2
    

    【答案:B】

    • A. (a == 0) && (b == 0) ✅ 能正确判断。逻辑与,两边都为真时才为真
    • B. (a == b == 0) ❌ 不能正确判断!由于 == 是左结合的,a == b == 0 等价于 (a == b) == 0。先判断 a == b,结果为 true(1) 或 false(0),再判断这个结果是否等于 0。例如 a=1, b=2 时:1==2 为 false(0),0==0 为 true,错误地判断为"都等于 0"
    • C. (!a) && (!b) ✅ 能正确判断。非零值取反为 0(false),0 取反为 1(true)。当 a 和 b 都为 0 时,!a!b 都为 true
    • D. (a == 0) + (b == 0) == 2 ✅ 能正确判断。a==0 为真时值为 1,两个都为真时和为 2

    9. 在下列代码的横线处填写(),可以使得输出是"1248"。

    #include <iostream>
    using namespace std;
    int main() {
        for (int i = 1; i <= 8; ____) // 在此处填入代码
            cout << i;
        return 0;
    }
    
    A. i++
    B. i *= 2
    C. i += 2
    D. i * 2
    

    【答案:B】

    • A. i++ ❌ i 依次为 1,2,3,4,5,6,7,8,输出 "12345678"
    • B. i *= 2 ✅ 正确!i 依次为 1,2,4,8,输出 "1248"。i=8 时输出后 i 变为 16,16<=8 为假,退出循环
    • C. i += 2 ❌ i 依次为 1,3,5,7,输出 "1357"
    • D. i * 2 ❌ 这只是表达式 i*2,不会改变 i 的值,会导致无限循环输出 "1111..."

    10. 下列流程图,属于计算机的哪种程序结构?( C

    A. 顺序结构
    B. 循环结构
    C. 分支结构
    D. 数据结构
    

    【答案:C】

    • A. 顺序结构 ❌ 顺序结构是程序从上到下依次执行,没有判断和分支
    • B. 循环结构 ❌ 循环结构是重复执行某段代码,流程图中会有回环的箭头
    • C. 分支结构 ✅ 正确!流程图中包含菱形判断框和两条不同的执行路径(是/否),这是典型的分支结构(if-else)
    • D. 数据结构 ❌ 数据结构是数据的组织方式(如数组、链表),不是程序结构

    11. 如果 a 为 char 类型的变量,下列哪个表达式可以正确判断"a 是小写字母"?( D

    A. a <= a <= z
    B. a - 'a' <= 'z' - 'a'
    C. 'a' <= a <= 'z'
    D. a >= 'a' && a <= 'z'
    

    【答案:D】

    • A. a <= a <= z ❌ 语法错误,且 a <= a 永远为真,没有实际判断意义
    • B. a - 'a' <= 'z' - 'a' ❌ 这个表达式判断的是 a 的 ASCII 偏移量是否 ≤ 25,对于任何字符(包括大写字母和数字)都可能成立,不能精确判断是否为小写字母
    • C. 'a' <= a <= 'z' ❌ C++ 不支持链式比较。'a' <= a <= 'z' 等价于 ('a' <= a) <= 'z',先判断 'a' <= a 得 true(1) 或 false(0),再判断 1<='z' 或 0<='z',结果恒为 true
    • D. a >= 'a' && a <= 'z' ✅ 正确!用逻辑与连接两个比较,只有当 a 的 ASCII 值在 'a'(97) 和 'z'(122) 之间时才为真

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

    #include<iostream>
    using namespace std;
    int main()
    {
    	int n = 17;
    	bool isprime = true;
    	for(int i = 2; i <= n; i++)
    		if(n % i == 0)
    			isprime = false;
    	cout << isprime << endl;
    	return 0;
    }
    
    A. false
    B. true
    C. 0
    D. 1
    

    【答案:C】

    • A. false ❌ 虽然 isprime 的值是 false,但 cout 输出 bool 类型时默认输出 0 或 1
    • B. true ❌ 程序逻辑有误:循环从 i=2 到 i=17,当 i=17 时 17%17==0 成立,isprime 被设为 false
    • C. 0 ✅ 正确!循环中 i 会一直增加到 n(17),当 i=17 时 17%17==0 成立,isprime=false。cout 输出 bool 类型 false 时显示为 0
    • D. 1 ❌ 如果 isprime 为 true 才会输出 1

    13. 以下关于标准 C++ 一维数组的描述,哪一项是错误的?( C

    A. 数组的下标从0开始
    B. 数组在内存中是连续存放的
    C. 数组的长度只能在运行时才能确定
    D. 可以在程序中修改数组某个元素的值
    

    【答案:C】

    • A. 数组的下标从0开始 ✅ 正确。C++ 数组索引从 0 开始,如 arr[0] 是第一个元素
    • B. 数组在内存中是连续存放的 ✅ 正确。数组元素在内存中占据连续的存储空间
    • C. 数组的长度只能在运行时才能确定 ❌ 错误!标准 C++ 中,静态数组的长度必须在编译时确定(如 int arr[5])。只有使用 new 动态分配或 vector 时才能在运行时确定长度
    • D. 可以在程序中修改数组某个元素的值 ✅ 正确。如 arr[2] = 100; 可以修改数组元素

    14. 根据下面的流程图,如果成绩 score 输入 60,输出的结果是( C

    开始
    输入成绩score
    score≥90? → 是→输出"优秀"
            → 否→score>60? → 是→输出"及格"
                        → 否→输出"不及格"
    结束
    
    A. 优秀
    B. 及格
    C. 不及格
    D. 没有输出
    

    【答案:C】

    • A. 优秀 ❌ score=60,不满足 score≥90
    • B. 及格 ❌ score=60,不满足 score>60(注意是严格大于,不是大于等于)
    • C. 不及格 ✅ 正确!score=60:先判断 score≥90?否 → 再判断 score>60?否(60 不大于 60)→ 输出"不及格"
    • D. 没有输出 ❌ 流程图覆盖了所有情况,一定有输出

    15. 某个整数很长很长,形如:1232123212321……,其规律是从 1 开始逐一升高到 3 然后逐一降低到 1,然后又逐一升高到 3,一直到很长很长。假设最高位编号为 1,要求判断从左边最高位开始的第 N 位数是几?在横线处应该填入的代码是( A

    int N, M;
    cout << "请输入编号:";
    cin >> N;
    M = _____________;
    if (M != 0)
        cout << M;
    else
        cout << 2;
    
    A. N % 4
    B. N / 4
    C. N % 3
    D. N / 3
    

    【答案:A】

    • A. N % 4 ✅ 正确!序列规律为 1,2,3,2,1,2,3,2,1,2,3,2...,周期为 4。N%4 的结果:N=1→1, N=2→2, N=3→3, N=4→0(输出 2), N=5→1, N=6→2... 完美匹配序列规律
    • B. N / 4 ❌ 除法得到的是商,不能反映周期内的位置
    • C. N % 3 ❌ 周期为 3 的话序列会是 1,2,3,1,2,3...,但实际序列中有两个 2
    • D. N / 3 ❌ 同样不能反映周期内的位置

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


    16. C++ 表达式 10*4%610*2%3 的结果相同。( ✗ 错误

    【答案:错误 ✗】 解析:

    • 10*4%6:先算 10*4=40,再算 40%6=4(40÷6=6 余 4)
    • 10*2%3:先算 10*2=20,再算 20%3=2(20÷3=6 余 2)
    • 4 ≠ 2,两个表达式的结果不相同
    • 注意 *% 优先级相同,按从左到右的顺序计算

    17. 在 C++语言中,标识符中可以有数字,但不能以数字开头。( ✓ 正确

    【答案:正确 ✓】 解析:

    • C++ 标识符命名规则:
      1. 只能由字母(A-Z, a-z)、数字(0-9)和下划线(_)组成
      2. 第一个字符必须是字母或下划线,不能是数字
    • 合法示例:x321_x321x321_
    • 非法示例:0x321(以数字开头)、x-321(包含连字符)
    • 此外,标识符不能是 C++ 的关键字(如 int、for、return 等)

    18. for 语句的循环体至少会执行一次。( ✗ 错误

    【答案:错误 ✗】 解析:

    • for 循环:先判断条件,条件为真才执行循环体。如果初始条件就不满足,循环体一次都不执行
    • 例如:for(int i=10; i<5; i++)10<5 为假,循环体不会执行
    • do-while 循环才是保证至少执行一次的循环结构(先执行后判断)
    • while 循环也是先判断后执行,可能一次都不执行

    19. while 语句的循环体至少会执行一次。( ✗ 错误

    【答案:错误 ✗】 解析:

    • while 循环:先判断条件,条件为真才执行循环体,可能一次都不执行
    • 例如:while(false) { cout << "不会输出"; } 循环体永远不会执行
    • do-while 循环:先执行循环体,再判断条件,保证至少执行一次
    • 这是 while 和 do-while 的核心区别

    20. 在 C++ 中,int a[] = {1, 2, 3, 4, 5}; 可以定义一个包含 5 个元素的整型数组。( ✓ 正确

    【答案:正确 ✓】 解析:

    • C++ 允许在定义数组时省略数组大小,编译器会根据初始化列表自动推断数组长度
    • int a[] = {1, 2, 3, 4, 5}; 等价于 int a[5] = {1, 2, 3, 4, 5};
    • 编译器统计初始化列表中有 5 个元素,自动将数组 a 的大小设为 5
    • 数组元素可以通过 a[0]a[4] 访问

    信息

    ID
    4873
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    递交数
    53
    已通过
    12
    上传者