📄 polynomial.cpp
字号:
#include<iostream.h>
#include"polynomial.hpp"
//////////////////////////////////////////////////////////////////////////
Polynomial::Polynomial() //构造0多项式
{
}
//////////////////////////////////////////////////////////////////////////
Polynomial::Polynomial(term& t) //用项构造单项式
{
poly.Insert(t);
}
//////////////////////////////////////////////////////////////////////////
Polynomial::Polynomial(Polynomial& p) //拷贝构造函数
{
ListIterator<term> polyiterator(poly),piterator(p.poly);//建立多项式的链表游标类
for(polyiterator.init(),piterator.init();!piterator;++polyiterator,++piterator)
polyiterator.addAfter(piterator());//逐项将p中的项复制到新建立多项式中
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator =(Polynomial &p)
{
poly.Clear();//先将=右边的多项式的链表清空
//以下实现与上面的拷贝构造函数的实现相同
ListIterator<term> polyiterator(poly),piterator(p.poly);
for(polyiterator.init(),piterator.init();!piterator;++polyiterator,++piterator)
polyiterator.addAfter(piterator());
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator +(Polynomial& left,term& right)
{
Polynomial result(left);//用left创建一个新多项式作为返回结果
ListIterator<term> iterator(result.poly);
for(iterator.init();(!iterator)&&(iterator().getPower()!=right.getPower());++iterator)
{;}//在"+"左边的多项式left中检查是否有与"+"右边的right项指数相同的项;
if(!iterator)//如果此时游标的current指示的项非空,表示left中有与right指数相同的项
{
//修改current指示的项系数
iterator().setCoefficient(iterator().getCoefficient()+right.getCoefficient());
//如果相加后的系数为零,则将当前项删除
if(iterator().getCoefficient()==0)
iterator.removeCurrent();
}
else//如果current已指向链尾,表示left中没有一项与right的指数相同
{
iterator.Locate(right);//在结果多项式中寻找right项的插入位置
iterator.addBefore(right);//插入
}
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator +(Polynomial& left,Polynomial& right)
{
Polynomial result(left);//用left建立一个result多项式作为返回结果
ListIterator<term> iterator(right.poly);
//调用上面已经定义的多项式polynomial与项term的相加函数+逐项将多项式right中的项加到结果多项式中
for(iterator.init();!iterator;++iterator)
result=result+iterator();
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator *(Polynomial& left,term& t)
{
Polynomial result(left);
ListIterator<term> iterator(result.poly);
for(iterator.init();!iterator;++iterator)
{
//多项式与项相乘,将left中的每一项的系数与项t中的系数相乘,
iterator().setCoefficient(iterator().getCoefficient()*t.getCoefficient());
//每项的指数与项t中的指数相加
iterator().setPower(iterator().getPower()+t.getPower());
}
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator *(Polynomial& left,Polynomial& right)
{
Polynomial result,temp;
ListIterator<term> iterator(right.poly);
for(iterator.init();!iterator;++iterator)
{
//调用已定义的Polynomial与term相乘函数将right中的每一项逐项与left相乘,然后加到结果多项式中
temp=left*iterator();
result+=temp;
}
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator -(Polynomial& p)//求形式参数多项式的相反数多项式(每项的指数与原来相同,而系数是原来的相反数
{
Polynomial result(p);
ListIterator<term> iterator(result.poly);
for(iterator.init();!iterator;++iterator)
//逐项将系数求负
iterator().setCoefficient(-iterator().getCoefficient());
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator -(Polynomial& left,term& right)
{
//调用已定义的Polynomial+term函数和多项式的求负函数实现减法
Polynomial result;
result=left+(-right);
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial operator -(Polynomial& left,Polynomial& right)
{
//调用已定义的Polynomial+term函数和多项式的求负函数实现减法
Polynomial result;
result=left+(-right);
return result;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator +=(Polynomial &p)
{
*this=*this+p;
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator +=(term& t)
{
*this=*this+t;
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator -=(Polynomial &p)
{
*this=*this-p;
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator -=(term &t)
{
*this=*this-t;
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator *=(term &t)
{
*this=*this*t;
return *this;
}
//////////////////////////////////////////////////////////////////////////
Polynomial Polynomial::operator *=(Polynomial &p)
{
*this=*this*p;
return *this;
}
//////////////////////////////////////////////////////////////////////////
double Polynomial::evalAt(double x)
{
ListIterator<term> iterator(poly);
double result=0.0;
iterator.init();
while(!iterator)
{
//调用term定义的求值函数,逐项将求值结果相加
result+=iterator().evalAt(x);
++iterator;
}
return result;
}
/////////////////////////////////////////////////////////////////////////
istream& operator >>(istream& is,Polynomial& p)
{
ListIterator<term> iterator(p.poly);
//输入前先清空p的链表中的内容,以免重复输入这个多项式时出现问题
p.poly.Clear();
iterator.init();
char ch;
term t;
//先输入第一个项,直接插入存储多项式的有序单链表中
is>>t;
iterator.addAfter(t);
++iterator;
//然后重复执行输入一个字符ch和一个项的操作,通过判断输入的字符ch是否
//等号'='来判断多项式的输入是否结束,如果输入的是'+','-'等运算符,用
//输入流的putback函数将这个字符放回流中
while(is>>ch,ch!='=')
{
is.putback(ch);
is>>t;
p=p+t;//把刚才输入的项t加到多项式中
++iterator;
}
return is;
}
//////////////////////////////////////////////////////////////////////////
ostream& operator <<(ostream& os, Polynomial& p)
{
//分情况输出一个多项式
ListIterator<term> iterator(p.poly);
iterator.init();
//如果多项式的链表为空表,和只有一个元素,而这个元素的系数为零,则
//直接输出零
if((p.poly.Length()==0) || (p.poly.Length()==1 && iterator().getCoefficient()==0))
{
os<<0;
return os;
}
//否则先输出存储多项式的链表中的第一项
os<<iterator();
++iterator;
while(!iterator)
{
if(iterator().getCoefficient()>0)
os<<"+";//从第二项开始,当该项的系数为正数时要显式输出'+'号
os<<iterator();
++iterator;
}
return os;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -