备考九月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://www.bilibili.com/read/cv8276594/

https://blog.csdn.net/m0_64183293/article/details/122519405

https://blog.csdn.net/weixin_54029352/article/details/126480816

https://blog.csdn.net/kybd2006/article/details/3727218

Bing AI - 搜索


判断题

参考: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级样题倒数第二题