2023年12月真题
单选题(每题 2 分,共 30 分)
正确答案:a
解析:
- a: 变量名不能包含空格,因此 “ccf gesp” 是不合法的。
- b: “ccfgesp” 是合法的,合符变量命名规则,使用了大小写字母。
- c: “ccfgesp” 同样是合法的,使用了大小写字母,符合命名规则。
- d: “ccf_gesp” 使用了下划线和大写字母,这也是合法的。
正确答案:b
解析:
- a: 0 不正确,实际计算得1。
- b: 正确答案,按照操作符优先级计算得1。
- c: 2 不正确,实际计算得1。
- d: 3 不正确,实际计算得1。
正确答案:b
解析:
- a: 不正确,计算顺序颠倒,会导致天数和小时数错误。
- b: 正确的计算方式,正确处理小时数和天数的换算。
- c: 不正确,没有加上当前的时间10点。
- d: 不正确,10 / 24 结果为0,10 % 24 结果为10,无法正确计算时间。
正确答案:a
解析:
- a: 正确,判断条件符合偶数的定义。
- b: 语法错误,应为比较操作
==
而非赋值操作=
。 - c: 不正确,因为该条件判断奇数,而非偶数。
- d: 不正确,因为该条件判断奇数,而非偶数。
正确答案:b
解析:
- a: 如果输入的n是小于等于2的整数,第5行将输出0:不正确,对于n=2,输出为1。
- b: 如果输入的n是大于等于2的整数,第5行将输出n-1:正确,循环从1到n-1,共计n-1次。
- c: 如果输入的n是大于等于2的整数,第5行将输出n:不正确,输出应为n-1。
- d: 以上说法均不正确:不正确,选项b是正确的。
正确答案:c
解析:
- a: 不正确,循环执行次数少于10。
- b: 不正确,循环执行次数少于9。
- c: 正确,i从1开始,每次增加3,共执行3次。
- d: 不正确,循环执行次数多于1次。
正确答案:a
解析:
- a: 正确,总和为90。
- b: 不正确,总和达到90。
- c: 不正确,总和超过20。
- d: 不正确,总和超过10。
正确答案:c
解析:
- a: 不正确,循环执行次数少于11。
- b: 不正确,循环执行次数少于10。
- c: 正确,n从10开始,每次减2,共执行5次。
- d: 不正确,循环执行次数多于4次。
正确答案:d
解析:
- a: 不正确,只会在第一次满足条件时计数,错误。
- b: 不正确,只会在第一次和第二次满足条件时计数,错误。
- c: 语法错误,应为
cnt += 1
。 - d: 正确,计数器在每次满足条件时自增1。
正确答案:d
解析:
- a: 不正确,代码有错误。
- b: 不正确,代码有错误。
- c: 不正确,代码有错误。
- d: 正确,代码中访问未定义的变量
i
。
正确答案:b
解析:
- a: 不正确,计算错误。
- b: 正确,10 + 7 + 4 = 21。
- c: 不正确,计算错误。
- d: 不正确,计算错误。
正确答案:d
解析:
- a: 正确,合法的类型转换和赋值。
- b: 正确,合法的类型转换和赋值。
- c: 正确,合法的类型转换和赋值。
- d: 不正确,缺少括号,语法错误。
正确答案:b. 3 5
解析:
- a. 3:不正确,‘c’ 输出后没有 break,将继续执行下一个 case。
- b. 3 5:正确,‘c’ 的 case 输出 3,继续执行 ‘d’ 的 case,输出 5。
- c. 3 5 9:不正确,执行到 ‘d’ 的 case 时,遇到 break,跳出 switch。
- d. 以上都不对:不正确,b 选项是正确的。
正确答案:c
解析:
- a: 不正确,麦克风用于接收语音指令,是必须的。
- b: 不正确,扬声器用于提供语音反馈,是必须的。
- c: 正确,油量表仅用于显示油量,不直接影响选路。
- d: 不正确,传感器用于感知环境,是必须的。
正确答案:b
解析:
- a: 不正确,图灵是计算机科学的奠基人之一,但现代计算机体系结构主要基于冯·诺依曼的设计。
- b: 正确,冯·诺依曼体系结构是现代计算机的基础设计。
- c: 不正确,阿塔纳索夫设计了早期的电子计算机,但其结构未广泛应用于现代计算机。
- d: 不正确,尽管他们是eniac计算机的设计者,但现代计算机体系结构主要基于冯·诺依曼的设计。
二、判断题(每题2分,共20分)
正确答案:√
解析:
- c++中的
int(3.14)
会将浮点数3.14转换为整数3。
正确答案:×
解析:
- 逗号运算符返回最后一个表达式的值,所以
cout << (2 * 3, 3 % 10, 2 + 3)
实际输出为5。
正确答案:×
解析:
i
的值依次为1、4、7,当i
达到10时不满足i < 10
,循环结束,所以i
的值不会达到10。
正确答案:×
解析:
- 前导0表示八进制,所以
010
为八进制的10,即十进制的8,001
为八进制的1,所以表达式的值为8 + 100 + 1 = 109。
正确答案:√
解析:
- 在c++中,if语句的条件表达式可以是int类型,非零值为真,零为假。
正确答案:√
解析:
while(1)
是一个无限循环,continue
语句会使得控制流直接回到循环的开头,因此会导致死循环。
正确答案:×
解析:
'1'+'1'
的ascii值相加等于98,不等于字符’2’的ascii值50,因此表达式('1'+'1'=='2'? flag=1:flag=2)
的结果是flag=2
,与flag==2
的结果不同。
正确答案:×
解析:
scanf
不是c++的关键字,可以用作变量名,尽管不建议这样做以避免混淆。
正确答案:×
解析:
- dev c++ 是一个集成开发环境(ide),不是操作系统。
正确答案:√
解析:
- 所有的
while
循环都可以通过for
循环的初始化、条件和递增部分来实现,因此可以相互转换。
三、编程题(每题25分,共50分)
3.1 编程题 1 (小杨的考试)
3.1.1 问题描述
今天是星期 x,小杨还有 n 天就要考试了,你能推算出小杨考试那天是星期几吗?(本题中使用 7 表示星期日)
3.1.2 输入描述
输入 2 行,第 1 行一个整数 x(1 ≤ x ≤ 7);第 2 行一个整数 n(1 ≤ n ≤ 364)。
3.1.3 输出描述
输出一个整数,表示小杨考试那天是星期几。
3.1.4 特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
3.1.5 样例输入 1
1
6
3.1.6 样例输出 1
7
3.1.7 样例解释 1
今天是星期 1,那么 6 天后就是星期日,星期日在本题中用 7 表示。
3.1.8 样例输入 2
5
3
3.1.9 样例输出 2
1
3.1.10 样例解释 2
今天是星期 5,那么 3 天后就是星期 1。
3.1.11 参考程序
#include <stdio.h>
int main(int argc, char **argv) {
int x, n;
// 从标准输入读取两个整数,表示今天是星期几和还有几天考试
scanf("%d%d", &x, &n);
// 计算考试那天是星期几,并输出结果
printf("%d\n", (x - 1 + n % 7) % 7 + 1);
return 0;
}
解释:
-
读取输入:
- 程序从标准输入读取两个整数,分别是
x
和n
。x
表示今天是星期几,n
表示还有多少天就是考试日。
- 程序从标准输入读取两个整数,分别是
-
公式推导:
- 由于一周有 7 天,我们可以利用模运算来简化计算。例如,今天是星期
x
,再过n
天的情况可以用(x + n)
来表示星期几。 - 但是直接用
(x + n)
可能会超出 7,因此需要取模(x + n) % 7
来将值保持在 1 到 7 之间。 - 具体公式为
(x - 1 + n % 7) % 7 + 1
,其中:x - 1
是将x
转换为从 0 开始的索引(即x
为 1 时,代表第 0 天)。n % 7
是计算n
天后是几天内的第几天(避免超过一周)。(x - 1 + n % 7) % 7
计算从 0 开始的索引,得到一个在 0 到 6 范围内的值。- 最后再加
1
将索引转换回从 1 开始的星期几表示。
- 由于一周有 7 天,我们可以利用模运算来简化计算。例如,今天是星期
-
输出结果:
- 将计算结果输出,即考试当天是星期几。
详细解释计算过程:
- 如果今天是星期
x
,距离考试还有n
天,那么我们可以通过x + n
计算出考试日的星期几。 - 例如,今天是星期 1,距离考试还有 6 天,则
1 + 6 = 7
,即星期日(7 表示星期日)。 - 由于一周只有 7 天,所以需要对总天数取模运算以确保结果在 1 到 7 之间。
- 公式
(x - 1 + n % 7) % 7 + 1
通过转换和取模确保结果在正确范围内。
通过这种方式,程序能够准确地计算出小杨考试当天是星期几,并输出结果。
3.2 编程题 2 (小杨报数)
3.2.1 问题描述
小杨需要从 1 到 n 报数。在报数过程中,小杨希望跳过 m 的倍数。例如,如果 n 为 5,m 为 2,那么小杨就需要依次报出 1、3、5。
现在,请你依次输出小杨报的数。
3.2.2 输入描述
输入 2 行,第 1 行一个整数 n(1 ≤ n ≤ 100);第 2 行一个整数 m(1 ≤ m ≤ 10)。
3.2.3 输出描述
输出若干行,依次表示小杨报的数。
3.2.4 特别提醒
在常规程序中,输入、输出时提供提示是好习惯。但在本场考试中,由于系统限定,请不要在输入、输出中附带任何提示信息。
3.2.5 样例输入 1
5
2
3.2.6 样例输出 1
1
3
5
3.2.7 样例输入 2
10
3
3.2.8 样例输出 2
1
2
4
5
7
8
10
3.2.9 参考程序
#include <stdio.h>
int main(int argc, char **argv) {
int n, m, i;
// 从标准输入读取两个整数,表示报数的范围和需要跳过的倍数
scanf("%d%d", &n, &m);
// 从1到n进行循环
for(i = 1; i <= n; i++) {
// 如果i不是m的倍数,输出i
if(i % m != 0) {
printf("%d\n", i);
}
}
return 0;
}
解释:
-
读取输入:
- 程序从标准输入读取两个整数,分别是
n
和m
。n
表示报数的范围,m
表示需要跳过的倍数。
- 程序从标准输入读取两个整数,分别是
-
循环处理:
- 使用一个
for
循环从 1 到n
进行遍历。 - 在循环中,使用
if
条件判断i
是否是m
的倍数,即i % m != 0
。如果i
不是m
的倍数,则输出i
。
- 使用一个
-
输出结果:
- 将所有满足条件的数逐行输出,即小杨报的数。
详细解释计算过程:
-
例如,输入
n = 5
和m = 2
时:- 循环从 1 开始到 5:
1 % 2 != 0
,输出 1。2 % 2 == 0
,跳过 2。3 % 2 != 0
,输出 3。4 % 2 == 0
,跳过 4。5 % 2 != 0
,输出 5。
- 输出结果为 1, 3, 5。
- 循环从 1 开始到 5:
-
通过这种方式,程序能够准确地输出小杨报的数,跳过指定倍数的数。
发表评论