嘿伙计们我的程序有点小问题。我写了两个函数来添加和减去多项式。这是一个添加功能。
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];
}
答案 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--)
。您应该再次检查阵列上的所有迭代,并确保消除任何超出限制的访问。