【C++笔试强训】第十天

选择题

image-20230402095013300

解析:内联函数(inline)一般用于代码较少,代码块里面没有递归且频繁调用的函数,是一种以空间换时间(不是指内存,而是指令变多编译出来的可执行程序会变大)的做法。内联函数在预编译的时候展开,会用函数体替换函数调用;内联函数可能会使目标文件变大,但是少了调用开销,增加程序运行的效率。

image-20230402095021562

解析:C++中不能重载的运算符.*:: sizeof?: .这5个运算符不能重载。

image-20230402095030304

解析:

拷贝构造函数的函数名和类名相同,无返回值;

该函数的参数只有一个,是对该对象的引用,如果使用传值传参会一直调用拷贝构造函数形成无穷递归。

每个类都会有一个拷贝构造函数,当没有显示定义时,编译器会生成默认的拷贝构造函数,该构造函数默认是共有的public

拷贝初始化构造函数的作用是将一个已知对象的数据成员值(这里不区分浅拷贝还是深拷贝)拷贝给正在创建的另一个同类的对象

image-20230402095038433

解析:常成员函数要用const修饰,const应该在参数列表之后,如果在返回值前代表返回值不能修改,const修饰*this,表明在该成员函数中,不能修改非静态的成员变量。所以选C。

image-20230402095104955

解析:重载函数是在同一作用域内,函数名相同,参数个数或者参数的类型不同,就构成重载函数,与函数类型无关。

image-20230402095119022

解析:MyClass a[5]是一个有5个MyClass对象的数组,MyClass *b[6]是一个指针数组,该数组的每个元素都是MyClass*a[5]数组中每个元素是一个类,每次创建都会调用它的构造函数,一共调用5次构造函数;但是b[6]中的元素都是类的指针类型,就不会调用构造函数。指针在调用期间并不会调用构造函数。

image-20230402095126955

解析:在初始化列表中初始化成员的次序与先后次序没有关系,是根据成员变量在类中声明的先后顺序进行初始化的。

image-20230402095154098

解析:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐;静态成员不参与计算,因为数据保存在静态区;

注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象,对于一个空类,它的大小为1,为了占位,没有实际意义。

9.

解析:A()是匿名对象,括号里面的值是初始化的一个值;A的构造函数中赋值,是后置++,先使用再++,计算就可以得到结果。

image-20230330160131865

image-20230402095445232

解析:对于const修饰的变量,是常变量,它具有常数属性,当&a的时候,此时它的类型还是const int *类型的,可以强制类型转换成int*,然后对*p进行修改,因为a在栈区进行储存的,所以在打印a的时候,回去常量区找,也就是直接替换成10,但打印*p的时候会去储存的位置找,打印20。

编程题

1.井字棋

image-20230330170208473

解析:解题思路:返回true的条件就是当一列/一行/正对角/反对角相同且全部为1的时候返回true;我们可以将每个位置相加,得到结果之后进行比较:当一列相同时,每个位置都是1,那结果就等于行数;当一行相同时,结果等于列数;当对角相同时,等于行数或者列数(因为要是有对角,就说明这个数组的行数和列数相同)。

class Board {
public:
    bool checkWon(vector<vector<int> > board) {
        // write code here
        int row = board.size();
        int col = board[0].size();
        //先判断一行相同
        int sum = 0;//用来记录相加之后的结果
        for(int i = 0; i < row; i++)    
        {
            for(int j = 0; j < col; j++)
            {
                sum += board[i][j];
            }
            if(sum == col)
                return true;
        }
        //判断一列是否相同
        sum = 0;
        for(int i = 0; i < col; i++)    
        {
            for(int j = 0; j < row; j++)
            {
                sum += board[j][i];
            }
            if(sum == row)
                return true;
        }
        //判断对角是否相同
        sum = 0;
        //for(int i = 0; i < row; i++)
        for(int i = 0; i < col; i++)
        {
            sum += board[i][i];
        }
        if(sum == col)
            return true;
        //判断反对角是否相同
        sum = 0;
        //for(int i = 0; i < row; i++)
        for(int i = 0; i < col; i++)
        {
            sum += board[i][col-1-i];
        }
        if(sum == col)
            return true;
        return false;
    }
};

2.密码强度等级

image-20230330173533139

解析:注意条件即可。

#include <iostream>
#include <string>
using namespace std;

int main() {
    string s1;
    getline(cin, s1);
    int word1 = 0; //小写字母
    int word2 = 0;//大写字母
    int num = 0;//数字
    int count = 0;//符号
    int score = 0;//分数
    for (int i = 0; i < s1.length(); i++) {
        if (s1[i] >= 'a' && s1[i] <= 'z')
            word1++;
        if (s1[i] >= 'A' && s1[i] <= 'Z')
            word2++;
        if (s1[i] >= '0' && s1[i] <= '9')
            num++;
        if ((s1[i] >= 0x21 && s1[i] <= 0x2F) || (s1[i] >= 0x3A && s1[i] <= 0x40) ||
                (s1[i] >= 0x5B && s1[i] <= 0x60) || (s1[i] >= 0x7B && s1[i] <= 0x7E))
            count++;
    }
    if (s1.length() <= 4) score += 5;
    else if (s1.length() >= 5 && s1.length() <= 7)   score += 10;
    else if (s1.length() >= 8)   score += 25;
    if (word1 == 0 && word2 == 0)    score += 0;
    else if ((word1 == 0 && word2 != 0) || (word2 == 0 &&
                                            word1 != 0))   score += 10;
    else if (word1 != 0 && word2 != 0)
        score += 20;
    if (num == 0)    score += 0;
    else if (num == 1)   score += 10;
    else score += 20;
    if (count == 0)  score += 0;
    else if (count == 1) score += 10;
    else score += 25;
    if (word1 > 0 && word2 > 0 && num > 0 && count > 0)
        score += 5;
    else if (word1 + word2 > 0 && num > 0 && count > 0)
        score += 3;
    else if (word1 + word2 > 0 && num > 0)
        score += 2;
    if (score >= 90) cout << "VERY_SECURE";
    else if (score >= 80) cout << "SECURE";
    else if (score >= 70) cout << "VERY_STRONG";
    else if (score >= 60) cout << "STRONG";
    else if (score >= 50) cout << "AVERAGE";
    else if (score >= 25) cout << "WEAK";
    else cout << "VERY_WEAK";
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_53943591/article/details/129908437