原题
给定集合类的模板抽象类如下:
template
class Set
{
public:
//在集合中插入一个元素 e
virtual void Insert(const Elem& e) = 0;
//在集合中删除一个值等于e的元素,如果删除成功则返回true,否则返回false
virtual bool Remove(const Elem& e) = 0;
//获取最早加入到集合第一个元素,该元素的值记录在参数e中返回。如果集合为空,则函数返回false,否则返回true。
virtual bool GetFirstElement(Elem& e) = 0;
//获取最晚加入到集合的元素,该元素的值记录在参数e中返回。 如果集合为空,则函数返回false,否则返回true。
virtual bool GetLastElement(Elem& e) = 0;
//获取集合的元素的个数
virtual int GetSize() = 0;
//获取集合所有元素的值记录在参数array中返回。函数返回集合元素的个数
virtual int GetElements(Elem array[ ]) = 0;
//按进入集合的次序,依次打印输出集合中的元素
virtual void Print() = 0;
//将集合s中的元素合并到当前集合中
virtual void operator += (Set<Elem> & s) = 0;
};
请实现一个继承上述抽象类的集合类ASet,并利用该集合类完成集合操作。
输入
输入数据有三行,每一行对应一个整数集合的元素,排列的顺序是各个元素进入到集合中的先后顺序。这三个整数集合依次记为集合S1、S2和S3。集合的元素的个数不超过1000个,每个元素的取值范围是1~65536。
输出
输出结果分为5行,第1行输出集合S1中第一个元素和最后一个元素;第2行输出集合S2的元素的个数;第3行按进入集合的先后顺序输出S3中的所有元素;第4行,将集合S2合并到S1后,按进入集合的先后次序打印输出S1中的元素;第5行,将集合S2减去集合S3后,按进入集合的先后次序打印输出S2中的元素。
样例输入
1 3 4 5 6 7 8
2 3 4 10 12
1 3 4 100 101
样例输出
1 8
5
1 3 4 100 101
1 3 4 5 6 7 8 2 10 12
2 10 12
我的问题是:创建集合对象时,向里面输入一些数字,后面输出的时候总是会自己添加一些数字,导致输出的结果不对,还有重载的那个函数实现有问题,所以上来问问。如果大佬愿意的话,把代码也告诉我吧,作业提交在即。
你是用的数组,那么还需要一个变量表示有效数据的长度。
template
class Aset :public Set{
public:
typedef unsigned setType[32];
Aset(setType x):Set(x){
setPut(S);
}
void setPut(setType S) {
unsigned x;
cin >> x;
while (x)
{
Insert(x);
cin >> x;
}
}
void Insert(const unsigned & e) {
unsigned bitMask = 1;
bitMask <<=((e - 1)%32);
S[(e-1)/32]|= bitMask;
}
bool is_exist( unsigned e) {
unsigned bitMask = 1;
bitMask <<= ((e- 1)%32);
if (S[(e-1)/32] & bitMask)
return true;
return false;
}
bool Remove(const setType & e) {
unsigned i;
if (is_exist( e)) {
unsigned bitMask=1;
bitMask <<= ((e - 1)%32);
for (i = 0; i < 32; i++) {
S[i] ^= bitMask;
}
return true;
}
return false;
}
bool Is_NULL(setType S)
{
bool t = true;
for(int i=0;i<32;i++)
if(S[i]) t= false;
return t;
}
bool GetFirstElement(unsigned & e) {
unsigned c, i;
unsigned bitMask;
if (Is_NULL(S))
return false;
else for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i]& bitMask) e=i*32+c;
while (e) break;
bitMask <<= 1;
}
while (e) break;
}
cout << e;
return true;
}
bool GetLastElement(unsigned & e) {
if (Is_NULL(S)) return false;
unsigned c, i;
unsigned bitMask;
for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i] & bitMask) e =i*32+ c;
bitMask <<= 1;
}
}
cout <<e;
return true;
}
int GetSize() {
unsigned c, i;
unsigned n = 0;
unsigned bitMask;
for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i] & bitMask) n++;
bitMask <<= 1;
}
}
return n;
}
int GetElements(unsigned array[]) {
int j = 0;
unsigned c, i;
unsigned bitMask;
for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i] & bitMask) {
array[j] = i * 32 + c;
cout << array[j];
j++;
}
bitMask <<= 1;
}
}
return j + 1;
}
void Print() {
unsigned c, i;
unsigned bitMask;
if (Is_NULL(S)) {
cout << "{ }\n";
return;
}
else for (i = 0; i < 32; i++)
{
bitMask = 1;
for (c = 1; c <= 32; c++) {
if (S[i]& bitMask) cout << i*32+c<< " ";
bitMask <<= 1;
}
}
}
void operator += (Set<setType> & s) {
for (int i = 0; i < 32; i++)
S[i] |= s[i];
}
};
改了很多次还是不对
不知道你这个问题是否已经解决, 如果还没有解决的话: