【无标题】c++编写集合相关概念

该代码实现了一个C++的集合类set,使用数组存储元素,并实现了包括判断空集、添加元素、删除元素、复制集合、显示元素、求交集、并集、判断集合相等及子集等集合运算。示例展示了如何创建、操作和比较两个集合。
摘要由CSDN通过智能技术生成

//集合是具有共同属性(共性)而又能互相区别(个性)的多个成员汇集起来的整体,
//构成集合的每个成员称为集合的元素,元素间没有顺序关系。例如,所有的大写英文字母是一个集合,
//它包括26个元素:A、B、…、Z。不包含任何元素的集合称为空集合。
//【实现要求】
//  自定义一个集合类set,采用数组存放集合的元素。自定义集合运算包括以下操作:
// 1) 判断元素elem是否为集合set的元素。
// 2) 为集合添加一个元素elem。
// 3) 从集合中删除一个元素elem。
// 4) 复制一个集合,其元素与原集合完全一样。
// 5) 显示集合中的所有元素。
// 6) 求两个集合中相同的元素,即求两个集合的交集。
// 7) 求两个集合中所有的元素,即求两个集合的并集。
// 8) 判断两集合包含的元素是否完全相同。
// 9) 判断一个集合是否被包含在另一个集合之中,即是否为另一个集合的子集。

代码实现

#include<iostream>
#include<string.h>
using namespace std;
class set 
{
    public:
        set(char *a)//构造函数 
        {
            for(int i=0;a[i]!='\0';i++)
                elem[i]=a[i];
        }
        char isset(set &t)//是否是空集 
        { 
            if(t.elem[1]=='\0'){
                cout<<"  是空集"<<endl;
                return 0;
                }
            if(strlen(t.elem)!=0)
                cout<<"  不是空集"<<endl;
        }
        char addset(set &a,char e)//在集合末尾添加一个元素 
        {
            int i=0;
            for(i;a.elem[i]!='\0';i++);
            a.elem[i]=e;
            a.elem[i+1]='\0';
        }
        char delset(set &a)//在集合末尾删除一个元素 
        {
            int i=0;
            for(i;a.elem[i]!='\0';i++);
            a.elem[i-1]='\0';
        }
        char copyset(set &c,set &a)//把后面的集合赋值给前面 
        {
            for(int i=0;i<10;i++)
                c.elem[i]=a.elem[i];
        }
        char coutset()
        {
            for(int i=0;elem[i]!='\0';i++)
            {
                cout<<elem[i]<<"  ";
            }
            cout<<endl; 
        }    
        char comsets(set &a,set &b)//求两个集合的交集 
        {
            char t[10];
            int i=0,j=0,k=0;
            for(i;i<strlen(a.elem);i++)
                for(j=0;j<strlen(b.elem);j++)
                    if(a.elem[i]==b.elem[j])
                    {
                        t[k]=a.elem[i];
                        k++;
                    }
            t[k]='\0';
            for(i=0;t[i]!='\0';i++)
                cout<<t[i]<<"  ";
            cout<<endl;
        }
        char allsets(set &a,set &b)//求两个集合的并集 
        {
            char x[20];
            int i=0,j=0;
            for(i=0;a.elem[i]!='\0';i++)//先把a加进x中 
            {
                x[i]=a.elem[i];
            }
            for(j=0;b.elem[j]!='\0';j++)//再把b加进x中 
            {
                int flag;//设置标志判断a,b中是否有一样的元素 
                flag=0;
                for(int k=0;x[k]!='\0';k++)
                {
                    if(a.elem[k]==b.elem[j])
                        flag=1;//有的话让flag= 1
                }
                if(flag)//跳过一样的元素 
                {
                    continue;
                }
                x[i++]=b.elem[j];
            }
            for(i=0;x[i]!='\0';i++)
                cout<<x[i]<<"  ";
        }
        char iscomsets(set &a,set &b)
        {
            int flag;//flag为1两个集合一样,为0两个集合不一样
            int i=0,j=0;
            for(i=0;a.elem[i]!='\0';i++)
            {
                flag=0; 
                for(j=0;b.elem[j]!='\0';j++)
                    if(a.elem[i]==b.elem[j])
                    {
                        flag=1;
                        break;
                    }
                    if(flag==0)
                        break;
            }
            if(flag)
                cout<<"两个集合完全一样";
            else
                cout<<"两个集合不一样"; 
        }
        char iszisets (set &a,set &b)//判断前者是后者的子集 
        {
            int flag;
            int i=0,j=0;
            for(i;a.elem[i]!='\0';i++)
            {
                flag=0;
                for(j=0;b.elem[j]!='\0';j++)
                    if(a.elem[i]==b.elem[j])
                    {
                        flag=1;
                        break;
                    }
                    if(flag==0)
                        break;
            }
            if(flag==1)
                cout<<"前者是后者的子集"<<endl;
            else
                cout<<"前者不是后者的子集"<<endl; 
        }
    private:
        char elem[10];
};
int main()
{
    set a("abcde");
    cout<<"A集合为:"<<endl;
    a.coutset();
    set b("abf");
    cout<<"B集合为:"<<endl;
    b.coutset();
    
    cout<<"集合a是空集吗?"<<endl;
    a.isset(a);
    cout<<"创建空集c.....c是空集吗?"<<endl;
    set c("\0");
    c.isset(c);
    
    cout<<"集合a添加元素z后"<<endl; 
    a.addset(a,'z');
    a.coutset();
    
    cout<<"把集合a中的最后一个元素删除"<<endl;
    a.delset(a);
    a.coutset(); 
    
    cout<<"把a集合的值复制到c中"<<endl;
    b.set::copyset(c,a); 
    cout<<"集合c为:"<<endl; 
    c.coutset(); 
    
    cout<<"求集合a与集合b的交集"<<endl;
    c.comsets(a,b); 
    
    cout<<"求集合a与集合b的并集"<<endl;
    c.allsets(a,b);
    cout<<endl<<endl;
    
    cout<<"判断集合a,b的元素是否完全一样"<<endl; 
    c.iscomsets(a,b);
    cout<<endl;
    cout<<"判断集合a,c的元素是否完全一样"<<endl; 
    b.iscomsets(a,c);
    cout<<endl<<endl;
    
    cout<<"b是a的子集吗(b为abf,a为abcde)"<<endl;
    c.iszisets(b,a);
    c.delset(b);
    cout<<"删除b中的f后,集合b为:";
    b.coutset(); 
    cout<<"删除b中的f后,b是a的子集吗"<<endl;
    c.iszisets(b,a);
    return 0;
}

运行结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值