2023年6月 GESP C++ 4级认证考试真题(含编程操作题部分)
选 单选题(共 15 题,每题 2 分)
高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。
排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关键字 $R$ 和 $S$($R$ 出现在 $S$ 之前),在排序后的列表中 $R$ 也一定在 $S$ 前。下面关于排序稳定性的描述,正确的是( )。
下列关于 C++ 语言中指针的叙述,不正确的是( )。
下列关于 C++ 语言中数组的叙述,不正确的是( )。
下列关于 C++ 语言中函数的叙述,正确的是( )。
下列关于 C++ 语言中变量的叙述,正确的是( )。
一个二维数组定义为 double array[3][10];,则这个二维数组占用内存的大小为( )。
一个变量定义为 int *p = nullptr; ,则下列说法正确的是( )。
一个二维数组定义为 int array[5][3];,则 array[1][2] 和 array[2][1] 在内存中的位置相差多少字节?( )
如果 $a$ 为 int 类型的变量,且 $a$ 的值为 $6$,则执行 a &= 3; 之后,$a$ 的值会是( )。
一个数组定义为 int a[5] = {1, 2, 3, 4, 5};,一个指针定义为 int *p = &a[2];,则执行 a[1] = *p; 后,数组 $a$ 中的值会变为( )。
以下哪个函数声明在调用时可以传递二维数组的名字作为参数?( )
在下列代码的横线处填写( ),可以使得输出是“20 10”。
执行以下 C++ 语言程序后,输出结果是( )。
在下列代码的横线处填写( ),完成对有 $n$ 个 int 类型元素的数组 array 由小到大排序。
判 判断题(共 10 题,每题 2 分)
域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF 编程能力等级认证官方网站的域名是 gesp.ccf.org.cn,其中顶级域名是 gesp。
数列 $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)。这体现了递推的编程思想。
在 C++ 语言中,函数的参数默认以引用传递方式进行传递。
在 C++ 语言中,可以定义四维数组,但在解决实际问题时不可能用到,因为世界是三维的。
在 C++ 语言中,一个函数没有被调用时,它的参数不占用内存。
在 C++ 语言中,如果一个函数可能抛出异常,那么一定要在 try 子句里调用这个函数。
如果希望记录 $10$ 个最长为 $99$ 字节的字符串,可以将字符串数组定义为 char s[100][10];。
字符常量 '0' 和 '\0' 是等价的。
>= 和 >>= 都是 C++ 语言的运算符。
由于文件重定向操作,程序员在使用 C++ 语言编写程序时无法确定通过 cout 输出的内容是否会被输出到屏幕上。
编 编程操作题(共 2 题,共 50 分)
试题名称:幸运数
时间限制:1.0 s | 内存限制:128.0 MB
题目描述
小明发明了一种 “幸运数”。一个正整数,其偶数位不变(个位为第 $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 \le N \le 20$。
从第 $2$ 行开始的 $N$ 行,每行一个正整数,为待判断的正整数。约定这些正整数小于 $10^{12}$。
输出格式
输出 $N$ 行,对应 $N$ 个正整数是否为幸运数,如是则输出 T,否则输出 F。
提示:不需要等到所有输入结束再依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。
样例输入 #1
2
16347
76344
样例输出 #1
T
F
试题名称:图像压缩
时间限制:1.0 s | 内存限制:512.0 MB
题目描述
图像是由很多的像素点组成的。如果用 $0$ 表示黑,$255$ 表示白,$0$ 和 $255$ 之间的值代表不同程度的灰色,则可以用一个字节表达一个像素(取值范围为十进制 0-255、十六进制 00-FF)。这样的像素组成的图像,称为 $256$ 级灰阶的灰度图像。
现在希望将 $256$ 级灰阶的灰度图像压缩为 $16$ 级灰阶,即每个像素的取值范围为十进制 0-15、十六进制 0-F。压缩规则为:统计出每种灰阶的数量,取数量最多的前 $16$ 种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序),分别编号 0-F(最多的编号为 0,以此类推)。其他灰阶转换到最近的 $16$ 种灰阶之一,将某个点的灰阶值(灰度,而非次数)与 $16$ 种灰阶中的一种相减,绝对值最小即为最近,如果绝对值相等,则编号较小的灰阶更近。
输入格式
输入第 $1$ 行为一个正整数 $n(10\le n \le 20)$,表示接下来有 $n$ 行数据组成一副 $256$ 级灰阶的灰度图像。
第 $2$ 行开始的 $n$ 行,每行为长度相等且为偶数的字符串,每两个字符用十六进制表示一个像素。约定输入的灰度图像至少有 $16$ 种灰阶。约定每行最多 $20$ 个像素。
输出格式
第一行输出压缩选定的 $16$ 种灰阶的十六进制编码,共计 $32$ 个字符。
第二行开始的 $n$ 行,输出压缩后的图像,每个像素一位十六进制数表示压缩后的灰阶值。
样例输入 #1
10
00FFCFAB00FFAC09071B5CCFAB76
00AFCBAB11FFAB09981D34CFAF56
01BFCEAB00FFAC0907F25FCFBA65
10FBCBAB11FFAB09981DF4CFCA67
00FFCBFB00FFAC0907A25CCFFC76
00FFCBAB1CFFCB09FC1AC4CFCF67
01FCCBAB00FFAC0F071A54CFBA65
10EFCBAB11FFAB09981B34CFCF67
01FFCBAB00FFAC0F071054CFAC76
1000CBAB11FFAB0A981B84CFCF66
样例输出 #1
ABCFFF00CB09AC07101198011B6776FC
321032657CD10E
36409205ACC16D
B41032657FD16D
8F409205ACF14D
324F326570D1FE
3240C245FC411D
BF4032687CD16D
8F409205ACC11D
B240326878D16E
83409205ACE11D
说明/提示
【样例 $1$ 解释】
灰阶 AB、CF 和 FF 出现 $14$ 次,00 出现 $10$ 次,CB 出现
$9$ 次,09 出现 $7$ 次,AC 出现 $6$ 次,07 出现 $5$ 次,10、11
和 98 出现 $4$ 次,01、1B、67、76 和 FC 出现 $3$ 次。