外观
2023年9月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | B | A | C | D | D | B | A | B | B | C | C | A | A | D | C |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 人们所使用的手机上安装的App通常指的是()。
A. 一款操作系统
B. 一款应用软件
C. 一种通话设备
D. 以上都不对
查看解析
答案:B
考纲知识点: 计算机基础知识
解析: App是Application的缩写,指的是应用软件,如微信、抖音等。操作系统是管理手机硬件和软件资源的系统软件,如Android或iOS。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 下列流程图的输出结果是?()
A. 9
B. 7
C. 5
D. 11
查看解析
答案:A
考纲知识点: 流程图理解
解析: 根据流程图逻辑,初始值为3,经过循环和条件判断后,最终输出结果为9。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 对包含n个元素的数组进行冒泡排序,平均时间复杂度一般为()。
A. O(n)
B. O(n log n)
C. O(n^2)
D. 以上都不正确
查看解析
答案:C
考纲知识点: 算法复杂度
解析: 冒泡排序需要进行n-1轮比较,每轮比较n-i次,因此平均时间复杂度为O(n^2)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下列关于C++语言中指针的叙述,不正确的是()。
A. 可以定义指向int类型的指针。
B. 可以定义指向自定义结构体类型的指针。
C. 自定义结构体类型可以包含指针类型的元素。
D. 不能定义指向void类型的指针,那没有意义。
查看解析
答案:D
考纲知识点: 指针
解析: C++中可以定义void*类型的指针,它可以指向任何类型的数据,因此D选项是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下列关于C++语言中数组的叙述,不正确的是()。
A. 一维数组可以用来表示数列。
B. 二维数组可以用来表示矩阵。
C. 三维数组可以用来表示空间中物体的形状。
D. 世界是三维的,所以定义四维数组没有意义。
查看解析
答案:D
考纲知识点: 数组
解析: 四维数组在某些应用场景(如科学计算)中是有意义的,例如表示三维空间随时间的变化。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下列关于C++语言中函数的叙述,正确的是()。
A. 函数调用前必须定义。
B. 函数调用时必须提供足够的实际参数。
C. 函数定义前必须声明。
D. 函数声明只能写在函数调用前。
查看解析
答案:B
考纲知识点: 函数
解析: 函数调用时必须提供与形参数量和类型匹配的实际参数。函数可以在调用前声明,不一定需要定义。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 下列关于C++语言中函数的叙述,不正确的是()。
A. 两个函数的声明可以相同。
B. 两个函数的局部变量可以重名。
C. 两个函数的参数可以重名。
D. 两个函数可以重名。
查看解析
答案:A
考纲知识点: 函数重载
解析: 两个函数的声明不能完全相同,否则会引起编译错误。函数可以重名(重载),只要参数列表不同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 一个二维数组定义为char array[3][10],则这个二维数组占用内存的大小为()。
A. 10
B. 30
C. 32
D. 48
查看解析
答案:B
考纲知识点: 数组内存
解析: char类型占1字节,array[3][10]共有3*10=30个元素,因此占用30字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 如果n为int类型的变量,一个指针变量定义为int *p = &n,则下列说法正确的是()。
A. 指针变量p的值与变量n是相同的。
B. 指针变量p的值与变量n的地址是相同的。
C. 指针变量p指向的值为n。
D. 指针变量p指向的值与变量n的地址是相同的。
查看解析
答案:B
考纲知识点: 指针
解析: p是一个指针,存储的是变量n的地址,因此p的值与n的地址相同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 一个三维数组定义为long long array[6][6][6],则array[1][2][3]和array[3][2][1]在内存中的位置相差多少字节?()
A. 70字节
B. 198字节
C. 560字节
D. 无法确定
查看解析
答案:C
考纲知识点: 数组内存布局
解析: long long占8字节,array[1][2][3]和array[3][2][1]的位置差为(3-1)*6*6 + (2-2)*6 + (1-3) = 70个元素,共70*8=560字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 如果a为int类型的变量,且a的值为6,则执行a = -a之后,a的值会是()。
A. -6
B. 6
C. -7
D. 7
查看解析
答案:A
考纲知识点: 运算符
解析: -a表示取a的相反数,因此a的值变为-6。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 一个数组定义为int a[5] = {1,2,3,4,5},一个指针定义为int *p = &a[2],则执行*p = a[1]后,数组a中的值会变为()。
A. {1,2,2,4,5}
B. {1,3,3,4,5}
C. {1,2,3,3,5}
D. {1,2,4,4,5}
查看解析
答案:A
考纲知识点: 指针与数组
解析: *p指向a[2],执行*p = a[1]即将a[1]的值2赋给a[2],因此数组变为{1,2,2,4,5}。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 下列关于C++语言中异常处理的叙述,正确的是()。
A. 一个try子句可以有多个catch子句与之对应。
B. 如果try子句在执行时发生异常,就一定会进入某一个catch子句执行。
C. 如果try子句中没有可能发生异常的语句,会产生编译错误。
D. catch子句处理异常后,会重新执行与之对应的try子句。
查看解析
答案:A
考纲知识点: 异常处理
解析: try子句可以有多个catch子句处理不同类型的异常。如果没有匹配的catch子句,程序会终止。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 执行以下C++语言程序后,输出结果是()。
cpp
#include <iostream>
using namespace std;
int main() {
int fib[10];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i < 10; i++)
fib[i] = fib[i - 1] + fib[i - 2];
cout << fib[10] << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
A. 0
B. 5
C. 55
D. 无法确定
查看解析
答案:D
考纲知识点: 数组越界
解析: 数组fib的下标范围是0~9,fib[10]越界,输出结果无法确定。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 在下列代码的横线处填写(),完成对有n个int类型元素的数组array由小到大排序。
cpp
void BubbleSort(int array[], int n) {
for (int i = n; i >= 2; i--)
for (______) // 在此处填入代码
if (array[j] > array[j + 1]) {
int t = array[j];
array[j] = array[j + 1];
array[j + 1] = t;
}
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. int j = 1; j < n; j++
B. int j = 0; j < n; j++
C. int j = 0; j < i - 1; j++
D. int j = 0; j < i; j++
查看解析
答案:C
考纲知识点: 冒泡排序
解析: 冒泡排序的内层循环应遍历0到i-2,即j < i - 1,确保j+1不越界。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | √ | √ | × | √ | √ | √ | × | × | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 在C++语言中,指针变量在逻辑上指向另一个变量在内存中的位置,指针变量本身不占用内存。
查看解析
答案:×
考纲知识点: 指针
解析: 指针变量本身也需要占用内存来存储地址值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 对N个元素的数组执行插入排序算法,通常的时间复杂度是O(N^2)。
查看解析
答案:√
考纲知识点: 算法复杂度
解析: 插入排序的平均和最坏时间复杂度均为O(N^2)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 在C++语言中,每个变量都有其作用域。
查看解析
答案:√
考纲知识点: 变量作用域
解析: 所有变量都有定义其作用域的规则。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在C++语言中,在函数调用时,通过引用传递的参数不会复制实际参数,因此不会额外占用内存。
查看解析
答案:×
考纲知识点: 引用传递
解析: 引用传递虽然避免了值的复制,但仍需占用内存存储引用本身。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 在C++语言中,可以通过定义结构体,定义一个新的数据类型。
查看解析
答案:√
考纲知识点: 结构体
解析: 结构体是用户自定义的数据类型。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在C++语言中,可以定义结构体类型的数组变量,定义结构体时也可以包含数组成员。
查看解析
答案:√
考纲知识点: 结构体与数组
解析: 结构体可以包含数组,也可以定义结构体数组。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 如果希望记录10个最长为99字节的字符串,可以将字符串数组定义为char s[10][100]。
查看解析
答案:√
考纲知识点: 字符串数组
解析: s[10][100]可以存储10个最多99字符的字符串(最后一个字节存\0)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 一个可能抛出异常的函数,调用它的位置没有在try子句中,会引起编译错误。
查看解析
答案:×
考纲知识点: 异常处理
解析: 未在try中的异常调用不会引起编译错误,但可能导致运行时未捕获异常。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. ==和=都是C++语言的运算符。
查看解析
答案:×
考纲知识点: 运算符
解析: =是赋值运算符,==是比较运算符,两者功能不同。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 通过使用文件重定向操作,可以将程序中输出到cout的内容输出到文件中,这是常用的记录程序运行日志的方法之一。
查看解析
答案:√
考纲知识点: 文件操作
解析: 重定向是一种常见的日志记录方式。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 进制转换
题目描述
N进制数指的是逢N进一的计数制。例如,人们日常生活中大多使用十进制计数,而计算机底层则一般使用二进制。除此之外,八进制和十六进制在一些场合也是常用的计数制(十六进制中,一般使用字母A至F表示十至十五;本题中,十一进制到十五进制也是类似的)。
在本题中,我们将给出N个不同进制的数。你需要分别把它们转换成十进制数。
输入格式
输入的第一行为一个十进制表示的整数N。接下来N行,每行一个整数K,随后是一个空格,紧接着是一个K进制数,表示需要转换的数。保证所有K进制数均由数字和大写字母组成,且不以0开头。保证K进制数合法。保证N ≤ 1000;保证2 ≤ K ≤ 16;保证所有K进制数的位数不超过9。
输出格式
输出N行,每一个十进制数,表示对应K进制数的十进制数值。
样例输入1
text
2
8 1362
16 3F01
2
3
2
3
样例输出1
text
754
10081
2
2
样例输入2
text
2
2 11011
10 1234567891
2
3
2
3
样例输出2
text
27
1234567891
2
2
数据范围
1 ≤ N ≤ 10002 ≤ K ≤ 16- 每个
K进制数位数不超过9
解题思路
查看解题思路
考纲知识点: 进制转换、字符串处理
解题思路:
- 读取输入的
N和K进制数 - 对于每个
K进制数,从右到左遍历每一位 - 将每一位转换为对应的十进制值(数字0-9直接转换,字母A-F转换为10-15)
- 计算该位的权值(
K^i,其中i是该位的位置,从0开始) - 将每位值乘以权值后累加得到十进制结果
样例解释:
- 八进制数
1362:1×8³ + 3×8² + 6×8¹ + 2×8⁰ = 512 + 192 + 48 + 2 = 754 - 十六进制数
3F0:3×16² + 15×16¹ + 0×16⁰ = 768 + 240 + 0 = 1008
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <cstring>
using namespace std;
int trans_digit(int k, char c) {
if (c <= '9')
return c - '0';
return c - 'A' + 10;
}
long long trans(int k, char str[]) {
int len = strlen(str);
long long res = 0, pw = 1;
for (int i = len - 1; i >= 0; i--) {
res += pw * trans_digit(k, str[i]);
pw *= k;
}
return res;
}
int main() {
int n;
cin >> n;
for (int t = 0; t < n; t++) {
int k;
char str[10];
cin >> k >> str;
cout << trans(k, str) << endl;
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 变长编码
题目描述
小明刚刚学习了三种整数编码方式:原码、反码、补码,并了解到计算机存储整数通常使用补码。但他总是觉得生活中很少用到2^31-1这么大的数,生活中常用的0~100这种数也同样需要用4个字节的补码表示,太浪费了些。热爱学习的小明通过搜索,发现了一种正整数的变长编码方式。这种编码方式的规则如下:
- 对于给定的正整数,首先将其表达为二进制形式。例如,
(0)10 = (0)2,(926)10 = (1110011110)2 - 将二进制数从低位到高位切分成每组7bit,不足7bit的在高位用0填补。例如,
(0)2变为0000000的一组,(1110011110)2变为0011110和0000111的两组。 - 由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位填上0,否则在最高位填上1。于是,0的变长编码为
00000000一个字节,926的变长编码为10011110和00000111两个字节。
这种编码方式可以用更少的字节表达比较小的数,也可以用很多的字节表达非常大的数。例如,987654321012345678的二进制为(0001101101101001101101001011110100010011010010000101101001110)2,于是它的变长编码为(十六进制表示)CE96 C8A6 F4 CB B6 DA 0D,共9个字节。
你能通过编写程序,找到一个正整数的变长编码吗?
输入格式
输入第一行,包含一个正整数N。约定0 ≤ N ≤ 10^18。
输出格式
输出一行,输出N对应的变长编码的每个字节,每个字节均以2位十六进制表示(其中,A-F使用大写字母表示),两个字节间以空格分隔。
样例输入1
text
01
样例输出1
text
001
样例输入2
text
9261
样例输出2
text
9E 071
样例输入3
text
9876543210123456781
样例输出3
text
CE 96 C8 A6 F4 CB B6 DA 0D1
数据范围
0 ≤ N ≤ 10^18
解题思路
查看解题思路
考纲知识点: 位运算、进制转换
解题思路:
- 将输入的十进制数转换为二进制
- 从低位到高位每7位一组切分
- 对每组添加最高位:最后一组加0,其余加1
- 将每组7位转换为十六进制表示
- 按从低位到高位的顺序输出
样例解释:
- 926的二进制:
1110011110 - 切分:
0011110(低7位)和0000111(高3位补0) - 添加最高位:
10011110(0x9E)和00000111(0x07) - 输出:
9E 07
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
void output_digit(int d) {
if (d >= 10)
cout << (char)('A' + d - 10);
else
cout << (char)('0' + d);
}
void output_code(int s) {
output_digit(s >> 4);
output_digit(s & 0x0f);
}
int main() {
long long n;
cin >> n;
int split[10];
int l = 0;
while (n > 0) {
split[l++] = (int)(n & 0x7f);
n >>= 7;
}
for (int i = 0; i < l - 1; i++)
split[i] |= 0x80;
if (l == 0) {
cout << "00" << endl;
return 0;
}
output_code(split[0]);
for (int i = 1; i < l; i++) {
cout << " ";
output_code(split[i]);
}
cout << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限