设计整数集合类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(); }