程序实践系列(四)使用类设计整数集合类

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



 



你可能感兴趣的:(程序实践)