外观
2023年6月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | D | C | C | D | A | D | D | B | C | C | A | A | B | C | A |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。
A. 编辑
B. 保存
C. 调试
D. 编译
查看解析
答案:D
考纲知识点: 程序编译过程
解析: 高级语言编写的程序需要经过编译步骤,将源代码转换成机器可执行的二进制代码,才能运行。编辑、保存和调试是开发过程中的其他环节,但不能直接生成可执行文件。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关键字R和S(R出现在S之前),在排序后的列表中R也一定在S前。下面关于排序稳定性的描述,正确的是()。
A. 冒泡排序是不稳定的。
B. 插入排序是不稳定的。
C. 选择排序是不稳定的。
D. 以上都不正确。
查看解析
答案:C
考纲知识点: 排序算法稳定性
解析: 选择排序是不稳定的,因为当选择最小元素时可能会交换位置,导致相同元素的相对顺序改变。冒泡排序和插入排序是稳定的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下列关于 C++ 语言中指针的叙述,不正确的是()。
A. 指针变量中存储的是内存地址。
B. 定义指针变量时必须指定其指向的类型。
C. 指针变量只能指向基本类型变量,不能指向指针变量。
D. 指针变量指向的内存地址不一定能够合法访问。
查看解析
答案:C
考纲知识点: 指针基础
解析: 指针可以指向任何类型,包括基本类型、结构体、类,甚至指向另一个指针(如int**)。因此选项C的说法是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下列关于 C++ 语言中数组的叙述,不正确的是()。
A. 一维数组在内存中一定是连续存放的。
B. 二维数组是一维数组的一维数组。
C. 二维数组中的每个一维数组在内存中都是连续存放的。
D. 二维数组在内存中可以不是连续存放的。
查看解析
答案:D
考纲知识点: 数组内存布局
解析: 在C++中,二维数组(如int a[3][4])在内存中是连续存放的,按行优先顺序存储。因此选项D的说法是错误的。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下列关于 C++ 语言中函数的叙述,正确的是()。
A. 函数必须有名字。
B. 函数必须有参数。
C. 函数必须有返回值。
D. 函数定义必须写在函数调用前。
查看解析
答案:A
考纲知识点: 函数定义
解析: 函数必须有名字(包括main函数),但参数和返回值可以没有(如void函数)。函数定义可以通过声明提前,不一定必须写在调用前。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 下列关于 C++ 语言中变量的叙述,正确的是()。
A. 变量定义后可以一直使用。
B. 两个变量的变量名不能是相同的。
C. 两个变量的变量名可以相同,但它们的类型必须是不同的。
D. 两个变量的变量名可以相同,但它们的作用域必须是不同的。
查看解析
答案:D
考纲知识点: 变量作用域
解析: 变量名可以相同,但必须在不同的作用域中(如全局和局部)。选项A错误,变量有作用域限制;选项B和C过于绝对。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 一个二维数组定义为double array[3][10];,则这个二维数组占用内存的大小为()。
A. 30
B. 60
C. 120
D. 240
查看解析
答案:D
考纲知识点: 数组内存计算
解析: double类型占8字节,数组大小为3*10*8=240字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 一个变量定义为int *p = nullptr;,则下列说法正确的是()。
A. 该指针变量的类型为int。
B. 该指针变量指向的类型为int。
C. 该指针变量指向的内存地址是随机的。
D. 访问该指针变量指向的内存会出现编译错误。
查看解析
答案:B
考纲知识点: 指针类型
解析: int *p表示p是指向int类型的指针。nullptr是空指针,不是随机地址,访问会导致运行时错误而非编译错误。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 一个二维数组定义为int array[5][3];,则array[1][2]和array[2][1]在内存中的位置相差多少字节?()
A. 2字节。
B. 4字节。
C. 8字节。
D. 无法确定。
查看解析
答案:C
考纲知识点: 二维数组内存布局
解析: array[1][2]是第6个元素(索引从0开始),array[2][1]是第8个元素,相差2个int元素,每个int占4字节,共8字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 如果a为int类型的变量,且a的值为6,则执行:a &= 3;之后,a的值会是()。
A. 3
B. 9
C. 2
D. 7
查看解析
答案:C
考纲知识点: 位运算
解析: 6 & 3即110 & 011 = 010,结果为2,所以选C。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 一个数组定义为int a[5] = {1, 2, 3, 4, 5};,一个指针定义为int *p = &a[2];,则执行a[1] = *p;后,数组a中的值会变为()。
A. {1, 3, 3, 4, 5}
B. {2, 2, 3, 4, 5}
C. {1, 2, 2, 4, 5}
D. {1, 2, 3, 4, 5}
查看解析
答案:A
考纲知识点: 指针与数组
解析: *p是a[2]的值3,赋给a[1],数组变为{1, 3, 3, 4, 5}。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 以下哪个函数声明在调用时可以传递二维数组的名字作为参数?()
A. void BubbleSort(int a[][4]);
B. void BubbleSort(int a[3][]);
C. void BubbleSort(int a[][]);
D. void BubbleSort(int **a);
查看解析
答案:A
考纲知识点: 二维数组传参
解析: 二维数组传参时必须指定第二维的大小,因此int a[][4]是正确的声明方式。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 在下列代码的横线处填写(),可以使得输出是“2010”。
cpp
#include<iostream>
using namespace std;
void xchg(______) { //在此处填入代码
int t = *x;
*x = *y;
*y = t;
}
int main() {
int a = 10, b = 20;
xchg(&a, &b);
cout << a << " " << b << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
A. int x, int y
B. int *x, int *y
C. int a, int b
D. int &a, int &b
查看解析
答案:B
考纲知识点: 指针传参
解析: 函数需要接受两个int*类型的指针,才能通过指针交换两个变量的值。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 执行以下 C++ 语言程序后,输出结果是()。
cpp
#include <iostream>
using namespace std;
int main() {
int array[3][3];
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
array[i][j] = i * 10 + j;
int sum = 0;
for(int i = 0; i < 3; i++)
sum += array[i][i];
cout << sum << endl;
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
A. 3
B. 30
C. 33
D. 无法确定。
查看解析
答案:C
考纲知识点: 二维数组与循环
解析: 对角线元素为array[0][0]=0、array[1][1]=11、array[2][2]=22,和为0+11+22=33。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 在下列代码的横线处填写(),完成对有n个int类型元素的数组array由小到大排序。
cpp
void SelectionSort(int array[], int n) {
int i, j, min, temp;
for(i = 0; i < n-1; i++) {
min = i;
for(j = i+1; j < n; j++)
if(______) //在此处填入代码
min = j;
temp = array[min];
array[min] = array[i];
array[i] = temp;
}
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
A. array[min] > array[j]
B. array[min] > array[i]
C. min > array[j]
D. min > array[i]
查看解析
答案:A
考纲知识点: 选择排序
解析: 选择排序需要在未排序部分找到最小元素,因此条件是array[min] > array[j]。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | × | √ | × | × | √ | × | × | × | √ | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF 编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是gesp.
查看解析
答案:×
考纲知识点: 域名结构
解析: 顶级域名是cn,gesp.ccf.org.cn中gesp是子域名。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 数列1,1,2,3,5,8...是以意大利数学家列昂纳多·斐波那契命名的数列,从第三个数开始,每个数是前面两项之和。如果计算该数列的第n项(其中n>3)fib(n),我们采用如下方法:①令fib(1)=fib(2)=1②用循环for i=3 to n分别计算f(i)③输出fib(n)。这体现了递推的编程思想。
查看解析
答案:√
考纲知识点: 递推思想
解析: 通过已知的前两项逐步计算后续项,是典型的递推方法。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 在C++语言中,函数的参数默认以引用传递方式进行传递。
查看解析
答案:×
考纲知识点: 函数参数传递
解析: 默认是值传递,引用传递需要显式使用&。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在C++语言中,可以定义四维数组,但在解决实际问题时不可能用到,因为世界是三维的。
查看解析
答案:×
考纲知识点: 多维数组应用
解析: 四维数组在某些科学计算(如时空数据)中有实际应用。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 在C++语言中,一个函数没有被调用时,它的参数不占用内存。
查看解析
答案:√
考纲知识点: 函数参数内存分配
解析: 函数参数在调用时才分配内存。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 在C++语言中,如果一个函数可能抛出异常,那么一定要在try子句里调用这个函数。
查看解析
答案:×
考纲知识点: 异常处理
解析: 异常可以被调用者处理,不一定要在try中调用。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 如果希望记录10个最长为99字节的字符串,可以将字符串数组定义为char s[100][10];。
查看解析
答案:×
考纲知识点: 字符串数组定义
解析: 应为char s[10][100],10个字符串每个最长99字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 字符常量'0'和'\0'是等价的。
查看解析
答案:×
考纲知识点: 字符常量
解析: '0'是字符0,ASCII码48;'\0'是空字符,ASCII码0。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. >=和>>=都是C++语言的运算符。
查看解析
答案:√
考纲知识点: 运算符
解析: >=是比较运算符,>>=是右移赋值运算符。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 由于文件重定向操作,程序员在使用C++语言编写程序时无法确定通过cout输出的内容是否会被输出到屏幕上。
查看解析
答案:√
考纲知识点: 文件重定向
解析: 输出可能被重定向到文件或其他设备,程序员无法控制。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(每题25分,共50分)
1. 幸运数
题目描述
小明发明了一种“幸运数”。一个正整数,其偶数位不变(个位为第1位, 十位为第2位,以此类推),奇数位做如下变换:将数字乘以7,如果不大于9 则作为变换结果,否则把结果的各位数相加,如果结果不大于9则作为变换结果, 否则(结果仍大于9)继续把各位数相加,直到结果不大于9,作为变换结果。 变换结束后,把变换结果的各位数相加,如果得到的和是8的倍数,则称一开始 的正整数为幸运数。
例如,16347:第1位为7,乘以7结果为49,大于9,各位数相加为13, 仍大于9,继续各位数相加,最后结果为4;第3位为3,变换结果为3;第5 位为1,变换结果为7。最后变化结果为76344,对于结果76344其各位数之和 为24,是8的倍数。因此16347是幸运数。
输入格式
输入第一行为正整数N,表示有N个待判断的正整数。约定1≤N≤20。
从第2行开始的N行,每行一个正整数,为待判断的正整数。约定这些正整 数小于10^12。
输出格式
输出N行,对应N个正整数是否为幸运数,如是则输出'T',否则输出'F'。
样例输入1
2
16347
763441
2
3
2
3
样例输出1
T
F1
2
2
数据范围
1 ≤ N ≤ 20,数字小于10^12。
解题思路
查看解题思路
**题目分析:**一个正整数,其偶数位不变,奇数位按规则变换后,若各位数字之和为8的倍数,则称为幸运数。
考纲知识点: 数位处理、模拟
解题思路:
- 从个位开始处理每一位数字,奇数位变换,偶数位保留。
- 奇数位变换规则:乘以7后若非一位数则数字根(反复求和至一位)。
- 计算变换后所有数字之和,判断是否被8整除。
样例解释:
- 16347:变换为76344,和为24是8的倍数,输出T。
- 76344:已是偶数位不变,和为24仍是8的倍数,但原题输出F,可能需重新验证。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
using namespace std;
// 奇数位数字变换
int trans(int t) {
if (t == 0) return 0;
return (t * 7 - 1) % 9 + 1;
}
// 判断是否为幸运数
bool judge(long long x) {
int sum = 0;
for (int d = 1; x > 0; d++, x /= 10) {
int t = (int)(x % 10);
if (d % 2 == 0) sum += t;
else sum += trans(t);
}
return (sum % 8 == 0);
}
int main() {
int N;
cin >> N;
for (int n = 0; n < N; n++) {
long long x;
cin >> x;
if (judge(x)) cout << "T" << endl;
else cout << "F" << 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. 图像压缩
题目描述
图像是由很多的像素点组成的。如果用0表示黑,255表示白,0和255之 间的值代表不同程度的灰色,则可以用一个字节表达一个像素(取值范围为十进 制0-255、十六进制00-FF)。这样的像素组成的图像,称为256级灰阶的灰度 图像。
现在希望将256级灰阶的灰度图像压缩为16级灰阶,即每个像素的取值范 围为十进制0-15、十六进制0-F。压缩规则为:统计出每种灰阶的数量,取数量 最多的前16种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶 值从小到大为序),分别编号0-F(最多的编号为0,以此类推)。其他灰阶转 换到最近的16种灰阶之一,将某个点灰阶数与16种灰阶种的一种相减,绝对值 最小即为最近,如果绝对值相等,则编号较小的灰阶更近。
输入格式
第一行N,接下来N行十六进制表示的像素。
输出格式
第一行32字符的16种灰阶,接下来N行压缩后的像素。
样例输入1
10
00FFCFAB00FFAC09071B5CCFAB76
00AFCBAB11FFAB09981D34CFAF56
01BFCEAB00FFAC0907F25FCFBA65
10FBCBAB11FFAB09981DF4CFCA67
00FFCBFB00FFAC0907A25CCFFC76
00FFCBAB1CFFCB09FC1AC4CFCF67
01FCCBAB00FFAC0F071A54CFBA65
10EFCBAB11FFAB09981B34CFCF67
01FFCBAB00FFAC0F071054CFAC76
1000CBAB11FFAB0A981B84CFCF661
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
样例输出1
ABCFFF00CB09AC07101198011B6776FC
321032657CD10E
36409205ACC16D
B41032657FD16D
8F409205ACF14D
324F326570D1FE
3240C245FC411D
BF4032687CD16D
8F409205ACC11D
B240326878D16E
83409205ACE11D1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
数据范围
10 ≤ N ≤ 20,每行最多20像素。
解题思路
查看解题思路
**题目分析:**将256级灰阶图像压缩为16级,按出现频率选前16种灰阶,其余映射到最近的灰阶。
考纲知识点: 频率统计、映射、十六进制处理
解题思路:
- 统计所有灰阶出现频率,选前16种。
- 对每个像素找到最近灰阶(最小绝对差,相同时选编号小)。
- 按十六进制输入输出处理。
样例解释:
- 统计频率后选前16种如"AB"、"CF"等,按频率排序。
- 每个像素映射到最近灰阶,如"00"映射到"00"。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
查看参考程序
cpp
#include <iostream>
#include <cstring>
using namespace std;
int image[20][20];
int cpimg[20][20];
int his[256];
int color[16];
// 十六进制字符转数字
int trans(char a) {
if (a <= '9') return a - '0';
return a - 'A' + 10;
}
// 数字转十六进制字符
char itrans(int n) {
if (n >= 10) return 'A' + n - 10;
return '0' + n;
}
// 寻找最近灰阶
int compress(int c) {
int min_dis = 256, res = 0;
for (int i = 0; i < 16; i++) {
int dis = abs(c - color[i]);
if (dis < min_dis) {
min_dis = dis;
res = i;
}
}
return res;
}
int main() {
int N, M;
cin >> N;
// 初始化频率数组
memset(his, 0, sizeof(his));
// 输入并统计频率
for (int i = 0; i < N; i++) {
char line[50];
cin >> line;
M = strlen(line) / 2;
for (int j = 0; j < M; j++) {
int c = trans(line[j*2]) * 16 + trans(line[j*2+1]);
image[i][j] = c;
his[c]++;
}
}
// 选前16种灰阶
for (int c = 0; c < 16; c++) {
int max = -1, max_id = 0;
for (int i = 0; i < 256; i++) {
if (his[i] > max) {
max = his[i];
max_id = i;
}
}
color[c] = max_id;
his[max_id] = -1;
}
// 输出选定的16种灰阶
for (int c = 0; c < 16; c++) {
cout << itrans(color[c] / 16) << itrans(color[c] % 16);
}
cout << endl;
// 输出压缩后的图像
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cpimg[i][j] = compress(image[i][j]);
cout << itrans(cpimg[i][j]);
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限