c++ 实验二(1)
1、 实现一个整数集合类,集合类中元素的个数可变。集合类可存储的元素个数在对象构造时给定,由构造函数为数据元素分配存储空间,在对象被释放时由析构函数释放存储空间。该类还实现了集合元素的增添、删除、复制、查找、显示及求集合的交集。阅读并理解下面的程序,完成求集合的并集函数。
#include<iostream>
using namespace std;
const int maxNum = 20; //集合中允许容纳的元素的默认最大值
class Set
{
private:
int size; //集合中允许容纳的元素的最大个数
int *elems; //存储元素的数组
int num; //集合中元素的个数
public:
Set(int sz=maxNum);
~Set();
bool IsMember(int); //判断是否为集合的元素
bool AddElement(int); //添加元素
void RemoveElement(int); //删除元素
void Copy(Set &); //集合复制
void Show(); //显示集合中元素
void Intersect(Set &,Set &); //求集合的交集// 本类对象做成员函数的形参一定要用引用!
void Union(Set &,Set &); //求集合的并集
};
//类Set的实现
inline Set::Set(int sz)
{
num=0;
size=sz;
elems=new int[size];
}
inline Set::~Set()
{
num=0;
size=0;
delete []elems;
}
bool Set::IsMember(int e)
{
for (int i=0; i<num; i++)
if (elems[i]==e) return true;
return false;
}
bool Set::AddElement(int elem)
{
if (IsMember(elem)) return true;
if (num<size)
{
elems[num++] = elem;
return true;
}
return false;
}
void Set::RemoveElement(int c)
{
int index=-1;
for (int i=0; i<num; i++)
if (elems[i]==c)
{
index =i;
break;
}
if (index!=-1)
{
for (int i=index; i<num-1; i++)
elems[i] = elems[i+1];
num --;
}
}
void Set::Copy(Set &s) //复制构造
{
if (size<s.size)
{
delete []elems;
elems = new int[s.size];
size = s.size;
}
for (int i=0; i<s.num; i++) elems[i] = s.elems[i];
num = s.num;
}
void Set::Show()
{
cout<<"{";
for (int i=0; i<num-1; i++) cout<<elems[i]<<",";
if (num>0) cout<<elems[num-1];
cout<<"}"<<endl;
}
void Set::Intersect(Set &s1, Set &s2)
{
if (size<s1.size)
{
delete []elems;
elems=new int[s1.size];
size=s1.size;
}
num=0;
for (int i=0; i<s1.num; i++)
if (s2.IsMember(s1.elems[i])) elems[num++] = s1.elems[i];
}
void Set::Union(Set &s1,Set &s2) //求集合的并集(填写代码,实现其功能)
{int flag=1,i;
if(s2.num>s1.num) flag=2;
if(flag=1)
{
for(i=0;i<s1.num;i++)
{
elems[i]=s1.elems[i];
num++;
}
for(i=0;i<s2.num;i++)
{
AddElement(s2.elems[i]);
}
}
else
{
for(i=0;i<s1.num;i++)
{
elems[i]=s1.elems[i];
}
for(i=0;i<s1.num;i++)
{
AddElement(s1.elems[i]);
}
}
}
//测试
int main()
{
Set s1,s2,s3;
int i;
for (i=0; i<5; i++) s1.AddElement(2*i);
for (i=0; i<5; i++) s2.AddElement(3*i);
cout<<"s1="; s1.Show();
cout<<"s2="; s2.Show();
s2.RemoveElement(9);
cout<<"s2-{9}="; s2.Show();
if (s1.IsMember(2)) cout<<"2 is in s1\n";
else cout<<"2 is not in s1\n";
s3.Intersect(s1,s2);
cout<<"s1 intsec s2="; s3.Show();
s3.Union(s1,s2);
cout<<"s1 union s2="; s3.Show();
return 0;
}