【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。
【实验内容】编程实现集合的交、并、差和补运算。
【实验原理和方法】
(1)用数组A,B,C,E表示集合。输入数组A,B,E(全集),输入数据时要求检查数据是否重复(集合中的数据要求不重复),要求集合A,B是集合E的子集。
以下每一个运算都要求先将集合C置成空集。
(2)二个集合的交运算:把数组A中元素逐一与数组B中的元素进行比较,将相同的元素放在数组C中,数组C便是集合A和集合B的交。
(3)二个集合的并运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组B中的元素进行比较,把不相同的元素添加到数组C中,数组C便是集合A和集合B的并。
(4)二个集合的差运算:把数组A中各个元素先保存在数组C中。将数组B中的元素逐一与数组B中的元素进行比较,把相同的元素从数组C中删除,数组C便是集合A和集合B的差A-B。
(5)集合的补运算:将数组E中的元素逐一与数组A中的元素进行比较,把不相同的元素保存到数组C中,数组C便是集合A关于集合E的补集。
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<set>
#include<cstring>
using namespace std;
const int maxn=999;
set<int> a,b,e;
set<int>:: iterator it;
int A[maxn],B[maxn],C[maxn],E[maxn];
int main(){
int n,x,i=0,j=0,k=0;
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
///读入集合A的数据
cout<<"请输入集合A的数据量:";
cin>>n;
for(int z=1;z<=n;++z){
cin>>x;
a.insert(x);
}
cout<<"集合A去掉重复的数据:";
for(it=a.begin();it!=a.end();++it){
cout<<*it<<" ";
A[++i]=*it;
}
cout<<""<<endl;
///读入集合B的数据
cout<<"请输入集合B的数据量:";
cin>>n;
for(int z=1;z<=n;++z){
cin>>x;
b.insert(x);
}
cout<<"集合B去掉重复的数据:";
for(it=b.begin();it!=b.end();++it){
cout<<*it<<" ";
B[++j]=*it;
}
cout<<""<<endl;
///读入集合E的数据
cout<<"请输入集合E的数据量:";
cin>>n;
for(int z=1;z<=n;++z){
cin>>x;
e.insert(x);
}
cout<<"集合E去掉重复的数据:";
for(it=e.begin();it!=e.end();++it){
cout<<*it<<" ";
E[++k]=*it;
}
cout<<""<<endl;
int _i=1,_j=1,_k=0;
while(_i<=i&&_j<=j){
if(A[_i]<B[_j]){
++_i;
}else if(A[_i]>B[_j]){
++_j;
}else{
C[++_k]=A[_i];
++_i;++_j;
}
}
cout<<"A∩B=";
if(_k==0){
printf("Φ");
}else{
for(int z=1;z<=_k;++z){
cout<<C[z]<<" ";
}
}
cout<<""<<endl;
_i=1,_j=1,_k=0;
while(_i<=i&&_j<=j){
if(A[_i]<B[_j]){
C[++_k]=A[_i];
++_i;
}else if(A[_i]>B[_j]){
C[++_k]=B[_j];
++_j;
}else{
C[++_k]=A[_i];
++_i;++_j;
}
}
if(_i>i){
for(int z=_j;z<=j;++z){
C[++_k]=B[z];
}
}else if(_j>j){
for(int z=_i;z<=i;++z){
C[++_k]=A[z];
}
}
cout<<"A∪B=";
for(int z=1;z<=_k;++z){
cout<<C[z]<<" ";
}
cout<<""<<endl;
_i=1,_j=1,_k=0;
while(_i<=i&&_j<=j){
if(A[_i]<B[_j]){
C[++_k]=A[_i];
++_i;
}else if(A[_i]>B[_j]){
++_j;
}else{
++_i;++_j;
}
}
if(_j>j){
for(int z=_i;z<=i;++z){
C[++_k]=A[z];
}
}
cout<<"A-B=";
if(_k==0){
printf("Φ");
}else{
for(int z=1;z<=_k;++z){
cout<<C[z]<<" ";
}
}
cout<<""<<endl;
_i=1,_j=1,_k=0;
while(_i<=i&&_j<=k){
if(A[_i]<E[_j]){
++_i;
}else if(A[_i]>E[_j]){
C[++_k]=E[_j];
++_j;
}else{
++_i;++_j;
}
}
for(int z=_j;z<=k;++z){
C[++_k]=E[z];
}
cout<<"A关于E的补集:";
for(int z=1;z<=_k;++z){
cout<<C[z]<<" ";
}
cout<<""<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
补充一个生成相应数据的代码:
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
using namespace std;
int vis[9999];
int main(){
freopen("D:\\out2.txt","w",stdout);
srand(time(NULL));
int n,t,a,b;
for(int i=0;i<5;++i){
n=rand()%9+1;
a=n;
printf("%d\n",n);
for(int j=0;j<n;++j){
t=rand()%30+1;
while(vis[t]){
t=rand()%30+1;
}
printf("%d ",t);
}
puts("");
n=rand()%9+1;
b=n;
printf("%d\n",n);
for(int j=0;j<n;++j){
t=rand()%30+1;
while(vis[t]){
t=rand()%30+1;
}
printf("%d ",t);
}
puts("");
n=rand()%19+1;
while(n<a){
n=rand()%19+1;
}
printf("%d\n",n);
for(int j=0;j<n;++j){
t=rand()%30+1;
while(vis[t]){
t=rand()%30+1;
}
printf("%d ",t);
}
puts("");
}
fclose(stdout);
return 0;
}