Collections (surcharge des opérateurs)

【id:318】【10分】D. 集合(运算符重载)
时间限制
1s
内存限制
128MB
题目描述

集合是由一个或多个确定的元素所构成的整体。集合的运算有并、交、相对补等。

集合A和集合B的交集:由属于A且属于B的相同元素组成的集合。

集合A和集合B的并集:由所有属于集合A或属于集合B的元素所组成的集合。

集合B关于集合A的相对补集,记做A-B:由属于A而不属于B的元素组成的集合。

假设集合A={10,20,30},集合B={1,10,50,8}。则A与B的并是{10,20,30,1,50,8},A与B的交是{10},B关于A的相对补集是{20,30}。

定义整数集合类CSet,属性包括:集合中的元素个数n,整型指针data存储集合中的元素。

方法有:重载输出,按样例格式输出集合中的元素。

重载+运算符,求集合A和集合B的并集,并返回结果集合。

重载-运算符,求集合B关于集合A的相对补集,并返回结果集合。

重载*运算符,求集合A和集合B的交集,并返回结果集合。

主函数输入集合A、B的数据,计算集合的并、交、相对补。

可根据题目,为CSet类添加需要的成员函数。


输入

测试次数

每组测试数据两行,格式如下:

第一行:集合A的元素个数和元素

第二行:集合B的元素个数和元素


输出

每组测试数据输出如下:

第一行:集合A

第二行:集合B

第三行:A和B的并

第四行:A和B的交

第五行:B关于A的相对补集 与 A关于B的相对补集的并,即(A-B)+(B-A)

每组测试数据间以空行分隔。


样例查看模式 
正常显示
查看格式
输入样例1 <-复制
2
3 10 20 30
4 10 1 2 3
5 100 2 3 4 -10
6 -34 12 2 4 90 100

输出样例1
A:10 20 30
B:10 1 2 3
A+B:10 20 30 1 2 3
A*B:10
(A-B)+(B-A):20 30 1 2 3

A:100 2 3 4 -10
B:-34 12 2 4 90 100
A+B:100 2 3 4 -10 -34 12 90
A*B:100 2 4
(A-B)+(B-A):3 -10 -34 12 90

Dans les opérations d'ensemble, set ne peut pas être utilisé car la sortie et le désalignement

Utilisez une fonction ici pour déterminer si elle fait partie de l'ensemble

bool statique isIn (CSet &one, int temp) {

int n = un.n;

pour (int je = 0; je < n; ++i) {

if (temp == one.data[i]) {

renvoie vrai ;

}

}

renvoie faux ;

}

#include <iomanip>
#include "iostream"
#include "vector"

using namespace std;

class CSet {
public:
    int n;
    int *data;

    CSet() {}

    explicit CSet(int n) : n(n) {
        data = new int[n];
        for (int i = 0; i < n; ++i) {
            cin >> data[i];
        }
    }

    void Print() {
        cout << data[0];
        for (int i = 1; i < n; ++i) {
            cout << " " << data[i];
        }
        cout << endl;
    }

    static bool isIn(CSet &one, int temp) {
        int n = one.n;
        for (int i = 0; i < n; ++i) {
            if (temp == one.data[i]) {
                return true;
            }
        }
        return false;
    }

    friend CSet operator+(CSet &one, CSet &two) {
        vector<int> res;
        for (int i = 0; i < one.n; ++i) {
            res.push_back(one.data[i]);
        }
        for (int i = 0; i < two.n; ++i) {
            if (isIn(one, two.data[i])) {

            } else {
                res.push_back(two.data[i]);
            }
        }
        CSet cSet;
        cSet.n = res.size();
        cSet.data = new int[res.size()];
        for (int i = 0; i < res.size(); ++i) {
            cSet.data[i] = res[i];
        }
        return cSet;
    }

    friend CSet operator-(CSet &one, CSet &two) {
        vector<int> res;
        for (int i = 0; i < one.n; ++i) {
            if (isIn(two, one.data[i])) {
            } else {
                res.push_back(one.data[i]);
            }
        }
        CSet cSet;
        cSet.n = res.size();
        cSet.data = new int[res.size()];
        for (int i = 0; i < res.size(); ++i) {
            cSet.data[i] = res[i];
        }
        return cSet;
    }

    friend CSet operator*(CSet &one, CSet &two) {
        vector<int> res;
        for (int i = 0; i < one.n; ++i) {
            if (isIn(two, one.data[i])) {
                res.push_back(one.data[i]);
            } else {
            }
        }
        CSet cSet;
        cSet.n = res.size();
        cSet.data = new int[res.size()];
        for (int i = 0; i < res.size(); ++i) {
            cSet.data[i] = res[i];
        }
        return cSet;
    }

};

int main() {
    int times;
    cin >> times;
    while (times--) {
        int number;
        cin >> number;


        CSet A(number);
        cin >> number;
        CSet B(number);
        cout << "A:";
        A.Print();
        cout << "B:";
        B.Print();
        cout << "A+B:";
        (A + B).Print();
        cout << "A*B:";
        (A * B).Print();
        cout << "(A-B)+(B-A):";
        CSet AnB = A - B;
        CSet BnA = B - A;
        (AnB + BnA).Print();
        cout << endl;
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/m0_62288512/article/details/131550057
conseillé
Classement