2023年6月GESP能力等级认证C++四级真题

2023-06 GESP四级真题

题数:27

分数:100

测试时长:90min

一.选择题(每题2分,共30分)

1.高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。(D)(2分)

A.编辑

B.保存

C.调试

D.编译

答案解析:程序的最终目标是将源程序编译成目标程序。编译程序是把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序,以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。

2.排序算法是稳定的(Stable Sorting),就是指排序算法可以保证,在待排序数据中有两个相等记录的关键字R和S(R出现在S之前),在排序后的列表中R也一定在S前。下面关于排序稳定性的描述,正确的是(C)。(2分)

A.冒泡排序是不稳定的

B.插入排序是不稳定的

C.选择排序是不稳定的

D.以上都不正确

3.下列关于C++语言中指针的叙述,不正确的是(C)。(2分)

A.指针变量中存储的是内存地址。

B.定义指针变量时必须指定其指向的类型。

C.指针变量只能指向基本类型变量,不能指向指针变量。

D.指针变量指向的内存地址不一定能够合法访问。

4.下列关于C++语言中数组的叙述,不正确的是(D)。(2分)

A.一维数组在内存中一定是连续存放的。

B.二维数组是一维数组的一维数组。

C.二维数组中的每个一维数组在内存中都是连续存放的。

D.二维数组在内存中可以不是连续存放的。

5.下列关于C++语言中函数的叙述,正确的是(A)。(2分)

A.函数必须有名字。

B.函数必须有参数。

C.函数必须有返回值。

D.函数定义必须写在函数调用前。

6.下列关于C++语言中变量的叙述,正确的是(D)。(2分)

A.变量定义后可以一直使用。

B.两个变量的变量名不能是相同的。

C.两个变量的变量名可以相同,但它们的类型必须是不同的。

D.两个变量的变量名可以相同,但它们的作用域必须是不同的。

7.一个二维数组定义为double array[3][10];,则这个二维数组占用内存的大小为(D)。(2分)

A.30

B.60

C.120

D.240

8.一个变量定义为int *p = nullptr; ,则下列说法正确的是(B)。(2分)

A.该指针变量的类型为int。

B.该指针变量指向的类型为int。

C.该指针变量指向的内存地址是随机的。

D.访问该指针变量指向的内存会出现编译错误。

9.一个二维数组定义为int array[5][3];,则array[1][2]和array[2][1]在内存中的位置相差多少字节?(C)(2分)

A.2字节

B.4字节

C.8字节。

D.无法确定。

10.如果a为int类型的变量,且a的值为6,则执行a &= 3;之后,a的值会是(C)。(2分)

A.3

B.9

C.2

D.7

11.一个数组定义为inta[5]={1,2,3,4,5};,一个指针定义为int *p=&a[2];,则执行a[1] = *p;后,数组a中的值会变为(A)。(2分)

A.{1,3,3,4, 5}

B.{2,2,3, 4, 5}

C.{1,2,2, 4, 5}

D.{1,2,  3, 4,   5}

12.以下哪个函数声明在调用时可以传递二维数组的名字作为参数?(A)(2分)

A.void BubbleSort(int a[][4]);

B.void BubbleSort(int a[3][]);

C.void BubbleSort(int a[][]);

D.void BubbleSort(int ** a);

13.在下列代码的横线处填写(),可以使得输出是“20 10”。(B)(2分)

#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;
}

A.int x, int y

B.int *x, int *y

C.int a, int b

D.int & a, int & b

14.执行以下C++语言程序后,输出结果是(C)。(2分)

#include <iostream>
using namespace std;
int main() {
	int array[3][3];
	for (int i = 0; i< 3; i++)
		for (int j = @; j < 3; j++)
			array[i][j] = i * 10 + j;
	int sum;
	for (int i = 0; i< 3; i++)
		sum += array[i][i];
	cout << sum << endl;
	return 0;
}

A.3

B.30

C.33

D.无法确定

15.在下列代码的横线处填写(),完成对有n个int类型元素的数组array由小到大排序。(A)(2分)

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;
	}
}

A.array[min] > array[j]

B.array[min] > array[i]

C.min > array[j]

D.min > array[i]

二.判断题(每题2分,共20分)

1.域名是由一串用点分隔的名字来标识互联网上一个计算机或计算机组的名称,CCF编程能力等级认证官方网站的域名是gespccforgcn,其中顶级域名是gesp。(错)

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)。

这体现了递推的编程思想。(对)

3.在C++语言中,函数的参数默认以引用传递方式进行传递。(错)

4.在C++语言中,可以定义四维数组,但在解决实际问题时不可能用到,因为世界是三维的。(错)

5.在C++语言中,一个函数没有被调用时,它的参数不占用内存。(对)

6.在C++语言中,如果一个函数可能抛出异常,那么一定要在try子句里调用这个函数。(对)

7.如果希望记录10个最长为99字节的字符串,可以将字符串数组定义为char s[100][10];。(错)

8.字符常量'@'和"\0"是等价的。(错)

9.>=和>>=都是C++语言的运算符。(对)

10.由于文件重定向操作,程序员在使用C++语言编写程序时无法确定通过cout输出的内容是否会被输出到屏幕上。(错)

三.编程题(每题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行,每行一个正整数,为待判断的正整

数。约定这些正整数小于1012。

【输出描述】

输出N行,对应N个正整数是否为幸运数,如是则输出T,否则输出F。

提示:不需要等到所有输入结束在依次输出,可以输入一个数就判断一个数并输出,再输入下一个数。

【样例输入1】

2

16347

76344

参考程序:

#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 =0;
	cin >> N;
	for (int n=0; n < N;n++){
		long long x =0;
		cin >> x;
		if(judge(x))
			cout << "T" << endl;
		else
			cout << "F" << endl;
	}
	return 0;
}

2.图像压缩

【问题描述】

图像是由很多的像素点组成的。如果用0表示黑,255 表示白,0和255之间的值代表不同程度的灰色,则可以用一个字节表达一个像素(取值范围为十进制0-255.十六进制00-FF)。这样的像素组成的图像,称为256级灰阶的灰度图像。

现在希望将256级灰阶的灰度图像压缩为16级灰阶,即每个像素的取值范围为十进制 0-15.十六进制0-F。压缩规则为:统计出每种灰阶的数量,取数量最多的前16种灰阶(如某种灰阶的数量与另外一种灰阶的数量相同,则以灰阶值从小到大为序),分别编号 O-F(最多的编号为0,以此类推)。其他灰阶转换到最近的16种灰阶之一,将某个点灰阶数与16种灰阶种的一种相减,绝对值最小即为最近,如果绝对值相等,则编号较小的灰阶更近。

【输入描述】

输入第1行为一个正整数N,表示接下来有N行数据组成一副256级灰阶的灰度图像。约定10<=N<=20。

第2行开始的N行,每行为长度相等且为偶数的字符串,每两个字符用十六进制表示一个像素。

约定输入的灰度图像至少有16种灰阶。约定每行最多 20个像素。

【输出描述】

第一行输出压缩选定的16种灰阶的十六进制编码,共计32个字符。

第二行开始的N行,输出压缩后的图像,每个像素一位十六进制数表示压缩后的灰阶值。

【样例输入1】

10

00FFCFAB00FFAC09071B5CCFAB76

00AFCBAB11FFAB09981D34CFAF56

01BFCEAB00FFAC0907F25FCFBA65

10FBCBAB11FFAB09981DF4CFCA67

00FFCBFBFFAC0987A25CCFFC76

00FFCBAB1CFFCB09FC1AC4CFCF67

01FCCBAB00FFACF71A54CFBA65

10EFCBAB11FFAB09981B34CFCF67

01FFCBAB00FFAC0F071054CFAC76

1000CBAB11FFAB0A981884CFCF66

【样例输出1】

ABCFFF00CB09AC0710119801186776FC

321032657CD10E

36409205ACC16D

B41032657FD16D

8F409205ACF14D

324F326570D1FE

3240C245FC411D

BF4032687CD16D

8F409205ACC11D

B240326878D16E

83409205ACE11D

【样例解释1】灰阶AB.CF和FF出现14次,00出现9次,CB出现9次,09出现7次,AC出现6次,07出现5次,10.11和98出现4次,01.1B.67.76和FC出现3次。

参考答案:

#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 (char)(n -10 + 'A');
	return (char)(n + '0');
}

//寻找离C最近的灰阶
int compress(int c){
	int dis = 256, res =-1;
	for(int i =0;i < 16; i++){
		int d = c - color[i];
		if(d<0)
			d = -d;
		if(d < dis){
			dis = d;
			res = i;
		}
	}
	return res;
}

int main(){
	int N =0,M=0;
	cin >> N;
	//灰阶计数,初始化为-1
	for(int i=0;i<256;i++)
		his[i] = -1

	//输入图像,并对灰阶计数
	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 = 0, max_id = -1;
		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;		
	}

	//讲image的灰阶压缩为cpimg
	for(int i=0;i<N;i++)
		for(int j=0; j<M;j++)
			cpimg[i][j] =compress(image[i][j]);

	//输出选取的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++)
			cout << itrans(cpimg[i][j]);
		cout << endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_46227121/article/details/131304539
今日推荐