7-1 运算符重载-集合运算

7-1 运算符重载-集合运算

分数 50

全屏浏览题目

切换布局

作者 lwx1984

单位 泉州师范学院

集合是由一个或多个确定的元素所构成的整体。集合的运算有并、交、相对补等。集合B关于集合A的相对补集,记做A-B:由属于A而不属于B的元素组成的集合。
假设集合A={10,20,30},集合B={1,10,50,8}。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

3 10 20 30
4 10 1 2 3

输出样例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

程序主函数:

#include<iostream>
using namespace std;

 /*补充类CSet定义  */

 int main() {
     int n; 
     cin >> n;
     CSet A(n);
     A.add();
     cin >> n;
     CSet B(n); 
     B.add();
     cout << "A:" << A << "B:" << B; 
     cout << "A+B:" << A+B; 
     cout << "A*B:" << A*B;
     cout << "(A-B)+(B-A):" << (A-B)+(B-A) ; 
     return 0;
 }
#include<iostream>
using namespace std;
class CSet {
    friend CSet operator+(const CSet& a,const CSet &b);
    friend CSet operator*(const CSet& a,const CSet &b);
    friend CSet operator-(const CSet& a,const CSet &b);
    friend ostream& operator<<(ostream& cout,const CSet& a);
public:
    int n;
    int* data;
    CSet(int n) {
        this->n = n;
        data = new int[n];
    }
    void add(){
        for (int i = 0; i < n; i++) {
            cin >> data[i];
        }
    }
};
CSet operator+(const CSet& a,const CSet &b){
    int m = b.n + a.n;
    CSet temp(m);
    CSet temp1(m);
    int num = 0;
    int num1 = 0;
        for (int i = 0; i < a.n; i++)
            temp.data[num++] = a.data[i];
        for (int i = 0; i < b.n; i++)
            temp.data[num++] = b.data[i];
        for (int i = 0; i < b.n + a.n; i++)
        {
            int flag = 1;
            for (int j = 0; j < i; j++)
            {
                if (temp.data[i] == temp.data[j])
                {
                    flag = 0;
                    break;
                }
            }
            if (flag == 1)
                temp1.data[num1++] = temp.data[i];
        }
        CSet temp2(num1);
    for(int i = 0;i < num1;i++)
    {
        temp2.data[i] = temp1.data[i];
    }
    return temp2;
}
CSet operator*(const CSet& a,const CSet &b)
{
    int c;
    if(a.n > b.n)
        c = a.n;
    else
        c = b.n;
    CSet temp(c);
    int num = 0;
    for(int i = 0;i < a.n;i++){
        for(int j = 0;j < b.n;j++){
            if(a.data[i] == b.data[j])
                temp.data[num++] = a.data[i];
        }
    }
    CSet temp1(num);
    for(int i = 0;i < num;i++)
        temp1.data[i] = temp.data[i];
    return temp1;
}
CSet operator-(const CSet& a,const CSet &b)
{
    CSet temp(a.n);
    int num = 0;
    for(int i = 0;i < a.n;i++){
        int flag = 1;
        for(int j = 0;j <b.n;j++){
            if(a.data[i] == b.data[j]){
                flag = 0;
                break;
            }
        }
        if(flag == 1)
            temp.data[num++] = a.data[i];
    }
    CSet temp1(num);
    for(int i = 0;i < num;i++)
        temp1.data[i] = temp.data[i];
    return temp1;
}
ostream& operator<<(ostream& cout,const CSet& a)
{
    for (int i = 0; i < a.n; i++) {
        if (i < a.n - 1)
            cout << a.data[i] << " ";
        else
            cout << a.data[i];
    }
    cout << endl;
    return cout;
};
 int main() {
     int n; 
     cin >> n;
     CSet A(n);
     A.add();
     cin >> n;
     CSet B(n); 
     B.add();
     cout << "A:" << A << "B:" << B; 
     cout << "A+B:" << A+B; 
     cout << "A*B:" << A*B;
     cout << "(A-B)+(B-A):" << (A-B)+(B-A) ; 
     return 0;
 }
//在语句cout << a + b << endl;中,因为a + b属于右值,而operator<<函数的参数a没有使用const进行修饰,无法与作为右值的a + b进行成功绑定,导致编译错误。

//而在语句cout << a << endl;中,因为对象a属于左值,而operator<<的参数a为非const左值引用,可以与左值进行正常的绑定,因此编译成功。

//总结用const修饰参数可以起到保护的作用

 

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值