集合的交集、并集、补集、差运算的文件迅速处理

【实验目的】掌握用计算机求集合的交、并、差和补运算的方法。

【实验内容】编程实现集合的交、并、差和补运算。

【实验原理和方法】

(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;
}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值