【C++】类和对象编程练习——定义整数集合类

定义整数集合类intSet.该类包括以下成员函数:

    inSet();                       //类的构造函数,根据需要可以定义多个构造函数
    int Empty();                   //清空该整数集合
    bool Isempty();                //判断整数集合是否为空
    bool Ismemberof();             //判断某个整数是否在该整数集合内
    int Add();                     //增加一个整数到整数集合
    int Sub();                     // 从整数集合中删除一个整数元素
    int Isequal();                 // 判断2个集合是否相等
    int Intersection();            //求2个整数集合的交集
    int Merge();                   //求2个整数集合的并集
    void Print();                  //依次打印该整数集合


该类还包括一下数据成员:

int element[100]     保存整数集合数据
int Endposition      指示集合的最后一个元素位置


注意:整数集合中不允许有相同的元素存在.另外,对于函数的参数及其返回值类型,根据需要自定义

找到一个网友的,一会留着对比:

https://zhidao.baidu.com/question/43414714.html

下面是自己的代码:

#include <iostream>

using namespace std;
class intSet
{
public:
    intSet()
    {
        cout<<"无参数构造函数"<<endl;
    }
    intSet(int e[],int endp)
    {
        Endposition=endp;
        for(int i=0; i<endp+1; i++)
        {
            element[i]=e[i];
        }
        cout<<"带参数的构造函数"<<endl;
    }
    int Empty();
    bool Isempty();
    bool Ismemberof(int n);
    int Add(int x);
    int Sub(int y);
    bool Isequal(int a[]);
    int Intersection(int a[],int b);
    int Merge(int a[],int b);
    void Print();
private:
    int element[100];//保存整数集合数据
    int Endposition;//指示集合的最后一个元素位置(我这里看为下标)
};
int intSet::Empty()
{
    Endposition=-1;//最后一个元素的位置为-1,应该就是清空了吧
    return 0;
}
bool intSet::Isempty()
{
    if(Endposition==-1) return 0;//为空
    return 1;//不为空
}
bool intSet::Ismemberof(int n)
{
    for(int j=0; j<=Endposition; j++)
    {
        if(n==element[j]) return 1;//存在
    }
    return 0;
}
int intSet::Add(int x)//增加一个整数到整数集合
{
    for(int i=0; i<Endposition+1; i++)
    {
        if(x==element[i])
        {
            cout<<"集合中已经存在,不用添加!"<<x<<endl;
            return 0;
        }
    }

    Endposition++;
    element[Endposition]=x;
    return 0;
}
int intSet::Sub(int y)//从整数集合中删除一个整数元素
{
    int temp;
    if(Ismemberof(y)==1)
    {
        for(int j=0; j<=Endposition; j++)
        {
            if(element[j]==y)
            {
                temp=j;//获取位置
            }
        }
        for(int j=temp; j<Endposition-1; j++)
        {
            element[j]=element[j+1];
        }
        Endposition--;

    }
    return 0;
}
bool intSet::Isequal(int a[])//判断2个集合是否相等
{
    if(a==element) return 1;
    return 0;
}
int intSet::Intersection(int a[],int b)//求2个整数集合的交集
{
    int temp[100];
    int t=0;
    for(int k1=0; k1<=Endposition; k1++)
    {
        for(int k2=0; k2<b; k2++)
        {
            if(element[k1]==a[k2])
            {
                temp[t]=a[k2];
                t++;
            }
        }
    }
    cout<<"交集是:"<<endl;
    for(int q=0; q<t; q++)
    {
        cout<<temp[q]<<" ";
    }
    cout<<endl;
    return 0;
}
int intSet::Merge(int a[],int m)//求2个整数集合的并集
{
    int b[200];
    int t=Endposition+1;
    for(int i=0; i<Endposition+1; i++)
    {
        b[i]=element[i];
    }
    /**
    *求并集,我的想法是用一个大数组把第一个全copy进去,
    *然后比对第二个数组,如果数组2中的数在1中找不到,大数组就把这个数吞进去。
    */

    for(int k1=0; k1<m; k1++)
    {
        int k3=0;
        for(int k2=0; k2<Endposition+1; k2++)
        {
            if(a[k1]!=element[k2])
            {
                k3++;
            }
        }
        if(k3==Endposition+1)
        {
            b[t]=a[k1];
            t++;
        }
    }
 cout<<"并集共"<< t<<" 个元素"<<endl;
    cout<<"并集是:"<<endl;
    for(int q=0; q<t; q++)
    {
        cout<< b[q]<<" ";
    }
    cout<<endl;
    return 0;
}
void intSet::Print()
{
    if(Endposition==-1)
    {
        cout<<"集合为空!无可打印"<<endl;
    }
    else
    {
        cout<<"集合是:"<<endl;
        for(int q=0; q<Endposition+1; q++)
        {
            cout<<element[q]<<" ";
        }
        cout<<endl;
    }
}
int main()
{

    int a[100]= {1,2,4,6,8,9};
    int b=5;
    cout<<"测试intSet s(a,b):"<<endl;
    intSet s(a,b);
    s.Print();
    int a2[7]= {1,13,5,6,7,10,11};
    cout<<endl;
    cout<<"测试Ismemberof(4):"<<endl;
    int k= s.Ismemberof(4);
    if(k==1)cout<<"集合中存在4"<<endl;
    else cout<<"集合中不存在4"<<endl;
    cout<<endl;
    cout<<"测试Add(5):"<<endl;
    s.Add(5);
    s.Print();
    cout<<endl;
    cout<<"测试Sub(5):"<<endl;
    s.Sub(5);
    s.Print();
    cout<<endl;
    cout<<"另一个运算的集合是:"<<endl;
    for(int q=0; q<7; q++)
    {
        cout<<a2[q]<<" ";
    }
    cout<<endl;
    cout<<"测试Merge(a2) 并集:"<<endl;
    s.Merge(a2,7);
    cout<<endl;

    cout<<"测试Intersection(a2) 交集:"<<endl;
    s.Intersection(a2,b);
    cout<<"测试Empty(),Isempty():"<<endl;
    cout<<"清空集合"<<endl;
    s.Empty();
    int i=s.Isempty();
    if(i==0)cout<<"经检测,集合为空"<<endl;
    else cout<<"经检测,集合不为空"<<endl;
    return 0;
}

运行结果:

遇到的问题:

1.例如:int j=sizeof(a)/sizeof(int);
  文章案例https://blog.csdn.net/cai649399010/article/details/84170308

除了char型数组可以用strlen求出它的实际存储个数,整型数组是不可以用sizeof的除非他装满了。

2.一开始没有看到题目中私有成员中有了数组的位置,想着自己可以求出来,结果花费了很多时间,也不可以。用了下标之后就很清晰了。

3.注意一些细节,集合中不可以有重复的部分,交集和并集的求法。

4.运用私有成员下标表示数组的清空,一开始自己还想着delete啥的,网上查不可以,毕竟也不是new出来的空间。

5.上面的代码是自己写的,写的很啰嗦,应该还可以简化。

6.通过这一题大概熟悉掌握类的声明和函数的声明以及调用等语法和方法。

================写的脑袋晕乎乎的,再看下这个网友的答案

https://zhidao.baidu.com/question/43414714.html=====================================

#include <iostream>
using namespace std;
enum DeleteType{theElement,theIndex};
class IntEet
{
public:
IntEet();// 构造函数,根据需要可重载
IntEet(int e);
IntEet(IntEet *const is);
IntEet(int ia[],int );
void Clear(); //清空集合
bool IsEmpty(); //判断集合是否为空
bool IsMember(int m); //判断某个整数是否在集合中
bool Add(int m); //增加一个
bool Delete(int a,DeleteType dt); //删除一个
bool Delete();
bool IsEqual(IntEet &is); //判断两个集合是否相等
IntEet * Intersection(IntEet &is); //两个集合的交集
IntEet * Merge(IntEet &is); //两个集合的并集
inline void Print(); //打印集合
inline int Size(); //集合的大小
private:
int element[100];
int EndPosition;
};
IntEet::IntEet():EndPosition(-1){}
IntEet::IntEet(int e):EndPosition(e-1){}
IntEet::IntEet(IntEet *const is)
{
this->EndPosition=is->EndPosition;
for(int i=0;i<=this->EndPosition;i++)
{
this->element[i]=is->element[i];
}
}
IntEet::IntEet(int ia[],int s):EndPosition(s-1)
{
for(int i=0;i<s;i++)
element[i]=ia[i];
}
void IntEet::Clear(){this->EndPosition=-1;}
bool IntEet::IsEmpty()
{
if(this->EndPosition>=0) return false;
return true;
}
bool IntEet::IsMember(int m)
{
if(IsEmpty()) return false;
for(int i=0;i<=EndPosition;i++)
{
if(m==element[i])
return true;
}
return false;
}
bool IntEet::Add(int m)
{
if(EndPosition==99) return false;
element[++this->EndPosition]=m;
return true;
}
bool IntEet::Delete()
{
if(IsEmpty())
return false;
EndPosition--;
return true;
}
bool IntEet::Delete(int a,DeleteType dt=DeleteType::theIndex)
{
if(dt==DeleteType::theIndex)
{
if(0<=a&&a<=EndPosition)
{
for(;a<EndPosition;a++)
element[a]=element[a+1];
EndPosition--;
return true;
}
return false;
}
else
{
for(int i=0;i<=EndPosition;i++)
{
if(element[i]==a)
{
Delete(i--);
}
}
return true;
}
}
bool IntEet::IsEqual(IntEet &is)
{
if(this->Size()!=is.Size())
return false;
for(int i=0;i<this->EndPosition;i++)
{
if(this->element[i]!=is.element[i])
return false;
}
return true;
}
IntEet * IntEet::Intersection(IntEet &is)
{
inSet * ris=new IntEet(this);
if(is.IsEmpty())
return ris;
for(int i=0;i<=is.EndPosition;i++)
{
if(!ris->IsMember(is.element[i]))
if(!ris->Add(is.element[i]))
{
cout<<"容器已满,无法添加元素";
return ris;
}
}
return ris;
}
IntEet * IntEet::Merge(IntEet &is)
{
IntEet *ris=new IntEet();
if(is.IsEmpty())
return ris;
if(this->IsEmpty())
return ris;
for(int i=0;i<=this->EndPosition;i++)
if(is.IsMember(this->element[i]))
ris->Add(this->element[i]);
return ris;
}
void IntEet::Print()
{
if(this->IsEmpty())
cout<<"这个IntEet是空的"<<endl;
else
{
cout<<"这个IntEet具有"<<this->Size()<<"个元素:";
for(int i=0,j=0;i<=this->EndPosition;i++,j++)
{
if(j%5==0) cout<<endl;
cout<<this->element[i]<<"\t";
}
cout<<endl;
}
}
int IntEet::Size()
{
return this->EndPosition+1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int ia[]={0,1,2,3,4,4,6,7,8,9};
int iar[]={5,6,7,8,9,10,11,12,13,14};
IntEet is(ia,10);
is.Print();
IntEet ist(iar,10);
if(is.IsMember(3))
cout<<"3是is的元素"<<endl;
else
cout<<"3不是is的元素"<<endl;
if(is.IsMember(10))
cout<<"10是is的元素"<<endl<<endl;
else
cout<<"10不是is的元素"<<endl<<endl;
if(is.Add(10))
{
is.Print();
cout<<"Add(10)成功"<<endl<<endl;
}
else
cout<<"add()有错误"<<endl<<endl;
if(is.Delete())
{
is.Print();
cout<<"Delete()成功"<<endl<<endl;
}
else
cout<<"Print()有错误"<<endl<<endl;
if(is.Delete(2))
{
is.Print();
cout<<"Delete(2)成功"<<endl<<endl;
}
else
cout<<"Delete(2)有错误"<<endl<<endl;
if(is.Delete(4,DeleteType::theElement))
{
is.Print();
cout<<"Delete(4,DeleteType::theElement)成功"<<endl<<endl;
}
else
cout<<"Delete(4,DeleteType::theElement)有错误"<<endl<<endl;
ist.Print();
cout<<endl<<"交集"<<endl;
is.Intersection(ist)->Print();
cout<<endl<<"并集"<<endl;
is.Merge(ist)->Print();
return 1;
}

粘贴编译了下有一些错,我不太会改,枚举类型啥的,不懂这个语法,我先去看后面的了,等看完再回来看看能不能调试好网友的代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值