2023 CCF非专业级别软件能力认证第一轮
(CSP-J1) 入门级 C++语言试题
认证时间:2023年9月16日09:30~11:30
一、单项选择题(每题2分,共计30分)
1.
在
C++
中,下面哪个关键字用于声明一个变量,其值不能被修改?(
)。
A. unsigned
B. const
C. static
D. mutable
【答案】B
【解析】
const
对象一旦被创建就不能修改其值,所以
const
对象必须进行初始化。
2.
八进制数
12345670(8)
和
07654321(8)
的和为(
)。
A. 22222221(8)
B. 21111111(8)
C. 22111111(8)
D. 22222211(8)
【答案】D
【解析】
直接按照八进制进行计算,即逢八进一。
3.
阅读下述代码,请问修改
data
的
value
成员以存储
3.14
,正确的方式是(
)。
union Data{
int num;
float value;
char symbol;
};
union Data
data
;
A.
data.value
= 3.14;
B.
value.data
= 3.14;
C. data->value = 3.14;
D. value->data = 3.14;
【答案】A
【解析】
union
即为联合,它是一种特殊的类。访问其成员变量和结构体类似,使用成员运算符
.
进行访问,即:联合类型变量名
.
成员变量名。
4.
假设有一个链表的节点定义如下:
struct Node {
int data;
Node* next;
};
现在有一个指向链表头部的指针:
Node* head
。如果想要在链表中插入一个新节点,其成员
data
的值为
42
,并使新节点成为链表的第一个节点,下面哪个操作是正确的?(
)
A. Node*
newNode
= new Node;
newNode
->data = 42;
newNode
->next = head; head =
newNode
;
B. Node*
newNode
= new Node; head->data = 42;
newNode
->next = head; head =
newNode
;
C. Node*
newNode
= new Node;
newNode
->data = 42; head->next =
newNode
;
D. Node*
newNode
= new Node;
newNode
->data = 42;
newNode
->next = head;
【答案】A
【解析】
因为
newNode
要成为第一个结点,所以
newNode
指向下一个的结点就是头结点,然后把
newNode
赋值给
head
,保证这一点即可。
5.
根节点的高度为
1
,一根拥有
2023
个节点的三叉树高度至少为(
)。
A. 6
B. 7
C. 8
D. 9
【答案】C
【解析】
问高度至少是多少,所以每层都要尽可能满,所以找第一个
的
i
,即为答案。
6.
小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息,则小明一共有(
)种选择时间段的方案。
A. 31
B. 18
C. 21
D. 33
【答案】B
【解析】
至少选择一个空闲时间段,且无法选择超过
3
个以上的空闲时间段,所以可以分为三类:
①选择一个空闲时间段,那么有
7
种方案;②选择两个空闲时间段,那么有
4+3+2+1=10
种方案;③选择三个空闲时间段,那么有
1
种方案;因此,一共有
7+10+1=18
种方案。
7.
以下关于高精度运算的说法错误的是(
)。
A.
高精度计算主要是用来处理大整数或需要保留多位小数的运算。
B.
大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。
C.
高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。
D.
高精度加法运算的关键在于逐位相加并处理进位。
【答案】C
【解析】
高精
*
高精的运算时间与参与运算的两个大整数的长度乘积有关。
8.
后缀表达式
“6 2 3 + - 3 8 2 / + * 2 ^ 3 +”
对应的中缀表达式是(
)
A. ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3
B. 6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3
C. (6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3
D. 6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3
【答案】A
【解析】
中缀表达式转后缀表达式的方法:
①将所有运算按照优先级加上小括号;②将所有运算符移到对应小括号的后面;③去掉小括号;可以按照上述方法,从选项进行推导容易得到答案为
A
。
9.
数
101010(2)
和
166(8)
的和为(
)。
A. 10110000(2)
B. 236(8)
C. 158(10)
D. A0(16)
【答案】D
【解析】
(101010)
2
+ (166)
8
= (42)
10
+ (118)
10
= (160)
10
,
(160)
10
=(10100000)
2
=(240)
8
=(A0)
16
。
10.
假设有一组字符
{
a,b,c,d,e,f
}
,对应的频率分别为
5%
,
9%
,
12%
,
13%
,
16%
,
45%
。请问以下哪个选项是字符
a,b,c,d,e,f
分别对应的一组哈夫曼编码?(
)
A. 1111
,
1110
,
101
,
100
,
110
,
0
B. 1010
,
1001
,
1000
,
011
,
010
,
00
C. 000
,
001
,
010
,
011
,
10
,
11
D. 1010
,
1011
,
110
,
111
,
00
,
01
【答案】A
【解析】
按照哈夫曼编码规则可以画出哈夫曼树,每个结点的哈夫曼编码如下图所示:
11.
给定一棵二叉树,其前序遍历结果为:
ABDECFG
,中序遍历结果为:
DEBACFG
。请问这棵树的正确后序遍历结果是什么?(
)
A. EDBGFCA
B. EDGBFCA
C. DEBGFCA
D. DBEGFCA
【答案】A
【解析】
可以根据前序
2023年信息学奥赛CSP-J普及组初赛C++真题