设计整数集合类Set,该类包括以下数据成员:
int elem[N]; //存放集合元素
int num; //集合中最后一个元素位置
和以下成员函数:
Set(); //默认构造函数
Set(int a[],int s); //以数组a的元素和位置s构造一个集合
void empty(); //清空集合
int isempty(); //判断是否为空集合
int member(inta); //判断a是否为集合元素
int add(int a); //将a添加到集合中
int sub(int a); //从集合中删除元素a
int equ(Set&set); //判断两集合是否相等
Set intersection(Set&set); //求两个集合的交集
Set merge(Set &set); //求两个集合的并集
void copy(Set&set); //集合复制
void disp(); //输出集合元素
对应的参考程序如下所示:
#include <iostream.h>
const int N=100; //最多元素个数
class Set
{
int elem[N]; //存放集合元素
int num; //集合中最后一个元素位置 public:
Set();
Set(int a[],int s);
void empty();
int isempty();
int member(int a);
int add(int a);
int sub(int a);
int equ(Set &set);
Set intersection(Set &set);
Set merge(Set & set);
void copy(Set &set);
void disp();
};
Set::Set() //默认构造函数
{
int i;
for (i=0;i<N;i++)
elem[i]=0;
num=-1;
}
Set::Set(inta[],int s) //构造函数,要求a数组中的元素互不相同
{
int i;
if (s>=100)
num=99;
else
num=s-1;
for (i=0;i<=num;i++)
elem[i]=a[i];
for (i=s;i<N;i++)
elem[i]=0;
}
void Set::empty() //清空一个集合
{
int i;
for (i=0;i<N;i++)
elem[i]=0;
num=-1;
}
int Set::isempty() //判断是否为空集合
{
if (num==-1) return 1;
else return 0;
}
int Set::member(int a) //判断a是否为集合的元素
{
int i;
for (i=0;i<=num;i++)
if (elem[i]==a) return 1;
return 0;
}
int Set::add(int a) //将一个集合添加到集合中
{
if (member(a))
return 1;
else if (num==N-1)
return 0;
else{
num++;
elem[num]=a;
return 1;
}
}
int Set::sub(int a) //从集合中删除元素a
{
int i,p;
if (!member(a)) //a不是集合元素时返回0
return 0;
for (i=0;i<=num;i++) //找到a所在的位置p
if (elem[i]==a) {
p=i;break;
}
for (i=p;i<num;i++) //位置p及之后所有元素前移一位
elem[i]=elem[i+1];
num--; //位置减1
return 1;
}
int Set::equ(Set &set) //判断两个集合是否相等
{
int i;
if (num!=set.num) //长度不等时返回0
return 0;
for (i=0;i<=num;i++) //判断每个元素是否都在set中
if (set.member(elem[i])==0) return 0;
return 1;
}
Set Set::intersection(Set &set) //求两个集合的交集
{
int a[N],k=0,i,j;
for (i=0;i<=num;i++) //扫描当前集合中所有元素
for (j=0;j<=set.num;j++)
if (elem[i]==set.elem[j]) //将属于两个集合的元素放在a数组中
{
a[k++]=elem[i];
break;
}
return Set(a,k); //调用构造函数产生一个无名对象返回
}
Set Set::merge(Set &set) //求两个集合的并集
{
int a[N],i,k;
for (i=0;i<=num;i++) //先将当前集合元素放入a数组中
a[i]=elem[i];
k=num+1;
for (i=0;i<=set.num;i++) //将集合set中不在当前集合中的元素放入a数组中
if (member(set.elem[i])) continue;
else
{
if (k==N-1) break;
a[k++]=set.elem[i];
}
return Set(a,k); //调用构造函数产生一个无名对象返回
}
void Set::copy(Set &set) //集合复制
{
int i;
for (i=0;i<=set.num;i++)
elem[i]=set.elem[i];
num=set.num;
}
void Set::disp() //输出集合所有元素
{
int i;
for (i=0;i<=num;i++)
cout << elem[i] << " ";
cout << endl;
}
void main()
{
int a[]={2,5,1,8,7},b[]={5,7,2,9};
Set s1(a,4),s2(b,4),s3,s4,s5;
cout << "集合s1:";s1.disp();
cout << "集合s2:";s2.disp();
cout << "向集合s1中添加元素10" << endl;
s1.add(10);
cout << "集合s1:";s1.disp();
cout << "集合s2中删除元素9" << endl;
s2.sub(9);
cout << "集合s2:";s2.disp();
cout << "集合s1和s2" << (s1.equ(s2)?"相同":"不相同") << endl;
s3=s1.intersection(s2);
cout << "集合s1和s2的交:";
s3.disp();
s4=s1.merge(s2);
cout << "集合s1和s2的并:";
s4.disp();
cout << "将集合s2复制到s5" << endl;
s5=s2;
cout << "集合s5:";s5.disp();
}