CCF-GESP 等级考试 2024年6月认证C++三级真题解析
2024年6月真题
一、单选题(每题2分,共30分)
正确答案:C
考察知识点:计算机基础与编程环境
解析:CCF 组织的 GESP 认证考试第 1 级可选择的认证语言有 Scratch、Python、C++ ,共 3 种。答案为C。
正确答案:B
考察知识点:流程图的概念与描述、闰年判断
解析:菱形中应该填写的闰年判断的条件。答案为B。
正确答案:C
考察知识点:基本数据类型
解析:int类型占4字节,32位,首位表示符号,剩余31位表示数值,因此能够表示的数据范围为:−231-2^{31}−231~231−12^{31}-1231−1。答案为C。
正确答案:C
考察知识点:进制转换
解析:十进制整数转其他进制(k进制):短除法,短除k取余,直到商为0,逆序输出余数。一直除8,直到数变为0,过程中将余数存入数组中,最后将数组中内容从后往前进行输出。答案为C
正确答案:C
考察知识点:进制转换
解析:其他进制(k进制)转十进制:按位权展开后求和,小数点往前,位权分别是:k0k^0k0,k1k^1k1,k2k^2k2,…,小数点往后,位权分别是:k−1k^{-1}k−1,k−2k^{-2}k−2,k−3k^{-3}k−3,…
(101.11)2(101.11)_{2}(101.11)2=1∗22+0∗21+1∗20+1∗2−1+1∗2−21*2^{2}+0*2^{1}+1*2^{0}+1*2^{-1}+1*2^{-2}1∗22+0∗21+1∗20+1∗2−1+1∗2−2=5.755.755.75,答案为C。
正确答案:B
考察知识点:流程图
解析:按箭头走向,流程图各图标含义进行计算即可。答案为B。
正确答案:C
考察知识点:进制转换、位运算
解析:按位右移(>>):整体右移,正数左边补0,负数左边补1,右边丢弃。有:a>>b 相当于:a/2^(b):a除以2的b次方。答案为C。
正确答案:C
考察知识点:位运算
解析:位运算-按位异或。按位异或运算规则:对应位相同为0,不同为 0。因此:a ^ 0=a, a ^ a=0。
此外按位异或运算符满足交换律和结合律:a ^ b = b ^ a; a ^ b ^ c = a ^ (b ^ c);
结合以上,计算结果为C,答案为C。
正确答案:C
考察知识点:字符数组
解析:定义字符数组并进行初始化,不给定长度,则长度为存储的字符个数。使用字符数组存储字符串,除了存储有效字符,还需要存储字符串的结尾标识字符’\0’,因此本题字符数组的长度为5。答案为C。
正确答案:B
考察知识点:数组
解析:输出7,7是数组中的最大值,本题代码的功能是查找数组中的最大值,max存储最大值,初始化为0,当数组元素大于max,则更新max。答案选B。
正确答案:A
考察知识点:数组
解析:本题代码13、14行通过输出数组arr的内容输出满足条件的数,从下标0开始,因此之前应该将满足条件的值存储数组arr中,且从下标0开始存储。count表示满足条件的数的个数,初始化为0,横线处填写arr[count++]=i,答案为A。
正确答案:C
考察知识点:字符类型,ASCII、字符串操作
解析:x初始化为0,通过循环,将s中的每个字符累加到x中,字符参与运算,实际上是其ASCII码参与运算。字符’0’ ASCII码为48,字符’6’ ASCII码为54,字符’2’ ASCII码为50,字符’9’ ASCII码为57,全部加起来结果为209。答案为C。
正确答案:B
考察知识点:数组、循环、枚举算法
解析:count记录满足条件的人数,因此当数组的某个元素大于135,count加1,否则加0。选项B使用了条件运算符代替了if语句。答案为B。
正确答案:D
考察知识点:D
解析:对于单引号,将其直接放在双引号内是无法正常进行输出的,因此要使用转义字符,也即单引号的表示为’\‘’。答案为D。
正确答案:A
考察知识点:字符串及其操作函数
解析:本题实现的功能是将原字符串中的 ‘.’ 字符替换成空格字符。
find()函数用去查找字符串是否出现了某个字符串或者字符,出现了返回第一次出现的下标,用法:s.find(s1)
在 C++ 的 std::string 中,string::npos 是一个静态成员常量,它表示 “不存在的位置” 或者 “无效的位置”。
substr()函数用于截取子字符串,substr(pos,n),从pos位置截取长度为n的。
第12行token每次都是从0开始截取,因此str需要每次更新。答案为A。
二、判断题(每题2分,共20分)
正确答案:正确
考察知识点:计算机基础与编程环境
解析:GESP测试主要考察编程能力,同一级别能力要求不局限于特定编程语言。表述正确。
正确答案:正确
考察知识点:进制转换,数据编码
解析:机器数是计算机中对数字的二进制表示形式,首位表示符号,0表示正数,1表示负数,其余位为数值位。真值是数字的实际值。常见二进制表示形式(数据编码)有原码、反码、补码。
原码:符号位加上真值的绝对值的二进制表示。
反码:正数的反码与原码相同;负数的反码是对其原码除符号位外的所有位取反。
补码:正数的补码与原码相同;负数的补码是其反码加 1。
[-6] ——> [1000000000000110]原[1000 0000 0000 0110]_原[1000000000000110]原——>[1111111111111001]反[1111 1111 1111 1001]_{反}[1111111111111001]反——>[1111111111111010]补[1111 1111 1111 1010]_{补}[1111111111111010]补 对应十六进制为 FFFA。表述正确。
正确答案:正确
考察知识点:数据编码
解析:补码的这一优点十分关键。在计算机中,硬件实现加法相对容易,而减法较复杂。利用补码,比如计算 a−b,可转化为 a+(−b) 的补码相加。这样无需单独设计复杂的减法电路,只需加法器就能完成加、减运算,大大简化了计算机的硬件结构,降低了硬件设计的难度与成本,提升了运算效率。表述正确。
正确答案:错误
考察知识点:字符类型、字符串
解析:字符常量’\0’常用来表示字符串结尾,其ASCII码值为0,和字符常量’0’不同,字符常量’0’的ASCII码值为48。表述错误。
正确答案:错误
考察知识点:数组
解析:数组 是一种线性数据结构,用于在连续的内存空间中存储相同类型的元素的集合,因此使用数组存储的元素在内存中肯定是连续存放的。表述错误。
正确答案:错误
考察知识点:数组
解析:C++允许对数组的每个基础类型的元素进行单独赋值。另外,C++允许对数组整体赋值,但只能发生在定义的同时进行整体赋值,即数组的初始化操作。官方对这道题给的答案是错误,可解释为整体赋值是受限操作,因此表述错误。
正确答案:正确
考察知识点:位运算
解析:按位或(|)运算:两个整数按二进制位进行运算:对应位都为0,结果为0,否则为1。
a|3 的运算结果为3,意味着除最后两位之外,其余为都为0;而最后两位可以为0,也可以为1。因此a的取值在0到3之间。表述正确。
正确答案:错误
考察知识点:进制、位运算
解析:按位与(&)运算:两个整数按二进制位进行运算,对应位都为1,结果为1,否则为0。
变量a:0b开头为二进制数,变量b:0开头为八进制数,要先将其转成二进制再进行运算。
(0b1010)2(0b1010)_2(0b1010)2 & (01100)8(01100)_8(01100)8 ——>(000000001010)2(0000 0000 1010)_2(000000001010)2 & (001001000000)2(0010 0100 0000)_2(001001000000)2 ——>(000000000000)2(0000 0000 0000)_2(000000000000)2,计算结果为0。表述错误。
正确答案:正确
考察知识点:数组、控制语句结构-循环
解析:这道题有一个明显的错误,定义了长度为5的数组s,则数组下标为0~4,因此第191919~202020行循环输出数组内容存在下标越界的错误。但这道题貌似不是考察这个的,抛开这个不谈。
第131313~181818行while循环中,a=rand()%10,a的可能值为0~9;只有a%3==(i+1)%3成立时,才会给s[i++]赋值a,因此,s[1]的可能值为2、5、8,s[2]的可能值为0、3、6、9,s[3]的可能值为1、4、7,s[4]的可能值为2、5、8,s[5]的可能值为0、3、6、9。即便不考虑下标越界的问题, 可能的输出也不会是89781。表述正确。
正确答案:正确
考察知识点:枚举算法
解析:可以使用 for 循环枚举从 1000 到 9999 的所有四位数;利用整数除法和取余运算拆分数字,分别得到四位数的前两位和后两位(例如 3025 / 100=30,3025 % 100 = 25);最后计算前两位与后两位之和的平方,若等于原四位数,则该数是 “雷劈数”。表述正确。
三、编程题(每题25分,共50分)
本题考察 字符操作。字符向后偏移n,如果向后偏移过程中超过Z,则从A开始继续数,直到偏移够n。
英文字母26个,这是个周期性问题。也算史上相当简单的三级题了。
#include<bits/stdc++.h>
using namespace std;
int main() {int n;cin>>n;for(int i=0; i<26; i++) {cout<<char((i+n)%26+'A');}return 0;
}
本题考察 数组、常用系统函数、多组测试样例处理。
对于每一组测试样例,输入n个数,查找其中是否存在一个数aia_iai是所有数aka_kak, 1<=k<=n1<=k<=n1<=k<=n 的倍数。倍数至少是1倍,因此如果存在,则这个数肯定是所有数中的最大值。
输入的同时求解最大值,再遍历所有数,判断是否全部可以整除。因此需要使用数组存储所有所有数。
#include<bits/stdc++.h>
using namespace std;
int main() {int t, n, arr[100001], maxx, flag;cin>>t;while(t--){ //多组测试样例的处理 cin>>n;maxx=0; //查找是否存在一个数是所有数的倍数,如果存在,则这个数肯定是所有数中的最大值 for(int i=0; i<n; i++){cin>>arr[i];maxx = max(maxx, arr[i]); }flag=0; //遍历所有数,判断最大值是否是所有数的倍数,flag为0表示是。 for(int i=0; i<n; i++){if(maxx%arr[i] != 0){flag=1;break;}}if(flag==0) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;
}