怎么把这串代码改正确

怎么把这串代码改正确

#include 
#include 
 
class Set {
private:
    int Setnum[100];
    int length=0;
public :
    Set();
    Set(int n[100]);
    Set(Set &s);
    ~Set();
 
    void add_num(int num);
    void del_num(int num);
    void show_num();
    Set jiaoji(Set &s2);
    Set bingji(Set &s2);
    Set chaji(Set &s2);
    bool equals1(Set &s2);
    bool ifinclude(Set &s2);
    bool ifempty();
    int num_size();
    void beempty();
 
};
 
 
Set::Set()
{
    this->length=0;
    memset(this->Setnum,0,sizeof (Setnum));
}
 
Set::Set(int *n)
{
      for(int i=0;i<_msize(n)/sizeof(*n);i++)
        this->add_num(n[i]);
}
Set::Set(Set &s)
{
    length=s.length;
    for(int i=0;iSet()
{
 
}
void Set::add_num(int num)
{
    int flag=0;
    for(int i=0;iif(Setnum[i]==num)
        {
            flag=1;
            break;
        }
    }
    if(flag==0)
    {
        Setnum[length]=num;
        length++;
    }
}
void Set::del_num(int num)
{
    int n=length;
    while(n--){
        if(Setnum[n]==num)
            break;
    }
    for(int i=n;ifor(int i=0;i" ";
    }
    cout<Set Set::jiaoji(Set &s2)
{
    Set s;
    for(int i=0;ilength;i++)
    {
        s.Setnum[i]=this->Setnum[i];
        s.length= this->length;
    }
    for(int i=0;iSet Set::bingji(Set &s2)
{
    Set s;
    for(int i=0;ilength;i++)
    {
        for(int j=0;jif(this->Setnum[i]==s2.Setnum[j])
            {
                s.Setnum[s.length]=s2.Setnum[j];
                s.length++;
            }
        }
    }
    return s;
}
Set Set::chaji(Set &s2)
{
    int flag=0;
    Set s,sbing;
    sbing=this->bingji(s2);
    for(int i=0;ilength;i++)
    {
        flag=0;
         for(int j=0;jif(this->Setnum[i]==sbing.Setnum[j])
             {
                 flag=1;
                 break;
             }
         }
         if(flag==0){
             s.Setnum[s.length]=this->Setnum[i];
             s.length++;
         }
    }
    return s;
}
bool Set::equals1(Set &s2)
{
    if(this->length!=s2.length)
        return false;
    for(int i=0;ilength;i++)
    {
        if(this->Setnum[i]!=s2.Setnum[i])
            return false;
    }
    return true;
}
 
bool Set::ifinclude(Set &s2)
{
    Set *sbing=new Set();
    *sbing=this->bingji(s2);
    if(sbing->length==this->length||sbing->length==s2.length)
        return true;
    else
        return false;
}
 
bool Set::ifempty()
{
    if(this->length==0)
        return true;
    else
        return false;
}
 
int Set::num_size()
{
    return this->length;
}
 
void Set::beempty()
{
    memset(Setnum,0,sizeof(Setnum));
    this->length=0;
}
 
 
int main()
{
    cout<<"1.创建集合 s1 & s2和s3"<Set *s1=new Set(new int[]{1,10,9,8,7});
    Set *s2=new Set(new int[]{1,8,7});
    Set *s3=new Set(new int[]{1,7,9,6,5});
    Set s4(*s3);
    s1->show_num();
    s2->show_num();
    s3->show_num();
    cout<<"**************************"<"2.向集合s1中添加一个元素5"<add_num(5);
    s1->show_num();
    cout<<"**************************"<"3.从集合s3中删除一个元素7"<del_num(7);
    s3->show_num();
    cout<<"**************************"<"4.计算s1和s2的交集"<Set *sjiao=new Set();
    *sjiao=s1->jiaoji(*s2);
    sjiao->show_num();
    cout<<"**************************"<"5.计算s1和s2的并集"<Set *sbing=new Set();
    *sbing=s1->bingji(*s2);
    sbing->show_num();
    cout<<"**************************"<"6.计算s1和s2的差集"<Set *scha=new Set();
    *scha=s1->chaji(*s2);
    scha->show_num();
    cout<<"**************************"<"7.显示指定的集合"<"s1集合:";s1->show_num();
    cout<<"s1集合:";s2->show_num();
    cout<<"s1集合:";s3->show_num();
    cout<<"**************************"<"8.显示s1和s2是否相等"<equals1(*s2);
    cout<<"**************************"<"9.显示s1是否包含s2"<ifinclude(*s2)<"**************************"<"10.清空指定集合s4"<"清空前";s4.show_num();
    s4.beempty();
    cout<<"清空后";s4.show_num();
    cout<<"**************************"<"11。显示指定集合是否为空 "<"s1是否为空:"<ifempty()<<" 长度:"<num_size()<"s2是否为空:"<ifempty()<<" 长度:"<num_size()<"s3是否为空:"<ifempty()<<" 长度:"<num_size()<"s4是否为空:"<" 长度:"<"**************************"<"12.Quit program"<

参考GPT和自己的思路:这段代码存在一些错误和改进的空间,具体如下:

  1. 在类定义中,length成员变量已经初始化为0,不需要在构造函数中再次初始化。同时,可以将Setnum数组的大小定义为常量,而不是固定为100。

  2. 在Set的构造函数中,应该使用动态内存分配来初始化Setnum数组。目前的代码使用了固定大小的数组,如果传入的数组大小超过100或小于100,可能会导致程序崩溃或出现其他问题。

  3. 在Set的构造函数和拷贝构造函数中,应该使用n.num_size()来获取n集合的大小,而不是使用_msize(n)/sizeof(*n)。因为_msize(n)返回的是n数组在内存中占用的大小,而不是数组元素的大小。

  4. 在Set的jiaoji函数中,应该使用s2中的元素来更新s集合,而不是使用this指针指向的集合。这样会导致s集合变为s1和s2的并集,而不是它们的交集。

  5. 在Set的bingji函数中,使用了两层循环来计算并集,时间复杂度为O(n^2)。可以使用set容器来快速计算并集。具体地,在添加元素时,判断set容器中是否已经存在该元素,如果存在就不进行添加。

  6. 在Set的chaji函数中,使用了两层循环来计算差集,时间复杂度为O(n^2)。可以使用set容器来快速计算差集。具体地,在将两个集合求并集之后,遍历原集合中的元素,如果不在并集中就加入差集中。

  7. 在Set的equals1函数中,可以使用memcmp函数来判断两个集合是否相等。因为Setnum数组是int类型,可以将其看作字节数组进行比较。

  8. 在Set的ifinclude函数中,可以使用set容器来辅助判断是否包含。具体地,将两个集合求并集,然后判断并集的大小是否等于s1或s2的大小。

  9. 在代码中存在大量的内存分配和释放,可能会导致性能问题。可以使用智能指针等技术来自动管理内存。

整理后的代码如下:

代码太多,你到底是编译错误还是运行错误
贴出错误信息

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^