CCF-GESP 等级考试 2024年3月认证C++三级真题解析
2024年3月真题
一、单选题(每题2分,共30分)
正确答案:D
考察知识点:数据编码
解析:机器数是计算机中对数字的二进制表示形式,首位表示符号,0表示正数,1表示负数,其余位为数值位。真值是数字的实际值。常见二进制表示形式(数据编码)有原码、反码、补码。
原码:符号位加上真值的绝对值的二进制表示。
反码:正数的反码与原码相同;负数的反码是对其原码除符号位外的所有位取反。
补码:正数的补码与原码相同;负数的补码是其反码加 1。
[-5] = [1000000000000101]原[1000 0000 0000 0101]_{原}[1000000000000101]原=[1111111111111010]反[1111 1111 1111 1010]_{反}[1111111111111010]反=[1111111111111011]补[1111 1111 1111 1011]_{补}[1111111111111011]补=[FFFB]补[F F F B]_{补}[FFFB]补。答案为D。
正确答案:C
考察知识点:数据编码、位运算
解析:计算机中,存储数据采用其补码形式,而补码可以不考虑符号直接进行运算。
按位左移(<<):整体左移,右边补0,左边丢弃。 a<<b a*2^(b):a乘2的b次方
-4为-2的二倍,可用 -2<<1 来求解 -4。
-2 = [FFFE][FFFE][FFFE] = [1111111111111110]2[1111111111111110]_2[1111111111111110]2
-2<<1 = [1111111111111100]2[1111111111111100]_2[1111111111111100]2 = [FFFC][FFFC][FFFC]。答案为C。
正确答案:C
考察知识点:进制转换、位运算
解析:按位或(|):按位进行运算:对应位都为0,结果为0,否则为1。
3|16 = 00011200011_2000112 | 10000210000_2100002 = 10011210011_2100112=19,答案为C。
正确答案:B
考察知识点:进制转换、数据编码、位运算
解析:在计算机中,有符号整数以补码存储。-5 的补码是1111111111111011补1111 1111 1111 1011_补1111111111111011补,左移1位结果为:1111111111110111补1111 1111 1111 0111_补1111111111110111补,右移一位结果为1111111111111011补1111 1111 1111 1011_补1111111111111011补,依然是-5。答案为 B。
正确答案:C
考察知识点:字符类型、ASCII码、字符串操作
解析:本题代码实现的功能是将字符串s中所有字符的ASCII码累加起来。字符’0’的ASCII码是48,字符’3’的ASCII码是51,字符’1’的ASCII码是49,字符’6’的ASCII码是54,累加和为154,答案为C。
正确答案:C
考察知识点:基本数据类型
解析:本题代码中将满足条件:a[i]%2&&a[i]%3(不能被2整除且不能被3整除) 的数组元素置为0。则最终能被2整除或者能被3整除的数组元素仍然大于0,答案为C。
正确答案:A
考察知识点:一维数组
解析:第一个for循环给数组元素逐个赋值,a[i]=i+1。i是定义在循环外部,因此第一个循环执行完毕,i的值为20,即第二个循环循环变量的初始值为20,则输出的第一个值为a[20-1]的值,即20,答案为A。
正确答案:C
考察知识点:字符串及其操作
解析:本题代码实现的功能将字符串str中的所有字母转成大写字母,遍历整个字符串,当检测到小写字母时,将其转成大写字母。横向处填写小写字母转大写字母的代码,答案选 C。
正确答案:C
考察知识点:字符串及其操作
解析:代码通过统计空格的数量来间接统计单词数(单词数 = 空格数 + 1):
遍历字符串,遇到空格时,nwords 加 1,并跳过后续连续的空格(while(str[++i]==’ '))。
最终 nwords 的值为空格的数量,单词数为 nwords + 1。
字符串 str 中有 3 个空格(分隔 gESP 与 is、is 与 Interesting、Interesting 与 !),因此 nwords = 3。答案为C。
正确答案:C
考察知识点:字符类型、ASCII码、进制
解析:ASCII编码的范围为0~127。
B选项0开头,8进制,转成十进制为61。
C选项0x开头,16进制,转成十进制为112。
D选项0x开头,16进制,转成十进制为96。
都在合理范围内,且C最大。答案为C。
正确答案:D
考察知识点:数组
解析:第一个循环给数组元素逐个赋值,a[i]=i+1。循环变量 i 定义在循环外部,因此两个循环公用,第二个循环循环变量初始值为20,从后往前,当相邻两个元素的和不是3的倍数时,cnt自增1。19+18、18+17、16+15、15+14、13+12、12+11、10+9、9+8、7+6、6+5、4+3、3+2。共12个,答案为D。
正确答案:A
考察知识点:字符数组
解析:字符数组部分初始化,未初始化的部分值为0,即字符’\0’。字符数组存储字符串,字符串的长度为’\0’之前的字符个数,因此本题中str的字符串长度为4,答案为A。
正确答案:B
考察知识点:位运算
解析:按位或(|):按位进行运算:对应位都为0,结果为0,否则为1。
a | b = 3|16 = 00011200011_2000112 | 10000210000_2100002 = 10011210011_2100112= 19;
a+b=3+16=19。答案为B。
正确答案:C
考察知识点:计算机基础
解析:鸿蒙通常指华为公司发布的鸿蒙操作系统,是一款基于微内核的面向全场景的分布式操作系统。它旨在打破不同设备之间的壁垒,让多种设备通过系统直接连通,实现应用程序在手机、平板电脑、电视、智能手表、智能家电等多种设备上的跨端运行。答案为C。
正确答案:C
考察知识点:计算机历史
解析:王选,是中国著名计算机学家,重大贡献:发明汉字激光照排系统、华光系列和方正电子出版系统等。答案为C。
二、判断题(每题2分,共20分)
正确答案:错误
考察知识点:数据编码
解析:整数的原码、反码、补码相同。表述错误。
正确答案:错误
考察知识点:位运算符-左移运算符
解析:这里的<<为左移运算符,作用是将整数的二进制形式整体左移,右边补0,左边丢弃。 表述错误。
正确答案:错误
考察知识点:流程控制语句-循环
解析:这段代码的说法错误。穷举法是逐一列举所有可能的情况来寻找答案,而此代码是通过循环依次累加 1 到 100 的数,采用的是累加求和的方法,并非穷举法。代码运行后会计算出 1 到 100 的累加和为 5050 并输出。表述错误。
正确答案:错误
考察知识点:位运算-按位左移、按位右移
解析:按位左移(<<):整体左移,右边补0,左边丢弃。
按位右移(>>):整体右移,正数左边补0,负数左边补1,右边丢弃。
若a为负数,左移2位,左边丢弃2位,可能改变a的符号;再进行右移,高位根据此时a的符号进行补位,可能会导致结果与原 a 不同。所以执行操作 (a << 2) >> 2 后的值不一定是 a。表述错误。
正确答案:错误
考察知识点:进制、位运算-按位左移
解析:0开头表示这个数是一个八进制数,因此需要先将其转成二进制再进行左移1位的运算。(010)——>(10)8(10)_8(10)8——>(001000)2(001000)_2(001000)2,左移1位的结果:(010000)2(010000)_2(010000)2,转成十进制为16。表述错误。
正确答案:正确
考察知识点:字符串及其操作
解析:str.find(s1), 在字符串str中从查找字符串或者字符,找到返回第一次出现的下标,找不到返回-1。显然字符串中存在字符串"s",且第一次出现的下标为2。表述正确。
正确答案:错误
考察知识点:字符数组
解析:数组一旦完成定义,其大小即固定,无法调整。字符数组也遵循这个规则。表述错误。
正确答案:正确
考察知识点:数组
解析:可以用简单循环找到其中最小的整数。首先假设数组的第一个元素为最小值,然后通过循环遍历数组剩下的元素,若遇到比当前最小值还小的元素,就更新最小值,最终得到数组中的最小整数。表述正确。
正确答案:正确
考察知识点:计算机基础
解析:路由器的主要功能是连接不同的网络(如将家庭局域网连接到互联网),并为连接的设备分配 IP 地址等网络参数,实现网络数据的转发等。能让数字电视设置 IP 地址并接入以收看节目,说明该 WIFI 盒子可以为设备分配 IP 地址等网络相关功能,具备路由器的基本功能。表述正确。
正确答案:正确
考察知识点:控制语句结构-循环
解析:本题考察 while 循环和 for 循环,他们之间可以进行等价转化。表述正确。
三、编程题(每题25分,共50分)
本题考察:字符串操作。
#include<bits/stdc++.h>
using namespace std;
int main(){int n, sum=0;string s;cin>>n>>s;for(int i=0;i<n;i++){if(s[i]>='a'&&s[i]<='z') sum+=s[i]-'a'+1; //小写字母转成对应的数字else sum-=s[i]; //大写字母转成对应的数字}cout<<sum;return 0;
}
本题考察 枚举算法:列出所有的可能性,判断是否符合要求。
#include<bits/stdc++.h>
using namespace std;
int main(){int n,a[1005]={},cnt=0;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=n;i++){for(int j=i+1;j<=n;j++){int m=a[i]+a[j]; //计算a[i]+a[j], 保证i<j//判断m是否是完全平方数:存在两个相同的整数相乘等于这个数int t=sqrt(m); //计算m的平方根,转成整数if(t*t==m) cnt++; }}cout<<cnt;return 0;
}