1 条题解
-
0
《星火征途》初赛模拟卷(六)
一、单选题(每题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] = 2,p = 2,p + 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 * b3 * 3.5 = 10.5,但a是 int 类型- 赋值给 int 变量时会发生隐式类型转换(截断小数部分),10.5 → 10
- 因此
a的实际值为 10,输出也是 10,而不是 10.5 - 这是整型与浮点型混合运算时的常见陷阱!
信息
- ID
- 4874
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 42
- 已通过
- 5
- 上传者