1 条题解
-
0
《星火征途》初赛模拟卷(五)
一、单选题(每题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==bc即1+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%6和10*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++ 标识符命名规则:
- 只能由字母(A-Z, a-z)、数字(0-9)和下划线(_)组成
- 第一个字符必须是字母或下划线,不能是数字
- 合法示例:
x321、_x321、x321_ - 非法示例:
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
- 上传者