
GESP C++三级样题卷 解析
备考九月C++考试,把每道题理解透彻,把每道题的理解写出来也能让自己有更深的理解 (
不是专业人士,可能会有错误,欢迎指出 :)
选择题
1
原题在:https://gesp.ccf.org.cn/101/1010/10088.html ,C++三级样题
先了解原码、反码、补码分别是什么。以整数为例,假定长度为8位
原码
原码比较容易理解
先举两个例子:
【+100】原 = 01100100
【+10】原=00001010
【-100】原=11100100
【-10】原=10001010
第一位表示的是正负符号,0是正,1是负,后面的位数表示的是数值的二进制,如果位数不够补0代替
0 1100100=【+100】原
第一位0表示正,后面100的二进制为:1100100,所以+100的原码是01100100
0 0001010= 【+10】原
第一位0表示正,10的二进制是1010,上面假定了长度为8,所有在1010前面补上3个0,所以+10的原码是00001010
负数原码同理,第一位变成1。
反码
对于正数,反码与原码相同,
对于负数,符号位不变,其数值位的1变0,0变1。
计算反码一般要把原码先求出来。
两个例子:
【+100】原 = 01100100
【+100】反 = 01100100
【-100】原=11100100
【-100】反=10011011
样例详解:
【+100】原 = 01100100
【+100】反 = 01100100
对于正数,反码与原码相同,所以+100的反码跟原码相同,都为01100100
【-100】原=11100100
【-100】反=10011011
对于负数,第一位(符号位)不变,其余位1变0,0变1,所以-100的反码为10011011
补码
对于正数,补码与原码相同,
对于负数,符号位不变,其数值位反码后,在最低位加1。
计算反码一般要把反码先求出来。
两个例子:
【+100】原 = 01100100
【+100】反 = 01100100
【+100】补 = 01100100
【-100】原=11100100
【-100】反=10011011
【-100】补 =10011100
样例详解:
【+100】原 = 01100100
【+100】反 = 01100100
【+100】补 = 01100100
对于正数,补码与原码相同,所以+100的补码为01100100
【-100】原=11100100
【-100】反=10011011
【-100】补 =10011100
对于负数,符号位不变,其数值位反码后,在最低位加1,意思就是,-100的反码数值部分(0011011)加1,可以转换成十进制计算(也可以直接用逢二进一直接计算,更简单),即:0011011(前面0的忽略),转换成10进制为27,27加1等于28,28转换成二进制为0011100(由于假定位数为8,补上两个0),得出-100的补码为10011100。
回到题目
所以答案为A
2
先了解什么是移位运算
符号:<<左移 、>>右移
左移:
1左移n位:1 << n=2^n(2的n次方)
n左移1位:n << 1=2*n
右移:
n右移1位 :n >> 1=|n/2.0|
左移例子:
100<<2(100左移2位)
100的二进制为1100100
左移二位为110010000(就是整体左移2位,不够补0),所以100左移2位为400
右移例子:
100>>2(100右移2位)
100的二进制为1100100
右移二位为1100100(舍弃两个0),所以100右移2位为25
100>>3(100右移3位)
100的二进制为01100100(第一位符号位正数为0)
左移三位为01100100(舍弃两个0一个1),所以100右移3位为12
回到题目
所以选A
3
先了解C语言的位运算符有哪些
C语言中的位运算符:
& 按位与
| 按位或
^ 按位异或
~取反
>>右移
<<左移
所以选D
4
C++中数组长度就是个数(从1开始)
所以选C
5
C++定义数组语句
int array[5]
所以选A
6
选B,比较简单
7
选B,比较简单
8
十六进制与10进制的对应关系是:0-9对应0-9、A-F对应10-15。
所以选A
9
一个一个选项看就行,这道题有点坑,首先排除B和C,原因:
len()
和getLength()
,它们并不是C++标准库中的函数。它们可能是某些类或库中定义的自定义函数,具体用途取决于它们所在的类或库。
然后看A和C
两个都可以获取字符串长度,但是:
length()
是C++标准库中std::string
类的成员函数,它用来获取字符串的长度。
strlen()
是C语言中的一个函数,它用来计算C风格字符串的长度。
所以,根据题目标准答案,以及对题目的理解来说,应该选择C语言中非库中的一个函数,即strlen ??
这道题还有点不懂,有点神奇
10
不知道怎么说,反正是B,这种一般靠感觉吧,排除C、D然后我就不懂了...
NewBing解释:
11
这种题都算必考了,只不过选项一直在变,直接上运行:
ABD全都出现错误答案,所以答案为C
12
这种题出现次数也很多,都很类似
直接上运行:
所以答案是C
13
先把题目翻译成代码,然后运行就行
所以答案是B
14
所以选D
15
主要看下C和D选项的符号代表什么
选项C:按位异或运算符
选项D:指针取地址运算符
然后就是按位异或了
按位异或有一个功能就是交换两个数的值,如:
所以这道题选C。
选择题完
引用&参考列表:
https://blog.csdn.net/weixin_54029352/article/details/126480816 |
判断题
参考:Bing AI - 搜索
编程题
编程题没有固定答案,每个人答案都不会相同,个人比较喜欢List,所以提前学了
第一题
#include <iostream>
#include<algorithm>
#include "list"
using namespace std;
int main(){
list<int> thing{};
int n;
int sum;
int money;
int buynum=0;
cin>>n;
for (int i=1;i<=n;i++){
cin>>sum;
thing.push_back(sum);
}
cin>>money;
int lenlist=thing.size();
for (int j=1;j<=lenlist;j++){
if(money-thing.front()<0){
cout<<"no money"<<money<<endl;
}else{
cout<<"have money"<<money<<endl;
money-=thing.front();
buynum+=1;
}
thing.pop_front();
}
cout<<buynum;
}//6月3级样题最后一题
第二题
这道题感觉要求写的不太明确,所以我就根据样例代码写了个自己的代码
#include <iostream>
#include<algorithm>
#include "list"
using namespace std;
int main(){
int n,r;
cin>>n>>r;
if (r>=16){
int sum;
cout<<n/r;
sum=n%r;
cout<<(char)(sum+55);
}else{
if (r==10){
cout<<n;
}else{
list<int> quy{};
while (n>0){
quy.push_back(n%r);
n=n/r;
}
quy.reverse();
int size=quy.size();
for (int i=1;i<=size;i++){
cout<<quy.front();
quy.pop_front();
}
}
}
}//6月3级样题倒数第二题
- 感谢你赐予我前进的力量