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修饰参数可以起到保护的作用