CCF-GESP 等级考试 2023年6月认证C++四级真题解析
2023年6月真题
一、单选题(每题2分,共30分)
正确答案:D
解析:考察知识点:编程环境
本题属于考察计算机基础知识中的编辑、编译、解释、调试的概念;其中编辑是编写修改代码,保存是将代码保存下来,调试是测试运行代码,而编译是将源程序翻译成可执行代码,所以本题正确答案为 D。
正确答案:C
解析:考察知识点:排序算法
本题属于考察排序的基本概念;冒泡排序、插入排序一般是稳定的,而选择排序一般是不稳定的,所以本题正确答案为 C。
正确答案:C
解析:考察知识点:指针
本题属于考察指针的基本概念;指针变量不仅可以指向基本类型的变量也可以指向其它的指针变量,所以本题正确答案为 C。
正确答案:D
解析:考察知识点:二维及多维数组
本题属于考察二维数组的基本概念;数组(包括多维数组)在内存中必须要连续存放,所以本题正确答案为 D。
正确答案:A
解析:考察知识点:函数
本题属于考察函数的基本概念;函数可以没有参数和返回值,同时函数定义可以在调用之后,只需要在调用前要加函数声明,但是函数必须要有名字,所以本题正确答案为 A。
注:如果了解“匿名函数”概念(该概念超出考纲范围),应注意区分:匿名函数,正式名称为“�表达式”,是一种可捕捉参数变量的无命名函数对象,属于“函数对象”的一种,并不属于“函数”范畴。函数对象与函数在使用时经常可以自动相互转换,但二者在实现机制上完全不同。
正确答案:D
解析:考察知识点:全局/局部作用域
本题属于考察变量定义域的基本概念;在 C++中两个变量可以取相同的变量名,只要它们在不同的作用域下即可,所以本题正确答案为D。
正确答案:D
解析:考察知识点:二维及多维数组
本题属于考察内存的基本概念; double 类型的数据占用内存是8 字节,array 数组共使用了 30 个 double 类型的数据,占用内存为30*8=240 字节。所以本题正确答案为 D。
正确答案:B
解析:考察知识点:指针
本题属于考察指针的基本概念。指针变量的类型为int *,A 选项错误;nullptr 指向的是固定的内存地址 0,C 选项错误;nullptr 指向的内存位置通常不存放有效数据,因此常用来表示未指向有效数据,访问它可能出现运行时错误,但不会出现编译错误,D 选项错误。本题正确答案为 B。
正确答案:C
解析:考察知识点:二维及多维数组
本题属于考察内存地址的基本概念;array[1][2]和array[2][1]中间差了array[2][0],相当于差了 2 个 int,也就是 8 字节,所以本题正确答案为C。
正确答案:C
解析:考察知识点:位运算
本题属于考察位运算的基本概念;a &= 3;等价于a = a & 3;。&为按位与运算,a 的原值为 6,6 & 3 的结果为 2。所以本题正确答案为C。
正确答案:A
解析:考察知识点:指针
本题属于考察指针的基本概念;首先让指针 p 指向变量a[2]的内存地址,然后让 a[1]=*p,也就是让 a[1]=a[2],所以 a 数组变为{1, 3, 3, 4, 5}。所以本题正确答案为 A。
正确答案:A
解析:考察知识点:函数、指针、二维及多维数组
本题属于考察函数参数的基本概念。当把数组作为函数的一个参数时,实际上只传递了数组的首指针。于是,传递多维数组时,只有形式参数的第一维的长度可以省略,形式参数的其他维的长度都不能省略。所以本题正确答案为A。
正确答案:B
解析:考察知识点:函数、指针
本题属于考察指针的基本概念; 题目要求输出20 10,也就是把a 和b进行交换,参数中传递了 a 和 b 的内存地址,需要使用相应类型的指针来存放,所以本题正确答案为 B。
正确答案:D
解析:考察知识点:全局/局部作用域
本题属于考察变量初始化相关概念;因为 sum 是在函数内部定义的,所以 sum 的初始值并不一定是 0,也就无法确定最终的输出了,所以本题正确答案为 D。
正确答案:A
解析:考察知识点:排序算法
本题属于考察选择排序算法;选择排序每次会从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,也就是对于所有的i+1<=j<n,找到最小的 array[j],所以本题正确答案为 A。
二、判断题(每题2分,共20分)
正确答案:错误
解析:考察知识点:计算机存储与网络
本题属于考察域名相关概念,域名是由两个或两个以上的词构成,中间用点号分隔开,最右边的那个词称为顶级域名,所以顶级域名是cn,所以本题错误。
正确答案:正确
解析:考察知识点:递推算法
本题属于考察递推相关概念,递推是按照一定的规律来计算序列中的每个项,本题中规律是从第三个数开始,每个数是前面两项之和,且我们按照从小到大的顺序依次计算数列中的每个项,这和递归的编程思想一致,所以本题正确。
正确答案:错误
解析:考察知识点:函数
本题属于考察函数相关概念,函数的参数默认以值传递方式进行传递,所以本题错误。
正确答案:错误
解析:考察知识点:二维及多维数组
】本题属于考察数组相关概念。实际问题中是有可能使用到四维甚至更多维数组的,所以本题错误。
正确答案:正确
解析:考察知识点:函数
本题属于考察函数相关概念。函数的参数只有在函数被调用时才会在调用栈上分配对应内存,并在函数返回时回收,这也形成了函数参数的生命周期。因此,函数的参数在没有被调用时不会占用内存,本题正确。
正确答案:错误
解析:考察知识点:异常处理
本题属于考察异常处理相关概念,即使一个函数可能抛出异常,也不一定要在 try 子句里调用这个函数。可正常调用,异常会向调用更上层抛出,如上层调用在 try 子句中,则可以在上层捕获处理。所以本题错误。
正确答案:错误
解析:考察知识点:二维及多维数组
本题属于考察数组相关概念。最长为 99 个字节的字符串,应申请100个 char 的数组;要定义 10 个最长为 99 字节的字符串,应该将字符串数组定义为 char s[10][100],所以本题错误。
正确答案:错误
解析:考察知识点:字符串
本题属于考察字符串相关概念,‘0’是一个字符常量,它的ASCII 码值为48;’\0’也是一个字符常量,它的 ASCII 码值为 0,通常用来表示字符串或字符数组的结束标志。可见它们不等价,所以本题错误。
正确答案:正确
解析:考察知识点:基本运算,位运算
本题属于考察运算符相关概念。>=是关系运算符大于等于;>>=是复合位右移赋值运算符,a >>= b;等价于 a = a >> b;。所以本题正确。
正确答案:正确
解析:考察知识点:文件操作
本题属于考察文件操作相关概念。使用文件重定向操作后,cout 输出的内容可能被写入文件而不是屏幕上。这是由程序用户决定的,编写程序的程序员无法确定,所以本题正确。
三、编程题(每题25分,共50分)
本题考察 模拟法
#include<bits/stdc++.h>
using namespace std;
int main() {
int n, len, sum, k;
cin>>n;
//待判断的正整数num,使用字符串更方便处理输入
string num;
while(n--){
cin>>num;
len = num.size(); //待判断正整数num的长度
sum = 0; //累计和
for(int i=len-1; i>=0; i--) {
k = num[i]-'0'; //当前位的数值
//个位为第一位,因为用字符串存储待判断的正整数,这里数位要特别注意一下
if((len-i)%2!=0) { //奇数位,需要做变换,
k *= 7;
while(k>9) {
k = k/10+k%10;
}
}
sum+=k;
}
if(sum%8==0) cout<<"T"<<endl;
else cout<<"F"<<endl;
}
return 0;
}
本题考察多层循环,模拟法(三级),函数的定义与调用、进制转换
#include<bits/stdc++.h>
using namespace std;
struct node {
int cnt; //次数
int id; //数值
} arr[256]; //arr[i] 数值i的值和出现的次数
//按出现次数排序,如果次数相同,按灰阶值从小到大为序
bool cmp(node a, node b) {
if(a.cnt == b.cnt) return a.id < b.id;
return a.cnt > b.cnt;
}
//十六进制转成十进制
int change1(char ch){
if(ch>='0' && ch<='9') return ch-'0';
else return ch-'A'+10;
}
//十进制转成十六进制
char change2(int num){
return char(num<10? num+'0' : num-10+'A');
}
int main() {
int n;
cin>>n;
string s[20];
//输入n行灰度图像,记录0~255出现的次数
for(int i=0; i<n; i++) {
cin>>s[i]; //灰度图像
for(int j=0; j<s[i].size(); j=j+2) {
//每两位十六进制转成十进制,对应0~255的数值
int num=change1(s[i][j])*16+change1(s[i][j+1]);
arr[num].cnt++;
arr[num].id=num;
}
}
//排序,找出出现次数最多的前16个数值,将其十六进制存入code
sort(arr, arr+256, cmp);
string code="";
for(int i=0; i<16; i++) {
code += change2(arr[i].id/16);
code += change2(arr[i].id%16);
}
cout<<code<<endl;
//进行压缩:如果在code内,用code内的,如果不在,选择code里最接近的
for(int i=0; i<n; i++) {
for(int j=0; j<s[i].size(); j=j+2){
int num1=change1(s[i][j])*16+change1(s[i][j+1]);
int diff=256, id=0;
for(int k=0; k<code.size(); k=k+2){
int num2=change1(code[k])*16+change1(code[k+1]);
if(num1==num2){
id = k;
break;
}else if(abs(num1-num2) < diff){
diff = abs(num1-num2);
id = k;
}
}
cout<<change2(id/2);
}
cout<<endl;
}
return 0;
}