原题在:https://gesp.ccf.org.cn/101/1010/10092.html ,C++六月认证三级真题

不是专业人士,可能会有错误,欢迎指出 :)

选择题

1

高级语言是一种独立于机器,面向过程或对象的编程语言,相对于汇编语言和机器语言而言,它是较接近自然语言和数学公式的编程,基本脱离了机器的硬件系统,用人们更易理解的方式编写程序。常见的高级语言有C/C++,易语言,Java等。

高级语言需要通过编译成执行平台中可识别的执行文件才可以执行

所以选D

2

二进制转换十进制方法:

二进制1010 转十进制

转换公式:(1010)= (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰) = (10)

从右到左用二进制的每个数去乘以2的相应次方(次方从0开始),再将其每个数进行相加。

先看整数部分,二进制11的十进制是3

再看小数部分,跟整数部分差不多,但是乘的方变成了负数

如0.01二进制转十进制

然后整数部分和小数部分加起来,就是3+0.25=3.25

所以选D

3

Ascii编码只需要记住两个主要的就行,大写字母A编码为65,小写字母a为97,剩下的往后推就行,比如大写字母B就为66

大写F字母的Ascii值就为70

10进制转换其他进制就毕竟简单,十进制70转16进制方法:

70/16=4....6

4/16=0....4

反向读余数,就是46。

所以选A

4

C++的各种运算符

  • 算术运算符:+,-,*,/,%(取模)。

  • 关系运算符:==,!=,>,<,>=,<=。

  • 逻辑运算符:&&(逻辑与),||(逻辑或),!(逻辑非)。

  • 位运算符:&(按位与),|(按位或),^(按位异或),~(按位取反),<<(左移),>>(右移)。

  • 赋值运算符:=,+=,-=,*=,/=,%=。

  • 杂项运算符:sizeof(返回数据类型的大小),&(返回变量的地址),*(指针变量)。

所以选D

5

数组str的长度为6。因为字符串中还有一个空字符’\0’

所以选C

6

在C++中,int类型的长度为4个字节,char类型的长度为1个字节,double类型的长度为8个字节。

3×8=24

所以选A

7

所以选B

8

所以选B

9

A. 数组必须先定义后使用。这是正确的。

B. 数组的所有元素在内存中是连续存放的。这也是正确的。

C. 除了字符数组,在定义数组时“[]”内必须有常数。这个选项不正确。在定义数组时,除了字符数组,数组的“[]”内必须有常数。

D. 不能对数组赋值,但可以对数组的每个基础类型的元素赋值。这也是正确的。

所以选C

10

...

11

首先排除B和D,主要看A和C

A选项如果a=4,b=3,会输出a=b,所以A不对,答案就是C

所以选C

12

直接上运行

所以选A

13

这道题每次都考,原理就是用按位异或交换两个变量的值,如

b = a ^ b;
a = a ^ b;
b = a ^ b;

所以选B

14

这道题选D,以上都不对

15

首先排除A,全部加上就等于31,然后就是上运行了,所以选B

选择题完

判断题

编程题

1.春游

【问题描述】

老师带领同学们春游。已知班上有N位同学,每位同学有从0 到N−1的唯一编号。到了集合时间,老师确认是否所有同学都到达了集合地点,就让同学们报出自己的编号。到达的同学都会报出的编号,不会报出别人的编号,但有的同学很顽皮,会多次报出。你能帮老师找出有哪些同学没有到达吗?

【输入描述】 输入包含 2 行。第一行包含两个整数N和M,表示班级有N位同学,同学们共有M次报出编号。约定 2 ≤ N, M ≤ 1000。 第二行包含M个整数,分别为M次报出的编号。约定所有编号都在合理范围内。

【输出描述】 输出一行。如果所有同学都到达,则输出N;否则由小到大输出所有未到达的同学编号,空格分隔。

【样例输入 1】 3 3 0 2 1

【样例输出 1】 3

【样例输入 2】 3 5 0 0 0 0 0

【样例输出 2】 1 2

我的代码:

int main(){
    bool arr[1000];
    int n,m;
    cin>>n>>m;
    for(int i=0;i<1000;i++){
        arr[i]= false;
    }
    int code;
    for (int i=0;i<m;i++){
        cin>>code;
        arr[code]= true;
    }
    bool all= true;
    for (int i=0;i<n;i++){
        if(!arr[i]){
            if (all){
            cout<<i;
            all= false;
            }else{
                cout<<" "<<i;
            }
        }
    }
    if (all){
        cout<<n;
    }
    return 0;
}

2.密码合规检测

【问题描述】 网站注册需要有用户名和密码,编写程序以检查用户输入密码的有效性。合规的密码应满足以下要求: 1、只能由 a-z 之间 26 个小写字母、A-Z 之间 26 个大写字母、0-9 之间10个数字以及!@#$四个特殊字符构成。 2、密码最短长度:6 个字符,密码最大长度:12 个字符。3、大写字母、小写字母和数字必须至少有其中两种,以及至少有四个特殊字符中的一个。

【输入描述】 输入一行不含空格的字符串。约定长度不超过 100。该字符串被英文逗号分隔为多段,作为多组被检测密码。

【输出描述】 输出若干行,每行输出一组合规的密码。 输出顺序以输入先后为序,即先输入则先输出。

【样例输入 1】 seHJ12!@,sjdkffH$123,sdf!@&12HDHa!,123&^YUhg@!

【样例输出 1】 seHJ12!@ sjdkffH$123

【样例解释 1】 输入被英文逗号分为了四组被检测密码:“seHJ12!@”、“sjdkffH$123”、“sdf!@&12HDHa!”、“123&^YUhg@!”。其中,“sdf!@&12HDHa!”长度超过12个字符,不合规;“123&^YUhg@!”包含四个特殊字符之外的字符“^”,不合规。

我的代码:

bool check(string a){
//    string a="123&^YUhg@!";
    bool ts= false,lit= false,lar= false,num= false,lenq= false,out= true;
    if (a.length()>=6 and a.length()<=12){
        lenq= true;
    }
    for (int i=65;i<65+26;i++){
        if (a.find(char(i))<=a.length()){
            lar= true;
            break;
        }
    }
    for (int i=97;i<97+26;i++){
        if (a.find(char(i))<=a.length()){
            lit= true;
            break;
        }
    }
    for (int i=48;i<=57;i++){
        if (a.find(char(i))<=a.length()){
            num= true;
            break;
        }
    }
    if ((a.find(char(33))<=a.length()) or (a.find(char(64))<=a.length()) or (a.find(char(35))<=a.length()) or (a.find(char(36))<=a.length())){
        ts= true;
    }
    for(int i=1;i<=a.length();i++){
        if(((int)a[i]>=97 and (int)a[i]<=122) or ((int)a[i]>=64 and (int)a[i]<=90) or ((int)a[i]>=48 and (int)a[i]<=57) or (int)a[i]==35 or (int)a[i]==36 or (int)a[i]==33 or (int)a[i]==64 or a[i]=='\0'){

        }else{
            out= false;
        }
//        cout<<(int)a[i]<<endl;
    }
    if ((out and lenq and ts) and ((lit and lar) or (lit and num) or (lar and num))){
        return true;
    }else{
        return false;
    }

}
int main(){
    char line[101];
    cin>>line;
    string tmp="";
    for (int i=0;line[i]!='\0';i++){
        if (line[i]!=','){
            tmp+=line[i];
        }else{
            if(check(tmp)){
                cout<<tmp<<endl;
                tmp="";
            }
        }
    }
}