【问题描述】
- 创建类IntegerSet,它的每个对象可以存储0到100范围内的整数。集合在内部表示为0和1的数组。如果整数这个集合内,则数组元素a[i]是1。如果整数j不在这个集合内,则元素a[j]为0。默认的构造函数将集合初始化为所谓的“空集合”,即其数组表示中所有元素都是0的集合。
- 提供常用集合操作的成员函数。例如,提供unionOfSets成员函数,它生成第三个集合,这个集合是两个现有集合论上的并集(即,如果两个现有集合中只要有一个集合的元素为1,第三个集合中的数组元素设置为1;如果在两个集合中的元素都为0,则第三个集合中的数组元素设置为0)。
- 提供intersectionOfSets成员函数,该函数生成第三个集合,是两个现有集合论上的交集(即,如果两个现有集合中只要有一个集合的元素为0,则第三个集合中的数组元素设置为0,如果在两个集合中的两个元素都为1,第三个集合中的数组元素设置为1)。
- 提供insertElement成员函数,它把一个新整数k插入到集合中(通过将a[k]设置为1)。
- 提供deleteElement 成员函数,它删除整数m(将a[m]设为0)。
- 提供printSet成员函数,它把集合打印为用空格隔开的数字列表。只打印集合中出现的元素(即,在数组对应位置上值为1的元素)。对于空集,则打印“ ”。
- 提供isEqualTo 函数,判定两个集合是否相等。
- 提供另一个设置函数,它接受一个整数的数组以及该数组的大小,并使用该数组初始化集合对象。
- 现在编写一个驱动程序测试你的IntegerSet类。实例化几个IntegerSet对象并且测试你的所有成员函数是否工作正常。
在上面的问题描述中,已经把程序的结构以及内容说的很清楚了,所以下面我们将按照题目描述来编写程序。
- 先编写出IntegerSet类的主要框架(成员函数,数据成员)。
class IntegerSet { public: IntegerSet(); void Set1(int array1_[],int end1); void Set2(int array2_[],int end2); void unionOfSets(); //求并集 void intersectionOfSets(); //求交集 void insertElement(int); //插入 void deleteElement(int); //删除 void printSet(int); //打印 void isEqualTo(); //判断是否相等 private: int array1[100];//可以存储0~100的整数,内部表示为0或1 int array2[100]; int num; };
- 无参构造函数:将集合初始化为所谓的“空集合”。
IntegerSet::IntegerSet() { for(int i=0;i<100;i++) { array1[i]=0; array2[i]=0; } }
- 另一个设置函数,接受一个整数的数组以及该数组的大小,并使用该数组初始化集合对象。
void IntegerSet::Set1(int array1_[],int end1) { for(int i=0;i<end1;i++) { for(int k=0;k<100;k++) { if(array1_[i]==k) { array1[k]=1; } } } } void IntegerSet::Set2(int array2_[],int end2) { for(int i=0;i<end2;i++) { for(int k=0;k<100;k++) { if(array2_[i]==k) { array2[k]=1; } } } }
- unionOfSets成员函数,求并集。
void IntegerSet::unionOfSets()//两个现有集合的并集,两个集合只要一个为1就1,都为0才为0 { int array3[100]; cout<<"两集合的并集为 :"<<endl; for(int i=0;i<100;i++) { if(array1[i]==1||array2[i]==1) { array3[i]=1; } else { array3[i]=0; } } for(int k=0;k<100;k++) { if(array3[k]==1) { cout<<k<<" "; } } }
- intersectionOfSets成员函数,求交集。
void IntegerSet::intersectionOfSets() //交集 ,只要有一个集合的元素为0就0,都为1才为1 { int array3[100]; cout<<endl; cout<<"两集合的交集为 :"<<endl; for(int i=0;i<100;i++) { if(array1[i]==0||array2[i]==0) { array3[i]=0; } else { array3[i]=1; } } for(int k=0;k<100;k++) { if(array3[k]==1) { cout<<k<<" "; } } cout<<endl; }
- insertElement成员函数,插入一个数。
void IntegerSet::insertElement(int newNumber) //插入一个新整数 { for(int i=0;i<100;i++) { if(newNumber==i) { array1[i]=1; array2[i]=1; } } }
- deleteElement 成员函数,删除一个数。
void IntegerSet::deleteElement(int newNumber)//删除一个整数 { for(int i=0;i<100;i++) { if(newNumber==i) { array1[i]=0; array2[i]=0; } } }
- printSet成员函数,打印数字列表。
void IntegerSet::printSet(int sort) { if(sort==1) { cout<<"集合1为:"; for(int i=0;i<100;i++) { if(array1[i]==1) { cout<<i<<" "; } } } else { cout<<"集合2为:"; for(int k=0;k<100;k++) { if(array2[k]==1) { cout<<k<<" "; } } } }
- isEqualTo 函数,判定两个集合是否相等。
void IntegerSet::isEqualTo() { int flag=1; for(int i=0;i<100;i++) { if(array1[i]==array2[i]==1) { flag=1; } else { flag=0; } } if(flag) { cout<<"两集合相等!"<<endl; } else { cout<<"两集合不相等!"<<endl; } }
- 编写一个驱动程序测试你的IntegerSet类。
int main() { int array1[]={-10,0,5,9,23,26,45,65,88,105,120}; int array2[]={-5,-2,5,8,9,23,28,65,88,99,132}; int end1=sizeof(array1)/sizeof(array1[0]); int end2=sizeof(array2)/sizeof(array2[0]); IntegerSet text1; text1.Set1(array1,end1); text1.Set2(array2,end2); text1.printSet(1); cout<<endl; text1.printSet(2); cout<<endl; text1.unionOfSets() ; text1.intersectionOfSets() ; int number1; cout<<"请输入你想插入的数 :"<<endl; cin>>number1; text1.insertElement(number1); int number2; cout<<"请输入你想删除的数 :"<<endl; cin>>number2; text1.deleteElement(number2) ; text1.printSet(1); cout<<endl; text1.printSet(2); cout<<endl; text1.isEqualTo(); return 0; }
完整代码如下:
//
//创建IntegerSet(整数集)类
//
#include<iostream>
using namespace std;
class IntegerSet
{
public:
IntegerSet();
void Set1(int array1_[],int end1);
void Set2(int array2_[],int end2);
void unionOfSets(); //求并集
void intersectionOfSets(); //求交集
void insertElement(int); //插入
void deleteElement(int); //删除
void printSet(int); //打印
void isEqualTo(); //判断是否相等
private:
int array1[100];//可以存储0~100的整数,内部表示为0或1
int array2[100];
int num;
};
IntegerSet::IntegerSet()
{
for(int i=0;i<100;i++)
{
array1[i]=0;
array2[i]=0;
}
}
void IntegerSet::Set1(int array1_[],int end1)
{
for(int i=0;i<end1;i++)
{
for(int k=0;k<100;k++)
{
if(array1_[i]==k)
{
array1[k]=1;
}
}
}
}
void IntegerSet::Set2(int array2_[],int end2)
{
for(int i=0;i<end2;i++)
{
for(int k=0;k<100;k++)
{
if(array2_[i]==k)
{
array2[k]=1;
}
}
}
}
void IntegerSet::unionOfSets()//两个现有集合的并集,两个集合只要一个为1就1,都为0才为0
{
int array3[100];
cout<<"两集合的并集为 :"<<endl;
for(int i=0;i<100;i++)
{
if(array1[i]==1||array2[i]==1)
{
array3[i]=1;
}
else
{
array3[i]=0;
}
}
for(int k=0;k<100;k++)
{
if(array3[k]==1)
{
cout<<k<<" ";
}
}
}
void IntegerSet::intersectionOfSets() //交集 ,只要有一个集合的元素为0就0,都为1才为1
{
int array3[100];
cout<<endl;
cout<<"两集合的交集为 :"<<endl;
for(int i=0;i<100;i++)
{
if(array1[i]==0||array2[i]==0)
{
array3[i]=0;
}
else
{
array3[i]=1;
}
}
for(int k=0;k<100;k++)
{
if(array3[k]==1)
{
cout<<k<<" ";
}
}
cout<<endl;
}
void IntegerSet::insertElement(int newNumber) //插入一个新整数
{
for(int i=0;i<100;i++)
{
if(newNumber==i)
{
array1[i]=1;
array2[i]=1;
}
}
}
void IntegerSet::deleteElement(int newNumber)//删除一个整数
{
for(int i=0;i<100;i++)
{
if(newNumber==i)
{
array1[i]=0;
array2[i]=0;
}
}
}
void IntegerSet::printSet(int sort)
{
if(sort==1)
{
cout<<"集合1为:";
for(int i=0;i<100;i++)
{
if(array1[i]==1)
{
cout<<i<<" ";
}
}
}
else
{
cout<<"集合2为:";
for(int k=0;k<100;k++)
{
if(array2[k]==1)
{
cout<<k<<" ";
}
}
}
}
void IntegerSet::isEqualTo()
{
int flag=1;
for(int i=0;i<100;i++)
{
if(array1[i]==array2[i]==1)
{
flag=1;
}
else
{
flag=0;
}
}
if(flag)
{
cout<<"两集合相等!"<<endl;
}
else
{
cout<<"两集合不相等!"<<endl;
}
}
int main()
{
int array1[]={-10,0,5,9,23,26,45,65,88,105,120};
int array2[]={-5,-2,5,8,9,23,28,65,88,99,132};
int end1=sizeof(array1)/sizeof(array1[0]);
int end2=sizeof(array2)/sizeof(array2[0]);
IntegerSet text1;
text1.Set1(array1,end1);
text1.Set2(array2,end2);
text1.printSet(1);
cout<<endl;
text1.printSet(2);
cout<<endl;
text1.unionOfSets() ;
text1.intersectionOfSets() ;
int number1;
cout<<"请输入你想插入的数 :"<<endl;
cin>>number1;
text1.insertElement(number1);
int number2;
cout<<"请输入你想删除的数 :"<<endl;
cin>>number2;
text1.deleteElement(number2) ;
text1.printSet(1);
cout<<endl;
text1.printSet(2);
cout<<endl;
text1.isEqualTo();
return 0;
}