C ++,添加和减去多项式的错误

时间:2017-05-20 01:22:53

标签: c++

嘿伙计们我的程序有点小问题。我写了两个函数来添加和减去多项式。这是一个添加功能。

Wielomian Wielomian::operator +(Wielomian &w)
{
Wielomian pomW=*this;
Wielomian pomM=w;
if(pomM.st > pomW.st)
{
    pomM = *this;
    pomW = w;
}
for(int i=pomM.st;i>=0;i--)
{
    pomW.wsp[i] = pomW.wsp[i] + pomM.wsp[i];
}
return pomW;
}

我还创建了2个多项式。     Wielomian w1(“15x ^ 3 + x ^ 2 + x + 2”);     Wielomian w2(“3x ^ 2 + x + 3”);

事情是我打电话的时候:     cout<< W1-W2; 第一个多项式更大的地方都可以,但是当我做的时候     cout<< W2-W1; 在第一个多项式较小的情况下,程序显示出良好的结果,但随后破碎。请帮我。同样的事情是减去。

ostream & operator <<(ostream &wyjscie, const Wielomian &w)
{
for (int i=w.st; i>=0;i--)
{
    if(i!=0 && w.wsp[i]!=0)
    {
        if(i==1)
            wyjscie << w.wsp[i] << "x" << (w.wsp[i-1]>0 ? "+" : "");
        else
            wyjscie << w.wsp[i] << "x^" << i << (w.wsp[i-1]>0 ? "+" : "");
    }
    else if(i!=0 && w.wsp[i]==0)
    {
        wyjscie << (w.wsp[i-1]>0 ? "+" : "");
    }
    else if(i==0)
    wyjscie << w.wsp[i];
}
return wyjscie;
}

班级变量:

int st;
int *wsp;

复制构造函数:

Wielomian::Wielomian(Wielomian &w)
{
st=w.st;
wsp = new int[w.st];
for(int i=0; i<=st; i++)
    wsp[i]=w.wsp[i];
}

1 个答案:

答案 0 :(得分:1)

  

但是当我犯cout&lt;&lt; W2-W1;在第一个多项式较小的情况下,程序显示出良好的结果,但随后破碎。

您需要定义复制赋值运算符,在本例中使用:

if(pomM.st > pomW.st)
{
   pomM = *this;
   pomW = w;
}

您还应该在复制构造函数中进行一些更正,以避免超出wsp数组的范围。

Wielomian::Wielomian(const Wielomian &w) // <-- const
{
  st=w.st;
  wsp = new int[w.st];
  for(int i=0; i < st; i++) // <--  < instead of <=
    wsp[i]=w.wsp[i];
}

// assignment operator
Wielomian& operator= (const Wielomian &w)
{ if(st > 0) delete[] wsp;
  st=w.st;
  wsp = new int[w.st];
  for(int i=0; i < st; i++)
    wsp[i]=w.wsp[i];

  return *this;
}

最后,您可以使用std::vector作为wsp,建议这样做,使事情变得更轻松,更不容易出错。 std::vector将自行管理已分配的资源,因此您不需要任何其他非自定义析构函数,复制构造函数等(请参阅“零规则”)。

如果你没有模式使用std :: vector,不要忘记编写自定义析构函数以便delete[] wsp。 (见“三规则”)。

P.S。另一个超出界限的访问在这里

for(int i=w.st; i>=0;i--)

应为for(int i=w.st - 1; i>=0; i--)。您应该再次检查阵列上的所有迭代,并确保消除任何超出限制的访问。