CCF-GESP 等级考试 2023年9月认证C++四级真题解析

2023年9月真题

一、单选题(每题2分,共30分)


正确答案:B

解析:考察知识点:计算机基础

本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。


正确答案:A

解析:考察知识点:流程图和多层循环语句

本题属于考察计算机循环结构嵌套选择结构知识。根据流程图,n<=5时会一直循环,每次循环先判断是否满足m*n>20的条件,然后对m进行不同的赋值。例如:n=1,m=1,m*n不大于20,m会计算,赋值为3,依次类推,最终m的结果是9,选A。


正确答案:C

解析:考察知识点:排序算法

本题属于考察排序算法之冒泡排序的时间复杂度,选C。


正确答案:D

解析:考察知识点:指针的概念及使用

本题属于考察计算机指针知识。可以指向void类型。


正确答案:D

解析:考察知识点:数组

本题属于考察计算机数组知识。世界可以用多维描述,定义四维也有意义。


正确答案:B

解析:考察知识点:函数的概念及使用

本题属于考察计算机函数知识。函数调用时如果缺少实参将不能正确运行。


正确答案:A

解析:考察知识点:函数的概念及使用

本题属于考察计算机函数知识。函数声明时不能相同。


正确答案:B

解析:考察知识点:二维数组

本题属于考察C++二维字符数组知识。内存大小和数组需要用的空间有关。3行10列,需要3*10=30个空间,选B。


正确答案:B

解析:考察知识点:指针

本题属于考察C++指针知识。指针的值保存的是变量的地址,所以选B。


正确答案:C

解析:考察知识点:数组

本题属于考察C++三维数组知识。数组是long long类型,每间隔一下数字就间隔8个字节,假设三维数组用长宽高来描述,array[0][0][0]到array[0][5][5]有36个元素,array[1][2][3]包含36+12+4=52个元素;到长度3宽度2高度1,包括36*3+12+2=122个元素,隔离70个元素,因此长度是560,选C。


正确答案:C

解析:考察知识点:位运算

本题属于考察C++位运算知识。6按位取反运算,注意符号位也取反,呈现的是补码,转换过来就是-7。具体过程:

00000110(取反操作)

11111001(补码)

11111000(补码-1=反码)

10000111(负数的原码,注意此时取反符号位不变)


正确答案:A

解析:考察知识点:指针和数组

本题属于考察C++指针和数组知识。P指针指向的是a[2],将a[1]的值赋值给p指向的变量a[2],数组中a[1]将等于a[2]。


正确答案:A

解析:考察知识点:异常处理

本题属于考察C++处理异常知识。A是正确的。B选项中,得到对应类型中的异常才能catch操作。



正确答案:D

解析:考察知识点:循环和一维数组的基本运用

本题属于考察C++循环结构和一维数组的知识。这是求斐波那契数列的代码,数组的范围是[0,9],所以对fib[10]操作后,越界访问结果无法确定。


正确答案:C

解析:考察知识点:函数和数组的知识

本题属于考察C++函数和数组的知识。题目已知,要求从小到大的冒泡排序,如果前一个比后一个大,就交换位置,外层循环从n开始,判断的区间逐渐减小,判断循环范围C正确。

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


正确答案:错误

解析:考察知识点:指针类型的概念

本题是C++指针类型的知识,指针是个变量,占用内存。


正确答案:正确

解析:考察知识点:排序算法

本题是C++排序算法的知识,插入排序常用时间复杂度是 O ( N 2 ) O(N^2) O(N2)


正确答案:正确

解析:考察知识点:变量作用域

本题是C++变量的知识,变量都有作用域。


正确答案:错误

解析:考察知识点:函数

本题是C++函数的知识,传参时函数的参数也会是一个新的变量,占用内存。


正确答案:正确

解析:考察知识点:结构体

本题是C++语言的知识,定义结构体可以认为定义一个新的数据类型。


正确答案:正确

解析:考察知识点:结构体

本题是C++结构体的知识,可以包含数组。


正确答案:正确

解析:考察知识点:数组

本题是C++字符数组的知识,定义长度大于等于要求。


正确答案:错误

解析:考察知识点:函数

本题是C++函数的知识,编译不会报错。


正确答案:错误

解析:考察知识点:运算符

本题是C++语法的知识,==是运算符。


正确答案:正确

解析:考察知识点:文件操作

本题是C++文件操作的知识,正确。

三、编程题(每题25分,共50分)


本题考察 基本运算、输入输出语句、循环、进制转换的知识。

进制转换:其他进制转十进制:按位权展开后求和

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int n, k;
	cin>>n;
	string num;
	long long res;
	while(n--){
    	cin>>k>>num; //输入进制k和k进制数num 
    	res=0;
    	for(int i=0; i<num.size(); i++){
    		int tmp; //当前位的数值 
    		if(num[i]>='0' && num[i]<='9') tmp = num[i]-'0'; //数字字符 
    		else tmp = num[i]-'A'+10; //字母字符 
    		res = res*k + tmp;
    	}
    	cout<<res<<endl;
	}
    return 0;
 } 



本题考察 基本运算、字符串、进制转换的知识。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
//将8位二进制,每四位转成一个十六进制数 
string change(string s){
	string res="";
	for(int i=0; i<s.size(); i=i+4){
		int num = (s[i]-'0')*8+(s[i+1]-'0')*4+(s[i+2]-'0')*2+(s[i+3]-'0');
		res += char(num<10? num+'0' : num-10+'A');
	}
	return res;
}
int main() {
	long long n;
	cin>>n;
	string s="", tmp=""; 
	//将十进制数n转成二进制 
	while(n){
		s=char(n%2+'0') + s;
		n/=2;
	} 
	//位数不足7的倍数,前补0凑够7的倍数 
	int len=7-s.size()%7;
	for(int i=0; i<len; i++) s='0'+s;
	//从后往前,每7位进行切分,将切分出来的转成两位十六进制 
	for(int i=s.size()-7; i>=0; i-=7){
		if(i!=0) tmp = "1"+s.substr(i,7); //最后一次切分7位前补1 
		else tmp = "0"+s.substr(i,7); //其余切分7位前补0 
		cout<<change(tmp)<<" "; //调用函数转换 
	} 
	return 0;
}
相关推荐
别NULL11 分钟前
机试题——疯长的草
数据结构·c++·算法
CYBEREXP20081 小时前
MacOS M3源代码编译Qt6.8.1
c++·qt·macos
yuanbenshidiaos2 小时前
c++------------------函数
开发语言·c++
yuanbenshidiaos2 小时前
C++----------函数的调用机制
java·c++·算法
tianmu_sama2 小时前
[Effective C++]条款38-39 复合和private继承
开发语言·c++
羚羊角uou2 小时前
【C++】优先级队列以及仿函数
开发语言·c++
姚先生972 小时前
LeetCode 54. 螺旋矩阵 (C++实现)
c++·leetcode·矩阵
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(1)
c语言·开发语言·c++
FeboReigns2 小时前
C++简明教程(文章要求学过一点C语言)(2)
c语言·开发语言·c++
264玫瑰资源库3 小时前
从零开始C++棋牌游戏开发之第二篇:初识 C++ 游戏开发的基本架构
开发语言·c++·架构