2024年6月15日发(作者:逯皓君)
2023 CCF 非专业级别软件能力认证第一轮
(CSP-J1)入门级 C++语言试题
认证时间:2023 年 9 月 16 日 09:30~11:30
考生注意事项:
试题纸共有 10 页,答题纸共有 1 页,满分 100 分。请在答题纸上作答,
写在试题纸上的
一律无效。
不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资
料。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确
选项)
1. 在 C++中,下面哪个关键字用于声明一个变量,其值不能被修改?()
A. unsigned
B. const
C. static
D. mutable
解析:B
因为其它几个声明的变量,其值都是可以修改的。只有const声明的常量其值只
能在声明时赋值一次。
2. 八进制数12345670
8
和07654321
8
的和为()
A.22222221
8
B.21111111
8
C.22111111
8
D.22222211
8
解析:D
进行加法运算,满8进1。
3. 阅读下述代码,请问修改 data 的value 成员以存3.14,正的方式是()
union Data{
int num;
float value;
char symbol;
};
union Data data;
= 3.14;
= 3.14;
->value = 3.14;
->data = 3.14;
第 1 页 共 13 页
解析:A
声明了一个联合体,类似于结构体的数据类型,然后声明了变量data,此时调
用其成员变量的方式是采用点号。如果采用的是指针,则必须使用箭头了。
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; newode->data = 42; head-next = newNode;
D. Node* newNode = new Node; newNode->data = 2; newNode->next = head;
解析:A
声明新结点,并赋值42,然后将其next指针指向head,再让head等于新结点。
5. 根节点的高度为1,一棵有 2023 个节点的三叉树高度至少为()
A.6
B.7
C.8
D.9
解析:C
三叉树,自树根向下,每一层的结点数为3的x次方。3的7次方是2187,明显
超过了上面的结点总数,前面0~6层之和不会超过2023,故至少要到7这一层,
而树根高度为1,故有8层。
6. 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,
但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他体息,则小明一共有()
种选择时间段的方案。
A.31
B.18
C.21
D.33
解析:B
分3种情况,选1个的情况,任选,故有C(7,1)个。
选2个的情况,去掉两个之后任选,故有C(5,2)个。
选3个的情况,去掉四个之后任选,故有C(3,3)个。
求和即可。7+10+1=18。
第 2 页 共 13 页
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
画出树形结构
9. 数101010₂和166
8
的和为()
A.10110000
2
B.236
8
C.158
10
D.A0
16
解析:D
将非相同进制的两数转换为同一进制,然后进行运算,之后再与给出的4个结果
去比对,选出正确答案即可。
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,11
D.1010,1011,110,111,00,01
解析:A
首先建立一棵哈夫曼树,但是在建树的过程中,如果严格按照 左小右大 的规则
去建树,则最终出现的树其编码会与给出的有所不同,所以在左右子树的问题上,
不必严格纠结是放左还是放右。
第 3 页 共 13 页
11. 给定一棵二叉树,其前序遍历结果为:ABDECFG,中序通历结果为:请问这模DEBACFG。树
的正确后序遍历结果是什么?()
A
A
A
A
解析:A
画出树形结构,进行后序遍历即可。
12. 考虑一个有向无环图,该图包含4条有向边:(1,2),(1,3),(2,4)和(3,4)。以下哪个选项是
这个有向无环图的一个有效的拓扑排序?()
A.4,2,3,1
B.1,2,3,4
C.1,2,4,3
D.2,1,3,4
解析:B
拓扑排序的方法,是检测有向图中是否有环。具体操作为首先找到入度为0的结
点,然后将结点和发出的边同时去掉,依次按照以上方法来进行。可见当去除结
点1时,结点2和3同时都是入度为0了,所以有向图的拓扑排序并不是只有一
种。
第 4 页 共 13 页
如果拓扑排序完成的时候,所有结点全都在拓扑排序中了,则有向图必然无环,
反之则有环。
13. 在计算机中,以下哪个选项描述的数据存储容量最小?()
A.字节(byte)
B.比特(bit)
C.字(word)
D.千字节(kilobyte)
解析:B
数据存储的最小单位是bit,基本单位是byte。
14. 一个班级有10个男生和12个女生。如果要选出一个3人的小组,并且小组中必须至少
包含1个女生,那么有多少种可能的组合?()
A.1420
B.1770
C.1540
D.2200
解析:A
采用排异法来解题,共有22个人,选出3人的组合数是C(22,3),只有男生不
含女生的情况有C(10,3)个,所以减掉就可以了。
C(22,3)-C(10,3)=1540-120=1420。
15. 以下哪个不是操作系线?
s
d
解析:D
其它选项都是操作系统,只有D是一种语言,称为超文本标记语言,全称英文是
Hyper Text Markup Language。
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错
误填×;除特 殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
(1) 程序阅读一:
01 #include
02 #include
03 using namespace std;
04
05 double f(double a,double b,double c){
06 double s = (a+b+c)/2;
07 return sqrt(s*(s-a)*(s-b)*(s-c));
08 }
第 5 页 共 13 页
09
10
11
12
13
14
15
16
17
18
int main(){
(ios::fixed);
ion(4);
int a,b,c;
cin >> a >> b >> c;
cout << f(a,b,c) << endl;
return 0;
}
程序解析:
本程序就是一道海伦公式计算三角形面积的程序。
假设输入的所有数都为不超过 1000 的正整数,完成下面的判断题和单选题:
判断题
16. (2分)当输入为“2 2 2”时,输出为“1.7321”。( )
解析:对
三角形的三条边分别是2 2 2 ,三角形周长的一半是3,根据海伦公式面积为
3*(3-2)*(3-2)*(3-2)开方的结果,3开放结果是1.7321(保留4位小数)。
17. (2分)将第 6 行中的“(s-b)*(s-c)”改为“(s-c)*(s-b)”不会影响程序运行的结果。( )
解析:对
显而易见,乘法的因数先后位置不影响计算结果。
18. (2分)程序总是输出四位小数。( )
解析:对
因为程序做了输出控制,ion(4)。
单选题
D.“30.0000”
19. 当输入为“3 4 5”时,输出为( )。
A.“6.0000” B.“12.0000” C.“24.0000”
解析:A
很明显这是一个直角三角形,其两直角边为3和4,则面积为(3*4)/2,结果保
留4位小数是6.0000
20. 当输入为“5 12 13”时,输出为( )。
A.“24.0000” B.“30.0000” C.“60.0000” D.“120.0000”
解析:B
第 6 页 共 13 页
这很明显也是一个直角三角形,两直角边的平方和=斜边的平方,即25+144=169。
所以其面积为5*12/2=30,保留四位小数是30.0000,无需通过海伦公式也能计
算得出。
(2) 程序阅读二:
01 #include
02 #include
03 #include
04 using namespace std;
05
06 int f(string x,string y){
07 int m = ();
08 int n = ();
09 vector
10 for(int i= 1;i <= m; i++){
11 for(int j = 1;j <= n; j++){
12 if(x[i-1] == y[j-1]){
13 v[i][j]=v[i-1][j-1]+1;
14 }else{
15 v[i][j] = max(v[i-1][j],v[i][j-1]);
16 }
17 }
18 }
19 return v[m][n];
20 }
21
22 bool g(string x,string y){
23 if(() != ()){
24 return false;
25 }
26 return f(x+x, y) == ();
27 }
28
29 int main(){
30 string x,y;
31 cin>>x>>y;
32 cout< 33 return 0; 34 } 解析:此程序中f函数是用于统计输入的两个字符串的最长公共子串的长度。 假设输入的 n、m 均是不超过 100 的正整数,完成下面的判断题和单选题: 第 7 页 共 13 页
2024年6月15日发(作者:逯皓君)
2023 CCF 非专业级别软件能力认证第一轮
(CSP-J1)入门级 C++语言试题
认证时间:2023 年 9 月 16 日 09:30~11:30
考生注意事项:
试题纸共有 10 页,答题纸共有 1 页,满分 100 分。请在答题纸上作答,
写在试题纸上的
一律无效。
不得使用任何电子设备(如计算器、手机、电子词典等)或查阅任何书籍资
料。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确
选项)
1. 在 C++中,下面哪个关键字用于声明一个变量,其值不能被修改?()
A. unsigned
B. const
C. static
D. mutable
解析:B
因为其它几个声明的变量,其值都是可以修改的。只有const声明的常量其值只
能在声明时赋值一次。
2. 八进制数12345670
8
和07654321
8
的和为()
A.22222221
8
B.21111111
8
C.22111111
8
D.22222211
8
解析:D
进行加法运算,满8进1。
3. 阅读下述代码,请问修改 data 的value 成员以存3.14,正的方式是()
union Data{
int num;
float value;
char symbol;
};
union Data data;
= 3.14;
= 3.14;
->value = 3.14;
->data = 3.14;
第 1 页 共 13 页
解析:A
声明了一个联合体,类似于结构体的数据类型,然后声明了变量data,此时调
用其成员变量的方式是采用点号。如果采用的是指针,则必须使用箭头了。
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; newode->data = 42; head-next = newNode;
D. Node* newNode = new Node; newNode->data = 2; newNode->next = head;
解析:A
声明新结点,并赋值42,然后将其next指针指向head,再让head等于新结点。
5. 根节点的高度为1,一棵有 2023 个节点的三叉树高度至少为()
A.6
B.7
C.8
D.9
解析:C
三叉树,自树根向下,每一层的结点数为3的x次方。3的7次方是2187,明显
超过了上面的结点总数,前面0~6层之和不会超过2023,故至少要到7这一层,
而树根高度为1,故有8层。
6. 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,
但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他体息,则小明一共有()
种选择时间段的方案。
A.31
B.18
C.21
D.33
解析:B
分3种情况,选1个的情况,任选,故有C(7,1)个。
选2个的情况,去掉两个之后任选,故有C(5,2)个。
选3个的情况,去掉四个之后任选,故有C(3,3)个。
求和即可。7+10+1=18。
第 2 页 共 13 页
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
画出树形结构
9. 数101010₂和166
8
的和为()
A.10110000
2
B.236
8
C.158
10
D.A0
16
解析:D
将非相同进制的两数转换为同一进制,然后进行运算,之后再与给出的4个结果
去比对,选出正确答案即可。
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,11
D.1010,1011,110,111,00,01
解析:A
首先建立一棵哈夫曼树,但是在建树的过程中,如果严格按照 左小右大 的规则
去建树,则最终出现的树其编码会与给出的有所不同,所以在左右子树的问题上,
不必严格纠结是放左还是放右。
第 3 页 共 13 页
11. 给定一棵二叉树,其前序遍历结果为:ABDECFG,中序通历结果为:请问这模DEBACFG。树
的正确后序遍历结果是什么?()
A
A
A
A
解析:A
画出树形结构,进行后序遍历即可。
12. 考虑一个有向无环图,该图包含4条有向边:(1,2),(1,3),(2,4)和(3,4)。以下哪个选项是
这个有向无环图的一个有效的拓扑排序?()
A.4,2,3,1
B.1,2,3,4
C.1,2,4,3
D.2,1,3,4
解析:B
拓扑排序的方法,是检测有向图中是否有环。具体操作为首先找到入度为0的结
点,然后将结点和发出的边同时去掉,依次按照以上方法来进行。可见当去除结
点1时,结点2和3同时都是入度为0了,所以有向图的拓扑排序并不是只有一
种。
第 4 页 共 13 页
如果拓扑排序完成的时候,所有结点全都在拓扑排序中了,则有向图必然无环,
反之则有环。
13. 在计算机中,以下哪个选项描述的数据存储容量最小?()
A.字节(byte)
B.比特(bit)
C.字(word)
D.千字节(kilobyte)
解析:B
数据存储的最小单位是bit,基本单位是byte。
14. 一个班级有10个男生和12个女生。如果要选出一个3人的小组,并且小组中必须至少
包含1个女生,那么有多少种可能的组合?()
A.1420
B.1770
C.1540
D.2200
解析:A
采用排异法来解题,共有22个人,选出3人的组合数是C(22,3),只有男生不
含女生的情况有C(10,3)个,所以减掉就可以了。
C(22,3)-C(10,3)=1540-120=1420。
15. 以下哪个不是操作系线?
s
d
解析:D
其它选项都是操作系统,只有D是一种语言,称为超文本标记语言,全称英文是
Hyper Text Markup Language。
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错
误填×;除特 殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
(1) 程序阅读一:
01 #include
02 #include
03 using namespace std;
04
05 double f(double a,double b,double c){
06 double s = (a+b+c)/2;
07 return sqrt(s*(s-a)*(s-b)*(s-c));
08 }
第 5 页 共 13 页
09
10
11
12
13
14
15
16
17
18
int main(){
(ios::fixed);
ion(4);
int a,b,c;
cin >> a >> b >> c;
cout << f(a,b,c) << endl;
return 0;
}
程序解析:
本程序就是一道海伦公式计算三角形面积的程序。
假设输入的所有数都为不超过 1000 的正整数,完成下面的判断题和单选题:
判断题
16. (2分)当输入为“2 2 2”时,输出为“1.7321”。( )
解析:对
三角形的三条边分别是2 2 2 ,三角形周长的一半是3,根据海伦公式面积为
3*(3-2)*(3-2)*(3-2)开方的结果,3开放结果是1.7321(保留4位小数)。
17. (2分)将第 6 行中的“(s-b)*(s-c)”改为“(s-c)*(s-b)”不会影响程序运行的结果。( )
解析:对
显而易见,乘法的因数先后位置不影响计算结果。
18. (2分)程序总是输出四位小数。( )
解析:对
因为程序做了输出控制,ion(4)。
单选题
D.“30.0000”
19. 当输入为“3 4 5”时,输出为( )。
A.“6.0000” B.“12.0000” C.“24.0000”
解析:A
很明显这是一个直角三角形,其两直角边为3和4,则面积为(3*4)/2,结果保
留4位小数是6.0000
20. 当输入为“5 12 13”时,输出为( )。
A.“24.0000” B.“30.0000” C.“60.0000” D.“120.0000”
解析:B
第 6 页 共 13 页
这很明显也是一个直角三角形,两直角边的平方和=斜边的平方,即25+144=169。
所以其面积为5*12/2=30,保留四位小数是30.0000,无需通过海伦公式也能计
算得出。
(2) 程序阅读二:
01 #include
02 #include
03 #include
04 using namespace std;
05
06 int f(string x,string y){
07 int m = ();
08 int n = ();
09 vector
10 for(int i= 1;i <= m; i++){
11 for(int j = 1;j <= n; j++){
12 if(x[i-1] == y[j-1]){
13 v[i][j]=v[i-1][j-1]+1;
14 }else{
15 v[i][j] = max(v[i-1][j],v[i][j-1]);
16 }
17 }
18 }
19 return v[m][n];
20 }
21
22 bool g(string x,string y){
23 if(() != ()){
24 return false;
25 }
26 return f(x+x, y) == ();
27 }
28
29 int main(){
30 string x,y;
31 cin>>x>>y;
32 cout< 33 return 0; 34 } 解析:此程序中f函数是用于统计输入的两个字符串的最长公共子串的长度。 假设输入的 n、m 均是不超过 100 的正整数,完成下面的判断题和单选题: 第 7 页 共 13 页