集合(运算符重载实现)(c++)

集合

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

集合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的数据,计算集合的并、交、相对补。
可根据题目,为CSet类添加需要的成员函数。


方法有:重载输出,按样例格式输出集合中的元素。
重载+运算符,求集合A和集合B的并集,并返回结果集合。 重载-运算符,求集合B关于集合A的相对补集,并返回结果集合。 重载*运算符,求集合A和集合B的交集,并返回结果集合。



输入
输入
测试次数
每组测试数据两行,格式如下:
第一行:集合A的元素个数和元素
第二行:集合B的元素个数和元素
输出
每组测试数据输出如下:
第一行:集合A
第二行:集合B
第三行:A和B的并
第四行:A和B的交
第五行:B关于A的相对补集 与 A关于B的相对补集的并,即(A-B)+(B-A)
每组测试数据间以空行分隔。
样例输入 Copy
2
3 10 20 30
4 10 1 2 3
5 100 2 3 4 -10
6 -34 12 2 4 90 100
样例输出 Copy
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
 

#include<iostream>
using namespace std;
class CSet
{
    public:
	  int *data;
	  int n;
	public:
	  CSet operator+(CSet&s);
	  CSet operator-(CSet&s);
	  CSet operator*(CSet&s);
	  CSet();
	  CSet(int *p,int x); 
	  void setdata (int *p,int x);
	  void display();
}; 
CSet::CSet(int *p,int x)
{
	data=p; n=x;
} 
CSet::CSet() 
{
  int x; 
  cin>>x;
  n=x;  
  data=new int[n];
  for(int i=0;i<n;i++)
     {
     	cin>>*(data+i);
	 }
}
void CSet::display()
{
	if(n!=0)
	{ 
	   for(int i=0;i<n;i++)
	    {   
	   	  if(n!=n-1)
			cout<<*(data+i)<<" "; 
		  else
		    cout<<*(data+i);
		}
	}
	else cout<<" ";
	cout<<endl;
}
CSet CSet::operator*(CSet &s)
{
	int *p=new int[n+s.n]; 	
	int sum=0;
	for(int i=0;i<n;i++)
        {
            for(int j=0;j<s.n;j++)
            {
                if(s.data[j]==data[i])
                {
                    p[sum]=data[i];
                    sum++;
                    break;
                }
            }
        }
    CSet m(p,sum);
    return m;
}
CSet CSet::operator-(CSet&s)
{
	int *p=new int[n+s.n]; int x=0;
	 for(int i=0;i<n;i++)
        {
            int sum=0;
            for(int j=0;j<s.n;j++)
            {
                if(s.data[j]==data[i])
                    sum++;
            }
            if(sum==0)//属于A而不属于B
            {
                p[x]=data[i];
                x++;
            }
        }
    CSet m(p,x);
	return m;
}
CSet CSet::operator+(CSet&s)
{
  int *p=new int[n+s.n]; 
  int x=s.n+n;
  for(int i=0;i<n;i++)
    {
     	*(p+i)=*(data+i);
	}
  for(int i=0;i<s.n;i++)
    {
     	*(p+n+i)=*(s.data+i);
	}  
	for(int i=0;i<x;i++)
	   for(int j=0;j<x;j++)
	      {
	      	if(i!=j)
	      	   {
	      	   	if(*(p+i)==*(p+j)) 
					{
	      	   		for(int k=j;k<x;k++)
	      	   		   {
	      	   		   	*(p+k)=*(p+k+1);
					   }
					   x--;
					}
				 }
		  }
	CSet m(p,x);
    return m;
} 
int main()
{
	int a; cin>>a;
	while(a)
	   {
	   	CSet A,B;
	   	CSet m=A-B,n=B-A;
	   	cout<<"A:"; A.display();
		cout<<"B:"; B.display();
		cout<<"A+B:"; (A+B).display();  
		cout<<"A*B:"; (A*B).display();
		cout<<"(A-B)+(B-A):"; (m+n).display();
		cout<<endl;
		a--;
	   }
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

将爱却晚秋-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值