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

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

题目123456789101112131415
答案

B

C

A

D

C

B

C

C

A

D

D

C

D

C

B

1.下列代码中,输出结果是( )
#include<iostream>

using namespace std;

int main()

{

double a=0.9;

double b=1.0;

if(((b-a)==0.1))

{

cout<<"Equal"<<endl;

}

else

{

cout<<"Not equal"<<endl;

}

}

A. Equal

B. Not equal

C. 程序不能正确执行

D. 没有输出
【答案】B

【考纲知识点】

【解析】考察浮点数知识题目,浮点数在计算机中是以二进制形式存储的,而某些十进制小数无法精确表示成二进制小数。因此,在进行浮点数运算时可能会出现微小的舍入误差。例如,0.9和0.1都无法在二进制下精确表示,这可能导致b - a的结果不完全等于0.1,因此选择B选项。

2.关于计算机中的编码,下列说法中正确的是()

A. 机器数的形式值和真值是一致的

B. 原码就是符号位加上真值

C. 机器数是带符号的

D. [-1]=[1000 0001]原=[1111 1111]反

【答案】C

【考纲知识点】

【解析】计算机基础知识题目,对于正数形式值和真值相等,如果是负数有符号位的区别并不一致,原码应是符号位加上形式值,-1的原码表示正确,但是反码应该是1111 1110,因此选择C选项。

3. 8进制数3703转换成16进制数是()

A.7C3

B.7A3

C.7B3

D.7D3
【答案】A

【考纲知识点】

【解析】进制转换知识题目,可以采用常规方法,先将八进制3703转换成十进制,再转换为十六进制,也可采用快捷方法利用一分三的技巧将3703转二进制,再利用四合一技巧转换为十六进制,最终结果是7C3,因此选择A选项。

4.0.8125变成二进制是( )。

A. 0.1110

B. 0.1 1111 1011 1101

C. 0.1 1111 1011 1100

D. 0.1101

【答案】D

【考纲知识点】

【解析】考察浮点数进制转换知识题目,将十进制小数转换为二进制小数可以采用不断的乘以2并且记录每次乘积的整数部分来完成,0.8125*2=1.625整数部分为1,0.625*2=1.25整数部分为1,0.25*2=0.5整数部分为0,0.5*2=1整数部分为1,最终是0.1101,因此选择D选项。

5.下面说法正确的是( )
A. (22&01)==(22&&01)成立

B. (23|11)==30

C. (23|10)==31

D. (23|01)==31

【答案】C

【考纲知识点】

【解析】考察位运算知识题目,a选项计算后左侧为false右侧为true所以是不成立的,b选项计算结果应为31即(10111)|(1011),c选项正确,d选项计算结果应为0,因此选择C选项。

6.下列说法正确的是()
A. 2>>1和1>>1的值是一样的

B. (2>>2)和(1>>1)的值是一样的

C. (11^00)和(1^0)的值是一样的

D. (~0的输出值是1)

【答案】B

【考纲知识点】

【解析】考察位运算知识题目,a选项计算结果是1和0选项错误,b选项计算结果都为0选项正确,从选项计算结果是11和1选项错误,d选项按位取反,不同类型的输出也不同,对于有符号整数int输出的是-1,因为补码形式是1111 1111,因此选择B选项。

7.下列代码实现的是( )
void Swap(int &a, int &b) {

if (a != b) {

a ^= b;

b ^= a;

a ^= b;

}

}

A. a和b的异或

B. a和b的同或

C. a和b的值交换

D. a和b的高低位互换

【答案】C

【考纲知识点】

【解析】考察位运算知识题目,最终实现效果就是a和b的值互换,此题可以采用举出具体实例的方式求解,可以设置a=2,b=3即a为0010,b为0011,第一步后a为0001,第二步骤后b为0010,第三步骤后a为0011,因此选择C选项。

8.a&~1运算实现的是( )。

A. 使a的最低位为1

B. 使a的最高位为1
C. 使a的最低位为0

D. 使a的最高位为0

【答案】C

【考纲知识点】

【解析】考察位运算知识题目,变量a和~1做按位与操作,常规32位整数下1的最低位是1,取反后最低位为0,a变量最低位无论是1还是0计算结果都会是使最低位为0,因此选择C选项。

9.a=1010 1110,a<<2,下面关于这个说法正确的是 ( )。

A. a的值变为1011 1000

B. a的值变为1011 1010

C. a的值变为0101 1101

D. a的值变为0101 1100

【答案】A

【考纲知识点】

【解析】考察位运算知识题目,此题目直接移动即可,整体左移两位低位补0,最终结果是1011 1000,因此选择A选项。

10.下列程序中,result和result2输出分别是 ( )

long a = 123;

int b = 1;

long result = a & b;

cout<<result<<endl;

long a2 = -123;

unsigned int b2 = -1;

long result2 = a2 & b2;

cout<<result2<<endl;
A. 123 -1

B. 123 -123

C. 1 -1

D. 1 -123

【答案】D

【考纲知识点】

【解析】考察位运算知识题目,首先是a和b做按位与运算,(0111 1011)&(0000 0001)最终结果是1,第二组是a2和b2按位与运算,(0111 1011)&(1111 1111)结果是0111 1011也就是123,因为a2是-123最高位是1,b2是无符号int即所有位数位1的最大值,最高位也为1,相当于符号位计算后也为1,最终是-123,所以选择D选项。

11.陈A歹种植一批农作物,第一天需要浇水一次,随后的两天(第2、第3天),每天需要浇水2次,再随后的3天(第4、第5、第6天),需要每天浇水3次,这样持续下去,随后的n天,每天需要浇水n次。请问在100天里,总

共浇了多少次水( )

A. 994

B. 996

C. 995

D. 945

【答案】D

【考纲知识点】

【解析】考察逻辑运算题目,按照题面描述分阶段第一天浇水次数是1*1次,第二天浇水次数是2*2次...以此类推到所有阶段累加的天数到100天,最终是累加到13的平方和共91天总次数819次,剩余9天第14阶段每天14次再加9*14次共819+126=945次,因此选择D选项。

12.关于一维数组,下列程序能够正确执行的是( )。

A. 
int a[10];

int sum=0;

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

sum=sum+a[i];

}

B.
int a[10]={1,2,3,4,5,6,7,8,9,10};

int sum=0;

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

sum=sum+a[i];

}

C.

int a[10]={1,2,3,4,5,6,7,8,9,10};

int sum=0;

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

um=sum+a[i];

}

D.
int a[10]={0};

int sum=0;

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

sum=sum+a[i];

}

【答案】C

【考纲知识点】

【解析】考察一维数组知识题目,题目中明显的错误比较容易发现其中ABD三个选项中循环都超范围,设置长度为10数组位置共10个但是下标是0~9不存在a[10]三个选项中都是i<=10,因此选择C选项。

13.下面的程序中,会输出( )。
int a[10]={1,2,3,4,5,6,7,8,9,10};

cout<<a[10]<<endl;

A. 1

B. 0

C. 10

D. 不确定的值

【答案】D

【考纲知识点】

【解析】考察一维数组知识题目,设置长度为10数组位置共10个但是下标是0~9不存在a[10],会输出不确定的值,因此选择D选项。

14.有ABCD4个人,其中一个是小偷,每个人说一句话,只有小偷说的是假话,其中A说:不是我。B说:是C。C说:是D。D说:C瞎说,请问谁是小偷( )。

A. A

B. B

C. C

D. D
【答案】C

【考纲知识点】

【解析】考察逻辑推理知识题目,此题可以采用假设法分别假设四人中的一人是小偷,也就是说的是假话,看是否与另外三人说的话相悖,如果是则排除,如果都不相悖就是小偷,或者其他合理推理方法均可,因此选择C选项。

15.下列程序输出的是()
string str = "Hello,CHAD";

cout << str.find("A") << '\n';

A. 9

B. 8

C. 7
D. 6

【答案】B

【考纲知识点】

【解析】考察字符串汉字字节数知识题目,find函数返回的是字符A的位置,但是前面是一个汉字占用两字节,输出显示的位置会是8并不是7,因此选择B选项。

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

题目12345678910
答案

×

×

×

1.+1和-1的原码进行1+(-1)计算的结果是-2 。( )

【答案】正确

【考纲知识点】

【解析】考察编码知识题目,最高位符号位是0+1=1为负数,低位的1+1结果为2,因此题目说法正确。

2.~1 的输出值是 -2 。( )

【答案】正确

【考纲知识点】

【解析】考察编码知识题目,~1可以理解为对0000 0001进行取反1111 1110,这个编码恰好是-2的补码,程序中用补码表示,所以输出值是-2,因此题目说法正确。

3.~1 = 1111 1110 。( )

【答案】正确

【考纲知识点】

【解析】考察编码知识题目,与第二题相同,~1是对0000 0001按位进行取反1111 1110,因此题目说法正确。

4.取 X 的低四位,可以用 Y = 0000 1111 ,用 X&Y 获取 X 的低四位。( )

【答案】正确

【考纲知识点】

【解析】考察位运算知识题目,y = 0000 1111,最低位是四个1,可以通过和1做&运算的结果来判断出x的低四位分别是什么,因此题目说法正确。

5.下列程序输出的是 A 。( )
char x=65;

x++;

cout<<x++<<endl;

【答案】错误

【考纲知识点】

【解析】题面给定的程序中char类型变量x为65,加1后为66由于类型是char类型,输出的内容是字符B并不是A,因此题目说法错误。

6.下列程序输出的是 3 。( )
string str="CHADai";

size_t pos = str.find('D');

cout<<pos<<endl;

【答案】正确

【考纲知识点】

【解析】考察编码字符串知识,下标从0开始汉字两个字节,所以字符A下标是2,字符D下标是3,题面中的size_t通常是无符号整数类型,此处当作int理解即可,不影响题目判断,因此题目说法正确。

7.下列程序将输出 1 。( )
int a[10]={1};

cout<<a[1]<<endl;

【答案】错误

【考纲知识点】

【解析】考察数组知识,题面中这种数组初始化方式,是将a[0]设置为1,其余位置都是0填充,所以应该是输出0而不是1,因此题目说法错误。

8.下列程序将输出 A 。( )
int a=65;

cout<<(char)a<<endl

【答案】正确

【考纲知识点】

【解析】考察数据类型转换知识,题目中的65转换成字符char类型,对应ASCII码关系,对应字符A,因此题目说法正确。

9.16进制数 AB ,表示成2进制数是 10101011 。( )

【答案】正确

【考纲知识点】

【解析】考察进制转换知识,将十六进制数字转换成二进制可以采用一分四的方式,A对应1010,B对应1011,因此题目说法正确

10.def (十六进制) = 103231 (五进制)。( )

【答案】错误

【考纲知识点】

【解析】考察进制转换知识,def转换为十六进制可以先将十六进制转换为十进制,再将十进制转换成五进制,def分别对应13、14、15,转为十进制是13*16²+14*16+15*1=3567,转为五进制后是103232,题目中103231最后一位书写错误,因此题目说法错误。

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

 

1、平衡序列

【问题描述】

小杨有一个包含n个正整数的序列a,他认为一个序列是平衡的当且仅当存在一个正整数i(1≤ i<n)使得序列第1个到第i个数字的总和等于第i+1个到第n个数字的总和。

小杨想请你判断序列a是否是平衡的。

【输入描述】

第一行包含一个正整数t,代表测试用例组数。

接下来是t组测试用例。对于每组测试用例,一共两行。

第一行包含一个正整数n,代表序列长度。

第二行包含n个正整数,代表序列a。

【输出描述】

对于每组测试用例,如果序列a是否是平衡的,输出Yes,否则输出No。

【样例输入 1】

3

3

1 2 3

4

2 3 1 4

5

1 2 3 4 5

【样例输出 1】

Yes
Yes
No

【题目大意】

【考纲知识点】

【解题思路】
根据题面描述的要求,先按着数据组数设置好循环次数,即t次。每组数据正常输入且输入过程中累加求出总和,接下来从第1个位置到第n-1个位置遍历,如果累加中tot变量等于了数组总和得一半,则剩下的一定就是另一半了,这也是为什么遍历到n-1位置的原因,至少保留一个作为平衡的另一半,最后每组数据对应一个输出(Yes/No)配合换行格式即可。

【参考程序】

#include<bits/stdc++.h>

using namespace std;

int a[10010];

int main(){

int t;

cin>>t;

while(t--){

int n;

cin>>n;

int sum=0;

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

cin>>a[i];

sum+=a[i];

}

int tot=0,fl=0;

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

tot+=a[i];

if(tot*2==sum){

fl=1;

break;

}

}

if(fl)cout<<"Yes\n";

else cout<<"No\n";

}

}

2、回文拼接

【问题描述】

一个字符串是回文串,当且仅当该字符串从前往后读和从后往前读是一样的,例如,aabaa和ceddcc都是回文串,但abcd不是。

小杨有n个仅包含小写字母的字符串,他想请你编写程序判断每个字符串是否由两个长度至少为2的回文串前后拼接而成。

【输入描述】

第一行包含一个正整数n,代表字符串数量。

之后n行每行一个仅包含小写字母的字符串。

【输出描述】

对于每个字符串输出一行,如果该字符串由两个长度至少为2的回文串前后拼接而成则输出Yes,否则输出No。


【样例输入】

4

Abcd

Aabbb

Aaac

abcdd

【样例输出】

No

Yes

No

No

【题目大意】

【考纲知识点】

【解题思路】

首先需要清楚回文格式这样一个小概念,题面描述要求是整个字符串是否为连个回文格式的子串拼接而成的,所以可以使用循环从中间切开,分成前后很多组尝试,检测前后两个字串是否都是回文格式,题目是多组输入数据,所以循环n次,每次一个输入是,对应一个输出(Yes/No)。由于题目要求长度至少为2,所以对于每个string s,测量长度后从2开始循环到m-2位置,这样变量j刚好用于strsub函数中的位置和长度,求得两个字串s1和s2后使用两个关于k的循环分别反向拼接形成两个反向的串t1和t2,如果t1==s1 && t2==s2证明前后两个字符串都是回文格式的,标记fl = 1,根据fl的状态分支判断,输出答案即可。

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

using namespace std;

int main(){

int n,k;

cin>>n;

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

string s;

cin>>s;

int m = s.length();

int fl = 0;

for(int j=2;j<=m-2;j++){

string s1=s.substr(0,j);

string s2=s.substr(j,m-j);

string t1="",t2="";

for(int k=(int)s1.size()-1;k>=0;k--)t1+=s1[k];

for(int k=(int)s2.size()-1;k>=0;k--)t2+=s2[k];

if(t1==s1&&t2==s2){

fl=1;

break;

}

}

if(fl)cout<<"Yes\n";

else cout<<"No\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、付费专栏及课程。

余额充值