2024年3月GESPC++三级真题解析

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

题目123456789101112131415
答案

D

C

C

B

C

C

A

C

C

C

D

A

B

C

C

1.整数-5的16位补码表⽰是( )。

A.1005

B.1006

C.FFFA

D.FFFB

【答案】D

【解析】负数的补码计算方法如下:将负数的绝对值转换为二进制表示形式;对二进制表示形式按位取反(0变1,1变0),符号位不变;将取反后的二进制数末位加1,即得到负数的补码表示形式。

-5的二进制表示形式是1000 0000 0000 0101

-5的反码是1111 1111 1111 1010

-5的补码是1111 1111 1111 1011

转为16进制表示是FFFB,选D

2.如果16位短整数 -2 的⼆进制是"FFFE",则短整数 -4 的⼗六进制是( )。

A.FF04

B.FFFA

C.FFFC

D.FFFH

【答案】C

【解析】负数的补码计算方法如下:将负数的绝对值转换为二进制表示形式;对二进制表示形式取反(0变1,1变0),符号位不变;将取反后的二进制数末位加1,即得到负数的补码表示形式。或者通过-4=(-2)+(-2)来计算。

-4的二进制表示形式是1000 0000 0000 0100

-4的反码是1111 1111 1111 1011

-4的补码是1111 1111 1111 1100

转为16进制表示是FFFC,选C

3.下⾯C++代码执⾏后的输出是( )。
int main() {

cout << (3 | 16) << endl;

cout << endl;

return 0;

}

A. 3

B. 16

C. 19

D. 48

【答案】C

【解析】位运算中的“或”(|)操作符的计算规则是:对两个数的二进制表示形式的每一位进行或运算,只要有一个为1,结果就为1。具体规则如下:

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

3的2进制表示是0000 0011

16的2进制表示是0001 0000

结果为0001 0011,转为10进制是19,选C

4.定义整数int x=-5 ,则执⾏C++代码cout << (x == (x<<1>>1)) 输出是( )。

A. 0

B. 1

C. -5

D. 5

【答案】B
【考纲知识点】

【解析】根据C++中的位运算规则,(x << 1 >> 1) 相当于将x左移1位再右移1位,即保持原值不变。因此,(x == (x << 1 >> 1)) 表达式为真,输出结果为1。选B

5.已知字符'0'的ASCII编码的十进制表示为48,则执行下面C++代码后,输出是( )。
int main() {

string s = "316";

int n = s.length();

int x = 0;

for (int i = 0; i < n; i++)

x += s[i];

cout << x << endl;

cout << endl;

return 0;

}

A. 10

B. 58

C. 154

D. 316

【答案】C

【考纲知识点】

【解析】数字的ASCII编码是连续的。’1’的ASCII编码是49,’3’的ASCII编码是51,’6’的ASCII编码是54,加起来是154。选C

6.下面C++代码执行后数组中大于0的数的特征是( )。
int main() {

int a[20], i;

for (i = 0; i < 20; i++)

a[i] = i + 1;

for (int i = 0; i < 20; i++)

if ((a[i] % 2) && (a[i] % 3))

a[i] = 0;

for (i = 0; i < 20; i++)

if (a[i])

cout << a[i] << " ";

cout << endl;

return 0;

}

A. 2的倍数

B. 3的倍数

C. 能被2或3整除的数

D. 能被2和3同时整除的数

【答案】C

【考纲知识点】

【解析】定义长度为20的数组,数组的值分别是1到20。a[i]%2是a[i]%2!=0的简写,同理a[i]%3是a[i]%3!=0的简写,两个条件同时满足既不是2的倍数也不是3的倍数的时候,该项置为0。剩余的项要么是2的倍数,要么是3的倍数。选C

7.执⾏下⾯C++代码后输出的第⼀个数是( )。
int main()

{

int a[20],i;

for(i = 0; i < 20; i++)

a[i] = i+1;

for( ; i > 0; i--)

cout << a[i-1] << " ";

cout << endl;

return 0;

}

A. 20

B. 19

C. 1

D.不确定

【答案】A

【考纲知识点】

【解析】定义长度为20的数组,数组的值分别是1到20。第一个for循环里面i是到20结束的。第二个循环输出的第一项就是a[19],也就是20。选A

8.在下列代码的横线处填写( ),可以使得输出是GESP IS INTERESTING。
int main()

{

string str="gEsP is Interesting";

int x = str.length();

for(int i = 0; i < x; i++)

if ((str[i]>='a') && (str[i]<='z'))

________________________;

cout << str << endl;

cout << endl;

return 0;

}

A. str[i]+='a'-'A'

B. str[i]+=20

C. str[i]+='A'-'a'

D. 无法实现
【答案】C

【考纲知识点】

【解析】本题是考察小写转大写。对字符串str的每一位,都去判断是否是小写,如果是小写,需要将小写转换为对应的大写。小写a对应的ASCII码是97,大写A对应的ASCII是65,相差32,需要减去32。选项A是加32,选项C是减32.选C

9.假设英⽂句⼦由若⼲词构成。下⾯C++代码统计输出的词数是( )。
int main()

{

string str="gEsP is Interesting !";

int x = str.length();

int nwords = 0;

for(int i = 0; i < x; i++)

if (str[i]==' '){

nwords++;

while(str[++i]==' ') ;

}

cout << nwords << endl;

cout << endl;

return 0;

}

A.1

B.2

C.3

D.4

【答案】C

【考纲知识点】

【解析】本题是考察字符串中单词的个数。对于字符串str,如果某一位是空格,nwords就加一,就是代表空格前面有一个单词。后面接着的while循环是用来去掉连续的空格的.str里面共有3个空格,对应3个单词,分别是gEsP,is, Interesting. 选C

10.C++的字符变量的码值是整数,下⾯字⾯量形式的字符码值最⼤的是( )。

A. 100

B. 075

C. 0x70

D. 0x60

【答案】C

【考纲知识点】

【解析】本题是考察进制转换。075是八进制,转为十进制61;0x70是16进制,转为十进制是112;0x60是16进制,转为十进制是96。选C

11.下⾯C++程序执⾏的结果是( )。
int main()

{

int a[20],i;

int cnt=0;

for(i = 0; i < 20; i++)

a[i] = i+1;

for( ; i > 1; i--)

if((a[i-1]+a[i-2])%3)

cnt++;

cout << cnt << endl;

cout << endl;

return 0;

}

A. 5

B. 6

C. 10

D. 12

【答案】D

【考纲知识点】

【解析】本题是考察数组的理解。定义长度20的数组,数组的值是从1到20。for循环是要把相邻两项的和不是3的倍数统计出来。可以反过来算,相邻两项和是3的倍数的,一共有1+2=3,4+5=9,7+8=15,10+11=21, 13+14=26,16+17=33六项。因为是>1,所以总共18项,减去6项是12项。选D

12.定义字符数组 char str[20]= {'G','E','S','P'};,则 str 的字符串长度为( )。

A. 4

B. 5

C. 19

D. 20

【答案】A

【考纲知识点】

【解析】字符数组char str[20] = {'G', 'E', 'S', 'P'}; 中包含的字符串为"GESP",因此该字符串的长度为4。在定义字符数组时没有显式地包含字符串结束符\0,那么字符串长度就是实际字符的个数,不包括\0。选A

13.定义整型变量int a=3, b=16 ,则a|b的值和a+b的关系是( )。

A.⼤于

B.等于

C.⼩于

D.等于或⼩于

【答案】B

【考纲知识点】

【解析】位运算中的“或”(|)操作符的计算规则是:对两个数的二进制表示形式的每一位进行或运算,只要有一个为1,结果就为1。具体规则如下:

0 | 0 = 0

0 | 1 = 1

1 | 0 = 1

1 | 1 = 1

3的2进制表示是0000 0011

16的2进制表示是0001 0000

结果为0001 0011,转为10进制是19.a|b=19,a+b=19,选B

14.⼩杨的⽗母最近刚刚给他买了⼀块华为⼿表,他说⼿表上跑的是鸿蒙,这个鸿蒙是( )。

A.⼩程序

B.计时器

C.操作系统

D.话⼈物
【答案】C

【考纲知识点】

【解析】鸿蒙是指华为公司开发的自研操作系统HarmonyOS。选C

15.中国计算机学会(CCF)在2024年1⽉27⽇的颁奖典礼上颁布了王选奖,王选先⽣的重⼤贡献是( )。

A.制造⾃动驾驶汽车

B.创⽴培训学校

C.发明汉字激光照排系统

D.成⽴⽅正公司
【答案】C

【考纲知识点】

【解析】王选先⽣的重⼤贡献是发明汉字激光照排系统。选C

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

题目12345678910
答案

×

×

×

×

×

×

1.任意整数a的⼆进制反码与补码都有1位不同。( )

【答案】错误

【考纲知识点】

【解析】正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。

[+1] = [00000001]原= [00000001]反

[-1] = [10000001]原= [11111110]反

正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1. (即在反码的基础上+1)

[+1] = [00000001]原= [00000001]反= [00000001]补  

[-1] = [10000001]原= [11111110]反= [11111111]补

可以看到,[+1]的反码与补码完全一致,所以错误。

2.对整型变量int a = 3 ,执⾏C++代码a<<2将把2输出到a中。( )

【答案】错误

【考纲知识点】

【解析】<<是位运算符号,a<<2代表a的二进制表示左移2位。

3.下⾯C++代码可以计算1到100的累加和,采⽤的是穷举法。
int main()

{

int i,sum=0;

for(int i = 1; i <= 100 ; i++)

sum += i;

cout << sum << endl;

cout << endl;

return 0;

}

【答案】错误

【考纲知识点】

【解析】这段C++ 代码采用的是循环遍历逐个累加,是模拟法,而不是穷举法。

4.⼀个int 类型变量a ,执⾏操作(a<<2>>2) 后的值⼀定是a 。( )

【答案】错误

【考纲知识点】

【解析】当a=2147483647(int类型的最大值时),a<< 2变为 -4,-4>> 2变为-1。

5.在C++语⾔中,(010<<1) 执⾏结果是100 。( )

【答案】错误

【考纲知识点】

【解析】在C++中,整数字面量以0开头表示八进制数。因此,(010<<1)的意思是将八进制数010 左移1 位。在C++中,左移运算符(<<)表示按位左移操作。

010 的八进制表示是8,对应的二进制表示是1000。将其左移1 位,得到的结果是10000,即十进制的16。

因此,执行(010<<1) 的结果是16,而不是100。

6.执行下面C++代码后将输出 2 。( )
int main()

{

string str="gEsP is Interesting";

int x = str.find("s");

cout << x << endl;

cout << endl;

return 0;

}

【答案】正确

【考纲知识点】

【解析】find函数用于找到的子字符串 “s”的第一个字符在原字符串str中的位置,而gEsPxxx  的 “s”在下标位2的地方第一次出现,因此答案正确。

7.在C++语⾔中,字符数组被定义时,它的⼤⼩可以调整。( )

【答案】错误

【考纲知识点】

【解析】在C++语言中,字符数组的大小在定义时是固定的,无法调整。一旦字符数组被定义并分配了固定大小的内存空间,其大小是不可更改的。

8.对定义的数组int a[7]={2,0,2,4,3,1,6} ,可以⽤简单循环就找到其中最⼩的整数。( )

【答案】正确

【考纲知识点】

【解析】使用一个循环遍历数组a,从第二个元素开始与当前最小值进行比较,如果找到更小的值,则更新最小值。最终输出找到的最小整数。

因此,使用简单循环是可以找到数组中的最小整数的。

   int min = a[0]; // 假设第一个元素为最小值

   for (int i = 1; i < 7; i++) {

       if (a[i] < min) {

           min = a[i]; // 更新最小值

       }

}

9.⼩杨今年春节回奶奶家了,奶奶家的数字电视要设置ip地址并接⼊到WIFI盒⼦才能收看节⽬,那这个WIFI盒⼦具有路由器的功能。( )

【答案】正确

【考纲知识点】

【解析】设置IP地址和接入无线网络是通常用于连接到路由器的步骤。

10.任何⼀个for 循环都可以转化为等价的while 循环( )。

【答案】正确

【考纲知识点】

【解析】任何一个for 循环都可以转化为等价的while 循环。for 循环和while 循环在功能上是等价的,只是语法上的不同。

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

1、字母求和

【问题描述】

小杨同学发明了一种新型密码,对于每一个小写英文字母,该小写字母代表了一个正整数,即该字母在字母顺序中的位置,例如字母a代表了正整数1,字母b代表了正整数2;对于每一个大写英文字母,该大写字母代表了一个负整数,即该字母的ASCI码的相反数,例如字母A代表了正整数-65。小杨同学利用这种方式对一个整数进行了加密并得到了一个由大写字母和小写字母组成的字符串,该字符串中每个字母所代表数字的总和即为加密前的整数,例如aAc对应的加密前的整数为1+(-65)+3=-61。

对于给定的字符串,请你计算出它对应的加密前的整数是多少。

【输入描述】

第一行一个正整数n,表示字符串中字母的个数。

第二行一个由大写字母和小写字母的字符串T,代表加密后得到的字符串。

【输出描述】

输出一行一个整数,代表加密前的整数。

【样例输入 1】

3

aAc

【样例输出 1】

-61

【题目大意】

【考纲知识点】

【解题思路】

此题需要计算给定字符串中字母的值之和。遍历输入的字符串的每一个字符,将大写、小写字母的索引值累加到ans中,最后输出答案。按照题目要求具体步骤如下:

1.输入字符串str,断言n 等于字符串str 的长度;

2.遍历字符串str,对每个字符,判断是大写还是小写或其他:

(1)小写为str[i] >= 'a' && str[i] <= 'z',其对应的索引值(a=1,b=2,...,z=26),计算时ans += str[i] - 'a' + 1;

(2)大写为str[i] >= 'A' && str[i] <= 'Z' ,其对应的索引值为该字母的ASCII 码的相反数计算直接减去即可:ans -= str[i];、

(3)若为其他字符,则触发断言错误

3.最后输出答案ans

【参考程序】
#include <iostream>

#include <assert.h>

#include <cstdlib>

#include <cstdio>

#include <cstring>

using namespace std;

const int N = 100005;

char str[N];

int main() {

int n;

cin >> n;

cin >> str;

assert(n == strlen(str));

int ans = 0;

for (int i = 0; i < n; i ++) {

if (str[i] >= 'a' && str[i] <= 'z')

ans += str[i] - 'a' + 1;

else if (str[i] >= 'A' && str[i] <= 'Z')

ans -= str[i];

else

assert(false);

}

cout << ans << endl;

return 0;

}

2、完全平方数

【问题描述】

小杨同学有一个包含n个非负整数的序列A,他想要知道其中有多少对下标组合< i,j > (1 ≤i,j≤n,i < j),使得Ai+ Aj是完全平方数。

如果x是完全平方数,则存在非负整数y使得y×y= x 。

【输入描述】

第一行一个非负整数n,表示非负整数个数。

第二行包含n个非负整数A1,A2,...,An”,表示序列A包含的非负整数。

【输出描述】

输出一个非负整数,表示和是完全平方数的非负整数对数。

【样例输入 】

5

1 4 3 3 5

【样例输出 】

3

【题目大意】

【考纲知识点】

【解题思路】

此题需要计算给定数组中两个元素的和,如果和是一个完全平方数,则将计数器ans 的值加1。

可以使用嵌套的循环,通过遍历数组中的元素,计算两两元素之和,并判断和是否是完全平方数。如果是,则计数器ans 的值加1。

注意:sqrt是用于开根号的数学函数,返回结果是浮点数。在计算机中,浮点数运算可能存在精度问题。为了避免由于浮点数精度损失而导致的不准确结果,常常会采取一些技巧来处理。其中,1e-7是一个非常小的数,表示1 乘以10 的负7 次方,即0.0000001。

int t = sqrt(m + 1e-7)。将其加到被开方的数m 上,用t来记录m开根号的结果。再用t*t ==m来判断m是否是一个完全平方数,可以在某种程度上弥补浮点数运算的精度问题。

【参考程序】
#include <bits/stdc++.h>

using namespace std;

const int N = 1010;

int a[N];

int main(){

int n;

cin >> n;

for(int i=1;i<=n;i++){

cin>>a[i];

}

int ans=0;

for(int i=1;i<=n;i++){

for(int j=i+1;j<=n;j++){

int m = a[i] + a[j];

int t = sqrt(m + 1e-7);

if(t * t == m)

ans++;

}

}

cout<<ans<<"\n";

}

### 20243月C++三级考试大纲、教材、练习题及解析 #### 考试大纲概述 针对20243月举行的C++三级考试,官方尚未公布详细的最新版考试大纲。然而,基于以往的经验相似级别的考试标准,可以推测该级别主要考察考生对于高级编程技巧的理解与应用能力[^4]。 #### 推荐教材 为了更好地准备此次考试,建议参考以下几类资源: - **基础理论书籍**:选择适合小学生或初级学者使用的C++入门书籍,这类书通常会详细介绍语法结构以及简单的程序设计概念[^2]。 - **实践指南**:寻找专注于竞赛训练的材料,特别是那些提供历真题解答深入剖析的文章或视频教程,例如关于BCSP-X小高组初赛的内容就非常有价值[^1]。 - **专项技能提升读物**:考虑到特定知识点的重要性(如数据类型的精确理解),挑选能够补充这些细节信息的作品也是必要的。比如,《信息学奥林匹克辞典》虽然可能未涵盖所有细微之处,但对于构建全面的知识体系仍然很有帮助。 #### 练习题推荐 通过解决实际问题来巩固所学知识至关重要。可以从以下几个方面入手获取高质量的练习题目: - 参加在线模拟测试,像CSP-J/S系列赛事的第一轮初赛模拟题就是一个不错的选择。 - 关注专业论坛上的讨论帖,例如某位博主分享的一级真题及其详细解释,这有助于熟悉不同难度层次下的命题风格[^3]。 #### 题目解析实例 下面给出一道典型的倒序输出整数序列的问题作为示范,并附上完整的解决方案: ```cpp #include <iostream> using namespace std; int main() { int n; cout << "请输入正整数个数:"; cin >> n; int* nums = new int[n]; cout << "依次输入" << n << "个正整数:" ; for (int i=0; i<n ;i++) { cin>>nums[i]; } cout<<"逆序输出:"<<endl; for(int j=n-1;j>=0;j--){ cout<<nums[j]<<" "; } delete[] nums; return 0; } ``` 此段代码实现了从键盘接收一组正整数并将其按相反顺序打印出来的功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值