2023 年 9 月 GESP C++ 四级真题解析

一、单选题(每题2分,共30分)
1 们所使用的手机上安装的 App 通常指的是( )。
A. 款操作系统
B. 款应用软件
C. 种通话设备
D. 以上都不对
【答案】 B
【考纲知识点】 计算机基础
【解析】本题属于考察计算机基础知识。APP是英语单词application的简写,代表应用软件的意思。
    
2 、下列流程图的输出结果是? ( )
A. 9
B. 7
C. 5
D. 11
【答案】A
【考纲知识点】 流程图和多层循环语句
【解析】本题属于考察计算机循环结构嵌套选择结构知识。根据流程图,n<=5 时会一直循环,每次循环先判断是否满足m*n>20的条件,然后对m进行不同的赋 值。例如:n=1,m=1,m*n不大于20,m会计算,赋值为3,依次类推,最终m的结 果是9,选A。
    
3 、对包含 n 个元素的数组进 ⾏冒泡排序 ,平均时间复杂度一般为( )。
A.O(n
B.O(n log n
C.O(n 2 )
D. 以上都不正确
【答案】 C
【考纲知识点】 冒泡排序
【解析】本题属于考察简单排序算法的时间复杂度,选 C
     
4 、下列关于 C++ ⾔中指针的叙述 ,不正确的是( )。
A. 可以定义指向 int 类型的指针。
B. 可以定义指向 定义结构体类型的指针。
C. 定义结构体类型可以包含指针类型的元素。
D. 不能定义指向 void 类型的指针 ,那没有意义。
【答案】 D
【考纲知识点】 指针的概念及使用
【解析】本题属于考察计算机指针知识。可以指向 void 类型。
     
5 、下列关于 C++ ⾔中数组的叙述 ,不正确的是( )。
A. 一维数组可以用来表示数列。
B. 二维数组可以用来表示矩阵。
C. 三维数组可以用来表示空间中物体的形状。
D. 世界是三维的 ,所以定义四维数组没有意义。
【答案】 D
【考纲知识点】 数组
【解析】本题属于考察计算机数组知识。世界可以用多维描述,定义四维也有 意义。
      
    
6 、下列关于 C++ ⾔中函数的叙述 ,正确的是( )。
A. 函数调用前必须定义。
B. 函数调用时必须提供足够的实际参数。
C. 函数定义前必须声明。
D. 函数声明只能写在函数调用前。
【答案】 B
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数调用时如果缺少实参将不能正确 运行。
   
    
7 、下列关于 C++ ⾔中函数的叙述 ,不正确的是( )。
A. 两个函数的声明可以相同。
B. 两个函数的局部变量可以重名。
C. 两个函数的参数可以重名。
D. 两个函数可以重名。
【答案】 A
【考纲知识点】 函数的概念及使用
【解析】本题属于考察计算机函数知识。函数声明时不能相同。
      
8 个二维数组定义为 char array[3][10]; ,则这个二维数组占用内存的大⼩ 为( )。
A. 10
B. 30
C. 32
D. 48
【答案】 B
【考纲知识点】 二维数组知识
【解析】本题属于考察 C++二维字符数组知识。内存大小和数组需要用的空间 有关。 3 10 列,需要 3*10=30 个空间,选 B
       
9 、如果 n int 类型的变量, 个指针变量定义为 int *p=&n; ,则下列说法正确的 是( )。
A. 指针变量 p 的值与变量 n 是相同
B. 指针变量 p 的值与变量 n 的地址是相同的。
C. 指针变量 p 指向的值为 'n'
D. 指针变量 p 指向的值与变量 n 的地址是相同的。
【答案】 B
【考纲知识点】 指针
【解析】本题属于考察 C++ 指针知识。指针的值保存的是变量的地址,所以选 B
       
       
10 个三维数组定义为 long long array[6][6][6]; ,则 array[1][2][3]
array[3][2][1] 在内存中的 位置相差多少字节? ( )
A. 70 字节
B. 198 字节
C. 560 字节
D. 无法确定
【答案】 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
        
11 、如果 a int 类型的变量,且 a 的值为 6 ,则执 a = ~a; 之后, a的值会 是( )。
A. -6
B. 6
C. -7
D. 7
【答案】 C
【考纲知识点】 位运算
【解析】本题属于考察 C++ 位运算知识。 6按位取反运算,注意符号位也取反, 呈现的是补码,转换过来就是 -7 。具体过程:
00000110 (取反操作)
11111001 (补码)
11111000 (补码 -1= 反码)
10000111 (负数的原码,注意此时取反符号位不变)
      
12 个数组定义为 int a[5] = {1, 2, 3, 4, 5}; 个指针定义为int * p = &a[2]; ,则执 *p = a[1]; 后 ,数组 a 中的值会变为( )。
A. {1, 2, 2, 4, 5}
B. {1, 3, 3, 4, 5}
C. {1, 2, 3, 3, 5}
D. {1, 2, 4, 4, 5}
【答案】 A
【考纲知识点】 指针和数组
【解析】本题属于考察 C++ 指针和数组知识。 P 指针指向的是 a[2] ,将 a[1]的值 赋值给 p 指向的变量 a[2] ,数组中 a[1] 将等于 a[2]
 
     
13 、下列关于 C++语言中异常处理的叙述,正确的是( )。
A. try 句可以有多个 catch 句与之对应。
B. 如果 try 句在执 时发 异常 ,就 定会进 catch 句执
C. 如果 try 句中没有可能发 异常的语句 ,会产 编译错误。
D. catch 句处理异常后 ,会重新执 与之对应的 try 句。
【答案】 A
【考纲知识点】 异常处理
【解析】本题属于考察 C++ 处理异常知识。 A 是正确的。 B选项中,得到对应类 型中的异常才能 catch 操作。
      
14 、执 以下 C++ ⾔程序后,输出结果是( )。
A. 0
B. 5
C. 55
D. 法确定。
【答案】 D
【考纲知识点】 循环和一维数组的基本运用
【解析】本题属于考察 C++循环结构和一维数组的知识。这是求斐波那契数列 的代码,数组的范围是 [0,9] ,所以对 fib[10] 操作后,越界访问结果无法确定。
       
15 、在下列代码的横线处填写( ),完成对有 n int类型元素的数组 array 排序。
A. int j = 1; j < n; j++
B. int j = 0; j < n; j++
C. int j = 0; j < i - 1; j++
D. int j = 0; j < i; j++
【答案】 C
【考纲知识点】 函数和数组的知识
【解析】本题属于考察 C++函数和数组的知识。题目已知,要求从小到大的冒 泡排序,如果前一个比后一个大,就交换位置,外层循环从 n开始,判断的区间 逐渐减小,判断循环范围 C正确。
      
  二、判断题(每题2分,共20分)
1 、在 C++ 语言中 ,指针变量在逻辑上指向另 ⼀个变量在内存中的位置 ,指针 变量本身不占用内存。
【答案】错误
【考纲知识点】 指针类型的概念
【解析】本题是 C++ 指针类型的知识,指针是个变量,占用内存。
     
2 、对 N 个元素的数组执 ⼊排序算法 ,通常的时间复杂度是O(N^2)。
【答案】正确
【考纲知识点】 排序算法
【解析】本题是 C++ 排序算法的知识,插入排序常用时间复杂度是 O(N^2)
     
3 、在 C++ 中 ,每个变量都有其作用域。
【答案】正确
【考纲知识点】 变量
【解析】本题是C++变量的知识,变量都有作用域。
    
4 、在 C++ ⾔中 ,在函数调用时 ,通过引用传递的参数不会复制实际参数, 因此不会额外占用内存。
【答案】错误
【考纲知识点】 函数
【解析】本题是C++函数的知识,传参时函数的参数也会是一个新的变量,占用 内存。
     
5 、在 C++ 中,可以通过定义结构体,定义 个新的数据类型。
【答案】正确
【考纲知识点】 结构体
【解析】本题是 C++ 语言的知识,定义结构体可以认为定义一个新的数据类型。
   
6 、在 C++ ⾔中 ,可以定义结构体类型的数组变量 ,定义结构体时也可以包 含数组成员。
【答案】正确
【考纲知识点】 结构体
【解析】本题是 C++ 结构体的知识,可以包含数组。
   
7 、如果希望记录 10 个最长为 99字节的字符串,可以将字符串数组定义 为 char s[10][100];
【答案】正确
【考纲知识点】 数组
【解析】本题是 C++ 字符数组的知识,定义长度大于等于要求。
   
8 、一个可能抛出异常的函数,调用它的位置没有在 try ⼦句中,会引起编译错 误。
【答案】错误
【考纲知识点】 函数
【解析】本题是 C++ 函数的知识,编译不会报错。
   
9 == := 都是 C++ 的运算符。
【答案】错误
【考纲知识点】 运算符
【解析】本题是 C++ 语法的知识, == 是运算符。
    
10 、通过使用文件重定向操作,可以将程序中输出到 cout的内容输出到文件中, 这是常用的记录程序运 日志的方法之
【答案】正确
【考纲知识点】 文件操作
【解析】本题是 C++ 文件操作的知识,正确。
   
三、编程题 (每题 25 分,共 50 分)
1 、进制转换
问题描述
N 进制数指的是逢 N 的计数制。例如, 们日常 活中 多使用 ⼗进制计数 ,而计算机底层则 般使用二进制。除此之外, 进制和 六进制在 ⼀些场合 也是常 的计数制( 六进制中, 般使用字母A 至F表 ⽰⼗⾄⼗五;本题中, ⼗⼀ 进制到 五进制也是类似的)。
在本题中,我们将给出 N 个不同进制的数。你需要分别把它们转换成 ⼗进制 数。
  
提示
对于任意 L K 进制数,假设其最右边的数位为第 0位,最左边的数位为 第 L - 1 位,我们只需要将其第 i 位的数码乘以权值 K i,再将每位的结果相加 ,即可得到原 K 进制数对应的 进制数。下 是两个例
1. 进制数 1362 对应的 进制数为 1 × 8 ^ 3 3 × 8^  2 6 × 8 ^ 1 2 × 8^  0 = 754
2. 六进制数 3F0 对应的 进制数为 3 × 16 ^ 2 15 × 16^  1 + 0 × 16^  0 = 1008
   
输入描述
的第 ⼀⾏ 进制表示的整数 N 。接下来 N ,每 ⾏⼀ 个整数 K,随后 是 个空格,紧接着是 K 进制数,表示需要转换的数。保证所有 K进制数均 由数字和 写字母组成,且不以 0 开头 。保证 K 进制数合法。
保证 N ≤ 1000 ;保证 2 ≤ K ≤ 16
保证所有 K 进制数的位数不超过 9
   
输出描述
输出 N 行,每 个十进制数,表 对应 K 进制数的十进制数值。
样例输入 1
2
8 1362
16 3F0
样例输出 1
754
1008
样例输入 2
2
2 11011
10 123456789
样例输出 2
27
123456789
【题目大意】
1.有 n k 进制的整数,将它们分别转换成对应的十进制。
   
【考纲知识点】
1.基本运算、输入输出语句、循环、进制转换的知识。
   
【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.输入 n 行,每行 2 个整数,分别表示进制和要转换的数字;
3.按求进制方法求即可。例如: (abc) 2 =a*2 ^ 2 +b*2 ^ 1 +c*2 ^ 0
注意:转成十进制的时候要开long long 
 直接模拟
【参考程序】
#include<iostream>
using namespace std;
//n进制转十进制 
long long n_to_ten(int n,string s){
	long long sum=0,a=1;
	for(int i=s.size()-1;i>=0;i--){
		if(s[i]>='0'&&s[i]<='9'){
			sum+=(s[i]-'0')*a;
		}else {
			sum+=(s[i]-'A'+10)*a;
		}
		a*=n;
	} 
	return sum;
} 
int main(){
	int n,x;
	string s;
	cin>>n;
	while(n--){
		cin>>x>>s;
		cout<<n_to_ten(x,s)<<endl;
	}
	return 0;
}

2、变长编码  

  
问题描述
小明刚刚学习了三种整数编码方式 :原码、反码、补码,并了解到计算机存储整 数通常使用补码。但他总是觉得生活中很少用到2^31-1这么大的数,生活中常用 的 0 ~ 100 这种数也同样需要用 4个字节的补码表示,太浪费了些。热爱学习的小 明通过搜索,发现了一种正整数的变长编码方式。这种编码方式的规则如下 :
1. 对于给定的正整数,首先将其表达为二进制形式。例如, (0){10} =(0){2}, (926){10}=(1110011110){2}
2. 将二进制数从低位到高位切分成每组 7 bit ,不足 7bit 的在高位用 0填补。例如 , (0){2} 变为 0000000 的一组 ,(1110011110){2} 变为 0011110 0000111的两组。
3.由代表低位的组开始,为其加入最高位。如果这组是最后一组,则在最高位 填上 0 ,否则在最高位填上 1 。于是, 0 的变长编码为 00000000 一个字节, 926的 变长编码为 10011110 00000111 两个字节。
这种编码方式可以用更少的字节表达比较小的数,也可以用很多的字节表达非 常大的数。例如, 987654321012345678 的二讲制为(0001101 1011010 0110110 1001011 1110100 0100110 1001000 0010110 1001110){2} 于是它的变长编码为 (十 六进制表示 ) CE 96 C8 A6 F4 CB B6 DA OD ,共 9 个字节。
你能通过编写程序,找到一个正整数的变长编码吗 ?
    
  
输入描述
⼀⾏ ,包含 个正整数 N 。约定 0 N≤10^18。
   
输出描述
输出 ⼀⾏ ,输出 N 对应的变长编码的每个字节 ,每个字节均以 2 ⼗六进制表 示(其中, A-F 使 ⽤⼤ 写字母表 ) , 两个字节间以空格分隔。
样例输入 1
0
样例输出 1
00
 
样例输入 2
926
样例输出 2
9E 07
  
样例输入 3
987654321012345678
样例输出 3
CE 96 C8 A6 F4 CB B6 DA 0D
【题目大意】
1.给一个正整数,根据题目要求找它的变长编码,变长编码用 16 进制表示。
【考纲知识点】
1.基本运算、输入输出语句、一维数组、位运算的知识。
【解题思路】
1.按题目要求定义好需要的变量,并实现输入;
2.根据题意, 1 、将 n 对应的二进制,每 7 1 组,保存起来;
3.除了包含最高位那组,其他组最前面都增加 1 ,例如中间一组是 0001111, 最前面加 1 变成 10001111
4.注意输出是先输出低位的数组,输出内容用 16 进制表示即可。
【参考程序】
#include <iostream>
using namespace std;
long long n;
//数字转16进制字符
char to_Hex(int x){
    if (x>9){
        return x-10+'A';
    }else{
        return x+'0';
    }
}
int main() {
    cin>>n;
    while (n>0){
        int t=n&0x7f;//取最后7位
        if (n>0x7f){//不是最高组 
            t|=0x80;//首位加1
        }
        //t>>4获取t的高4位,t&0xf获取t的低4位 
        cout<<to_Hex(t>>4)<<to_Hex(t&0x0f)<<" ";
        n=(n>>7);//去掉最后7位
    }
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值