⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 polynomial.cpp

📁 实现多项式表达式的运算器利用栈实现表达式计算器的模板类;用表达式计算器类和多项式类实现多项式表达式的计算器
💻 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 + -