计算机二级备考

1.头文件和命名空间

#include //包含标准输入输出流库,用于使用cout和cin进行控制台输入输出。
#include //包含数学库,这里虽然代码中未直接使用,但可能后续扩展会用到相关数学函数。
#include //包含文件流库,用于文件的读写操作。
#include //包含字符串库,用于处理字符串类型的数据。
using namespace std;//使用标准命名空间,这样可以直接使用标准库中的类和函数,而无需添加std::前缀。

 2.

#include 
#include 
#include 
#include 
using namespace std;

// 定义FlowerNumber类,用于计算指定范围内的花朵数
class FlowerNumber {
public:
    // 构造函数,初始化最小值、最大值和计数,用于初始化min、max和count,min和max表示待计算的数值范围,count用于记录花朵数的数量。
    FlowerNumber(int x1, int x2) : min(x1), max(x2), count(0) {}

    // 计算数字x的位数
    int GetDigits(int x);

    // 重置计数
    void ResetCount() { count = 0; }

    // 获取当前花朵数的数量
    int GetCount() const { return count; }

    // 获取集合中指定索引位置的花朵数
    int GetSet(int index) { return set[index]; }

    // 计算指定范围内的花朵数
    void Flower();

    // 打印指定范围内的花朵数信息
    void Print() {
        cout << min << "和" << max << "之间的花朵数共有" << count << "个:" << endl;
        for (int i = 0; i < count; i++)
            cout << set[i] << ' ';
        cout << endl;
    }

private:
    int digit;  // 花朵数的位数
    int min, max;  // 待计算的数值范围
    int count;  // 花朵数的数量
    int set[40];  // 花朵数集合
};

// 实现GetDigits函数,计算数字x的位数
int FlowerNumber::GetDigits(int x) {
    int i;
    for (i = 0; x > 0; i++)
        x /= 10;
    return i;
}

// 实现Flower函数,计算指定范围内的花朵数
void FlowerNumber::Flower() {
    int sum = 0;//声明一个整数变量sum并初始化为0,用于存储各位数字的幂次方和。

    // 遍历从min到max的所有整数
    for (int i = min; i <= max; i++) {//使用for循环遍历从min到max(包含min和max)的所有整数。
        int t = i, p = 1, r;//声明变量t,并将当前循环变量i的值赋给t,用于后续分解各位数字。声明变量p并初始化为1,用于计算各位数字的幂次方。声明变量r,用于存储t的最后一位数字。
        // 获取当前数字i的位数,并将结果存储在变量digit中,GetDigits函数的作用是计算一个数字的位数
        digit = GetDigits(i);
        sum = 0;  // 在每次循环开始时,将sum重置为0,以便重新计算当前数字的各位数字的幂次方和。
        while (t) {//这个循环的目的是分解数字t的每一位,并计算它们的幂次方和。
            p = 1;//在每次循环迭代开始时,将p重置为1,用于计算当前位数字的幂次方。
            
            r = t % 10;// 使用取模运算符%获取t的最后一位数字,并存储在变量r中。
            if (r == 0)//如果最后一位数字r是0,则将p设置为0。是因为0的任何次幂都是0,所以直接跳过计算
                p = 0;
            else {
                //计算r的digit次幂。
                for (int j = 0; j < digit; j++)
                    p = p * r;
            }
            sum += p;
            t = t / 10;  // 去掉t的最后一位数字
        }
        // 检查sum是否等于当前数字i。如果相等,说明i是一个水仙花数(Flower Number),将其存储到数组set中,并将count递增1。
        if (sum == i)
            set[count++] = i;
    }
}

// 将花朵数信息写入文件的函数
void writeToFile(const string filename) {
    ofstream outFile(filename);
    if (outFile.is_open()) {
        // 这里可以添加将花朵数信息写入文件的逻辑
        outFile.close();
    } else {
        cerr << "无法打开文件" << endl;
    }
}

int main() {
    int d1, d2;
    cout << "请输入整数序列范围,以两个整数表示,空格为分隔符,回车键结束:";
    cin >> d1 >> d2;
    // 创建FlowerNumber对象
    FlowerNumber obj(d1, d2);
    // 调用Flower函数计算花朵数
    obj.Flower();
    // 调用Print函数打印花朵数信息
    obj.Print();
    // 调用writeToFile函数将花朵数信息写入文件
    writeToFile("");
    return 0;
}

3.数组操作与遍历,指针与引用

#include 
#include 
using namespace std;

// 定义一个成员类,作为教师类和学生类的基类
class Member {
public:
    // 构造函数,初始化成员变量
    Member(string c = "", string n = "", string g = "") : category(c), name(n), gender(g) {}
    
    // 纯虚函数,用于输出成员信息
    virtual void showInfo() = 0;
    
    // 获取成员类型、姓名和性别的函数
    string getCategory() { return category; }
    string getName() { return name; }
    string getGender() { return gender; }
    
protected:
    // 成员变量:类型、姓名、性别
    string category, name, gender;
};

// 定义教师类,继承自Member类
class Teacher : public Member {
public:
    // 构造函数,初始化教师的特有属性:职称和研究方向
    Teacher(string c = "教师", string n = "佚名", string g = "女", string t = "副教授", string rf = "人工智能")
        : Member(c, n, g), title(t), researchField(rf) {}
    
    // 重写showInfo函数,输出教师的详细信息
    virtual void showInfo() {
        cout << category << '\t' << name << '\t' << gender << '\t' << title << '\t' << researchField << endl;
    }
    
private:
    // 教师特有的成员变量:职称和研究方向
    string title, researchField;
};

// 定义学生类,继承自Member类
class Student : public Member {
public:
    // 构造函数,初始化学生的特有属性:年级和爱好
    Student(string c = "学生", string n = "佚名", string g = "男", string ga = "1", string h = "滑雪")
        : Member(c, n, g), grade(ga), hobby(h) {}
    
    // 重写showInfo函数,输出学生的详细信息
    virtual void showInfo() {
        cout << category << '\t' << name << '\t' << gender << '\t' << grade << '\t' << hobby << endl;
    }
    
private:
    // 学生特有的成员变量:年级和爱好
    string grade, hobby;
};

// 定义实验室类,包含教师和学生数组
class Laboratory {
public:
    // 构造函数,初始化实验室的教师和学生数组
    Laboratory(Teacher t[], int tc, Student s[], int sc) {
        for (int i = 0; i < tc; i++)
            teas[i] = t[i];
        for (int i = 0; i < sc; i++)
            stus[i] = s[i];
        tNum = tc;
        sNum = sc;
    }
    
    // 声明查找学生的方法
    Student* FindStudentByName(string n);

private:
    // 实验室的教师和学生数组,以及它们的数量
    Teacher teas[10];
    Student stus[50];
    int tNum, sNum;
};

// 实现查找学生的方法,Student*:表示这个函数的返回类型是一个指向Student类对象的指针。这意味着函数执行完成后,会返回一个Student对象的地址。如果找到了符合条件的学生,就返回该学生的地址;如果没有找到,通常返回NULL(空指针)。
Student* Laboratory::FindStudentByName(string n) {
    // 遍历学生数组,查找名字匹配的学生
    for (int i = 0; i < sNum; i++) {
        if (stus[i].getName() == n) {
            return &stus[i]; // 找到匹配的学生,返回其指针
        }
    }
    return NULL; // 未找到,返回空指针
}

// 主函数
int main() {
    // 初始化教师数组
    Teacher teas[2] = { Teacher("教师", "田怡", "女", "教授", "人工智能安全"),
                        Teacher("教师", "张尔", "男", "副教授", "软件安全") };
    
    // 初始化学生数组
    Student stus[7] = { Student("学生", "贺珊", "女", "博1", "舞蹈"),
                        Student("学生", "蒋石", "男", "研3", "篮球"),
                        Student("学生", "李悟", "男", "研2", "自行车"),
                        Student("学生", "袁陆", "男", "研2", "足球"),
                        Student("学生", "王奇", "男", "本4", "排球"),
                        Student("学生", "巴丽", "女", "研1", "羽毛球"),
                        Student("学生", "薛玖", "女", "研1", "游泳") };
    
    // 创建实验室对象,传入教师和学生数组
    Laboratory lab(teas, 2, stus, 7);
    
    // 用户输入要查找的学生姓名
    string n;
    cout << "请输入要查询学生的姓名:";
    cin >> n;
    
    // 调用FindStudentByName方法查找学生
    Member* result = lab.FindStudentByName(n);
    
    // 输出查找结果
    if (result)
        result->showInfo(); // 找到学生,输出其信息
    else
        cout << "实验室查无此人!" << endl; // 未找到学生,输出提示信息
    
    return 0;
}

4.复制构造函数被调用的三种情况

#include 
using namespace std;

class MyClass {
public:
    // 普通构造函数,带有默认参数,用于初始化对象的数据成员
    MyClass(int value = 0) : data(value) {
        cout << "普通构造函数被调用,data = " << data << endl;
    }
    // 复制构造函数,用于用一个已有的对象来初始化新对象
    MyClass(const MyClass& other) : data(other.data) {
        cout << "复制构造函数被调用,data = " << data << endl;
    }
    // 析构函数,在对象生命周期结束时被调用
    ~MyClass() {
        cout << "析构函数被调用,data = " << data << endl;
    }
private:
    int data;  // 私有数据成员
};

// 函数func,参数采用传值方式,会触发复制构造函数
MyClass func(MyClass obj) {
    return obj;
}

int main() {
    // 情况1:用类的一个已知对象去初始化该类的另一个正在创建的对象
    MyClass obj1(10);
    MyClass obj2(obj1); 

    // 情况2:采用传值调用方式时,对象作为函数实参传递给函数形参
    MyClass obj3(20);
    func(obj3); 

    // 情况3:对象作为函数的返回值
    MyClass obj4 = func(MyClass(30)); 

    return 0;
}

你可能感兴趣的:(c++,算法,开发语言)