//集合是具有共同属性(共性)而又能互相区别(个性)的多个成员汇集起来的整体,
//构成集合的每个成员称为集合的元素,元素间没有顺序关系。例如,所有的大写英文字母是一个集合,
//它包括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;
}
运行结果: