目录
卷头
基础题
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
阅读程序
1、
16.
17.
18.
19.
20.
2、
21.
22.
23.
24.
25.
26.
3、
27
28
29
30
31
32
完善程序
1、
33 ①处应填()
34 ②处应填()
35 ③处应填()
36 ④处应填()
37 ⑤处应填()
2、
38 ①处应填()
39 ②处应填()
40 ③处应填()
41 ④处应填()
42 ⑤处应填()
卷头
2023CCF非专业级别软件能力认证第一轮
(CSP-J1) 入门级C++语言试题
认证时间:2023年9月16日09:30~11:30
考生注意事项:
试题纸共有10页,答题纸有一页,满分100分。请在答题纸上作答,写在试题纸上的一律无效。
不得使用任何电子设备(如计算机,手机,电子词典等)或查阅任何书籍资料。
基础题
1
在 C++ 中,下面哪个关键字用于声明一个变量, 其值不能被修改?
A unsigned
B const
C static
D mutable
答案: B. const
解析:在C++中, const为常量。
2
八进制数123456708和076543218 的和为
A (22222221)8
B (21111111)8
C (22111111)8
D (22222211)8
答案: D. (22222211)8
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. data.value =3.14;
基础题,自己翻书去。
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;
5
链表的前插法,自己在纸上模拟一下即可。
根节点的高度为1 ,一棵拥有2023个节点的三叉树高度至少为()。
A 6
B 7
C 8
D 9
答案: C
算上根节点1.
3^(7+1)
6
小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两 个空闲的时间段让他休息。则小明一共有()种选择时间段的方案。
A 31
B 18
C 21
D 33
答案: B. 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+33+8/2^2+3
C (6-(2+3))((3+8/2)^2)+3
D 6-((2+3)(3+8/2))^2+3
答案: A.
二叉树绘画(后续)->中序
9
数1010102和1668的和为 ( )
A (10110000)2
B (236)8
C (158)10
D (A0)16
答案是 D (A0)16
解析
首先将二进制数101010(2)转换为十六进制得到A(16),然后将八进制数166(8)转换为十六进制得到0(16),最后将A和0相加得到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 EDBGCFA
C DEBGFCA
D DBEGFCA
答案: 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
傻瓜题,不讲了。
13
在计算机中,以下哪个选项描述的数据存储容量最小()
A 字节 (byte)
B 比特 (bit)
C 字 (word)
D 千字节(kilobyte)
答案: B
解析
傻瓜题,不讲了,不会的建议24年别考了,考了成绩会很难看。
14
一个班级有10个男生和12个女生。如果要选出一个3人的小组,并且小组中必须至少包含1个女生,那么有多少种可能的组合?()
A 1420
B 1770
C 1540
D 2200
答案: A
C(22, 3) - C(10, 3) = 1420。
15
以下哪个不是操作系统?()
A Linux
B Windows
C Android
D HTML
答案: D
傻瓜题,不讲了,不会的建议24年别考了。
阅读程序
1、
01 #include<iostream>02 #include<cmath>03 using namespace std;0405 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 }0910 int main(){11 cout.flags(ios::fixed);12 cout.precision(4);1314 int a,b,c;15 cin>>a>>b>>c;16 cout<<f(a,b,c)<<endl;17 return 0;18 }
以下是对程序的判断题和单选题的解析:
判断题:
16.
(2分) 当输入为“2 2 2”时,输出为“1.7321” ()
17.
(2分) 将第7行中的“(s - b) * (s - c)”改为“(s - c) * (s - b)”不会影响程序运行的结果()
18.
(2分) 程序总是输出四位小数。()
单选题:
19.
当输入为“3 4 5”时,输出为()
?选项我就不给了,这里各位可以当作填空题做
答案:A. “6.0000”
形的面积,因此输出为6.0000。
20.
当输入为“5 12 13”时,输出为()
答案:TTFAB
2、
01 #include<iostream>02 #include<vector>03 #include<algorithm>04 using namespace std;0506 int f(string x,string y){07 int m=x.size();08 int n=y.size();09 vector<vector<int>>v(m+1,vector<int>(n+1,0));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 }2122 bool g(string x,string y){23 if(x.size() != y.size()){24 return false;25 }26 return f(x+x,y)==y.size();27 }2829 int main(){30 string x,y;31 cin>>x>>y;32 cout<<g(x,y)<<endl;33 return 0;34 }
判断题:
21.
f函数的返回值小于等于min(n,m)。 (√)
答案:正确。
22.
f函数的返回值等于两个输入字符串的最长公共子串的长度。 (×)
23.
当输入两个完全相同的字符串时,g函数的返回值总是true。 (√)
单选题:
24.
将第19行中的“v[m][n]”替换为“v[n][m]”,那么该程序()。
A. 行为不变
B. 只会改变输出
C. 一定非正常退出
D. 可能非正常退出
25.
当输入为“csp-j p-jcs”时,输出为()。
A. “0”
B. “1”
C. “T”
D. “F”
26.
当输入为“csppscspsccp”时,输出为()。
A. “T”
B. “F”
C. “0”
D. “1”
答案:TFTDBA
主打一个傻瓜题,只需要考你基本的程序理解还有布尔值和cout
3、
01 #include <iostream>02 #include <cmath>03 using namespace std;0405 int solve1(int n){06 return n*n;07 }0809 int solve2(int n){10 int sum=0;11 for(int i=1;i<=sqrt(n);i++){12 if(n%i==0){13 if(n/i==i){14 sum+=i*i;15 }else{16 sum+=i*i+(n/i)*(n/i);17 }18 }19 }20 return sum;21 }2223 int main(){24 int n;25 cin>>n;26 cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;27 return 0;28 }
假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。
27
如果输入的n为正整数, solve2函数的作用是计算n所有的因子的平方和()
答案:正确。
28
第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次()
答案:正确。
29
如果输入的n为质数, solve2( n)的返回值为n^2+1 ()
答案:正确。
30
如果输入的n为质数p的平方,那么solve2( n)的返回值为()
答案: B
31
当输入为正整数时,第一项减去第二项的差值一定()
答案: D. 小于等于0且不一定小于0
32
当输入为“5”时,输出为()
答案: C. “651 676”
完善程序
1、
(寻找被移除的元素)问题:原有长度为 n+1公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的开序数组可能不 再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出被移除的元素。试补全程序。
01 #include <iostream02 #include <vector>0304 using namespace std;0506 int find missing(vector<int>& nums) {07 int left = 0, right = nums.size() - 1;08while (left < right){09 int mid = left + (right left) / 2;10 if (nums[mid] == mid+ ① ) {11 ②;12 }else{13 ③14 }15 }16 return ④;17 }1819 int main() {20 int n;21 cin >> n;22 vector<int> nums(n);23 for (int i= 0; i< n; i++) cin >> nums[i];24 int missing_number = find_missing(nums);25 if_(missing_number == ⑤ ) {26 cout << "Sequence is consecutive" << endl;27 }else{28 cout << "Missing number is " << ,missing numbeer << endl;29 }30 return 0;31 }
33 ①处应填()
A. 1 B.nums[0] C.right D.left
34 ②处应填()
A. left=mid+1 B.right=mid-1 C.right=mid D.left=mid
35 ③处应填()
A.left=mid+1 B.right=mid-1 C.right=mid D.left=mid
36 ④处应填()
A.left+nums[0] B.right+nums[0] C.mid+nums[0] D.right+1
37 ⑤处应填()
A.nums[0]+n B.nums[0]+n-1 C.nums[0]+n+1 D.nums[n-1]
答案:BACAD
2、
(DP)
(编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace), 一个字符,求将第一个字符串转 换为第二个字符串所需要的最少操作次数。
试补全动态规划算法。
01 #include <iostream>02 #include <string>03 #include <vector>04 using namespace std;0506 int min(int x, int y, int z) {07 return min(min(x, y), z);08 }0910 int edit_dist_dp(string str1, string str2) {11 int m = str1.length();12 int n = str2.length();13 vector<vector<int>> dp(m + 1, vector<int>(n + 1));14 15 for (int i = 0; i <= m; i++) {16 for (int j = 0; j <= n; j++) {17 if (i == 0)18 dp[i][j] = ①;19 else if (j == 0)20 dp[i][j] = ②;21 else if ( ③ )22 dp[i][j] = ④;23 else24 dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤);25 }26 }27 return dp[m][n];28 }2930 int main() {31 string str1, str2;32 cin >> str1 >> str2;33 cout << "Minimum number of operations: "34 << edit_dist_dp(str1, str2) << endl;35 return 0;36 }
38 ①处应填()
A.j B.i C.m D.n
39 ②处应填()
A.j B.i C.m D.n
40 ③处应填()
A. str1[i-1]==str2[j-1] B. str1[i]==str2[j]
C. str1[i-1]!=str2[j-1] D. str1[i]!=str2[j]
41 ④处应填()
A. dp[i-1][j-1]+1 B. dp[i-1][j-1]
C. dp[i-1][j] D. dp[i][j-1]
42 ⑤处应填()
A. dp[i][j] + 1 B. dp[i-1][j-1]+1
C. dp[i-1][j-1] D. dp[i][j]
答案:ABABC