将多项式的系数cof,项deg,放进node,然后将node放进map里

1.map用法
2.跟使用list方式不一样的地方:
map<int,double> maptest

迭代器定义:map<int,double> :: iterator iter = maptest.begin();
除了前面类型 map<int,double> 跟list不一样,定义的其他跟list一样

2.1 取值方式。
iter->first,iter->second,…,iter->n
通过这种方式来取值。

2.2排序
map会根据key的值自动进行排序。所以放进里面的序列不用考虑排序问题。

2.3添加一项的方式:
因为不用考虑排序问题,所以不用像list那样那么复杂的判断。
思路:使用map的find函数,查询添加进来的deg,

iter = m_Polynomial.find(要查找的内容);

在已有map是否存在:

有存在的deg,将他们的cof相加。

cout<<"该次数存在map中,进行系数合并---"<<"\n";
		m_Polynomial[term.deg] = iter->second + term.cof;

没有的话,说明是一个新的deg,进行插入就好。

m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
void CPolynomial::AddOneTerm(Node term)	
{
	map<int, double>::iterator iter =m_Polynomial.begin();

	iter = m_Polynomial.find(term.deg);
	if (iter == m_Polynomial.end())
	{
		m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
		
	}
	else
	{
		cout<<"该次数存在map中,进行系数合并---"<<"\n";
		m_Polynomial[term.deg] = iter->second + term.cof;
	}	

}

Polynomial.h

#include <map>

#include <cmath>
#include <string>
#include <iostream>
#include <fstream>

#include<sstream>


using namespace std;


class CPolynomial 
{
private:
	
	struct Node
	{
	public:
		double cof;
		int deg;
		Node()
		{
			cof = 0.0;
			deg = 0;
		}
	};
	map<int, double> m_Polynomial;
public:
	CPolynomial();
	virtual ~CPolynomial();

	CPolynomial(string file); // initialization using file
	CPolynomial(const CPolynomial &other);




	void cutcofzero();

	void Print();

	// overload
	CPolynomial operator+(const CPolynomial &right ) const;  //Overload operator +
	CPolynomial operator-(const CPolynomial &right ) const;  //Overload operator -
	CPolynomial operator*(const CPolynomial &right ) const; //Overload operator *

	CPolynomial& operator=(const CPolynomial &right );      //Overload operator =

	
private:
	void ReadFromFile(string file); 
	void AddOneTerm(Node term); // add one term into m_Polynomial	
};
#include "Polynomial.h"




CPolynomial::CPolynomial(void)
{
}

CPolynomial::~CPolynomial(void)
{
}

CPolynomial::CPolynomial(string file)
{
	ReadFromFile(file);
}



void CPolynomial::Print()
{/*
	map<int, double>::iterator iter;
	for (iter = m_Polynomial.begin(); iter != m_Polynomial.end(); iter++)
	{
		cout<<"deg= "<<iter->first<<" "<<"cof= "<<iter->second<<"\n";
	}*/



	map<int, double>::iterator iter;
	cout<<"f(x)= ";
	for (iter = m_Polynomial.begin(); iter != m_Polynomial.end(); iter++)
	{
		char sign =NULL;
		double tempcof = 0;
		if (iter->first < 0)
		{
			sign = '-';
			tempcof = fabs(iter->second);
		}
		else
		{
			tempcof = iter->first;
			sign = '+';
		}
	
		cout<<sign<<tempcof<<"x^"<<iter->second;			
	}

	cout<<"\n";

}

void CPolynomial::ReadFromFile(string file)
{	
	ifstream in_file; //read from file
	in_file.open(file);

	string oneLine;
	char c;
	int number=0;

	while (getline(in_file, oneLine))
	{
		istringstream readfromstr(oneLine); //readfromstr may  be known as a temp str 
		Node node;
		if (number==0)
		{	
			readfromstr >> c >> number; //put data to c,number			
			if (0 == number || c != 'P')
			{
				cout << "invalid data!" <<endl;
				return;
			}		
		}		
		else
		{
			readfromstr >> node.deg >> node.cof;
			AddOneTerm(node);			
			number--;
		}

	}
	in_file.close();
}

void CPolynomial::AddOneTerm(Node term)	
{
	map<int, double>::iterator iter =m_Polynomial.begin();

	iter = m_Polynomial.find(term.deg);
	if (iter == m_Polynomial.end())
	{
		m_Polynomial.insert(pair<int, double>(term.deg, term.cof));
		
	}
	else
	{
		cout<<"该次数存在map中,进行系数合并---"<<"\n";
		m_Polynomial[term.deg] = iter->second + term.cof;
	}	

}


CPolynomial::CPolynomial(const CPolynomial &other)
{
	Node temp;
	map<int, double>::const_iterator itr = other.m_Polynomial.begin();
	
	for(; itr != other.m_Polynomial.end(); itr++)
	{
		temp.cof = itr->second;
		temp.deg = itr->first;
		AddOneTerm(temp);		
	}
}

CPolynomial& CPolynomial::operator=(const CPolynomial &right )
{
	Node temp;
	map<int, double>::const_iterator itr = right.m_Polynomial.begin ();
	for(;itr != right.m_Polynomial.end(); itr++)
	{
		temp.cof = itr->second;
		temp.deg = itr->first;
		AddOneTerm (temp);
	}
	return *this;
}


void CPolynomial::cutcofzero()
{
	map<int, double>::iterator iter = m_Polynomial.begin();
	for (;iter != m_Polynomial.end(); iter++)
	{
		if (fabs(iter->second) < 1.0e-10)  //if cof=0,remove this term
		{
			iter = m_Polynomial.erase(iter);
		}
	}
}


CPolynomial CPolynomial:: operator+(const CPolynomial& right ) const
{
	CPolynomial tempResult = right;
	Node tempnode;
	map<int, double>:: const_iterator iter =  m_Polynomial.begin ();
	//m_Polynomial is const,so use const_iterator
	for (; iter != m_Polynomial.end(); iter++)
	{
		tempnode.deg = iter->first;
		tempnode.cof = iter->second;
		tempResult.AddOneTerm(tempnode);
	}
	tempResult.cutcofzero();
	return tempResult;
}

CPolynomial CPolynomial:: operator-(const CPolynomial& right) const
{
	CPolynomial tempResult;
	Node temp1,temp2;
	map<int, double>::const_iterator iter_left = m_Polynomial.begin();
	map<int, double>::const_iterator iter_right = right.m_Polynomial.begin();
	for (;iter_right != right.m_Polynomial.end();iter_right++)
	{
		temp1.cof = -(iter_right->second);
		temp1.deg = iter_right->first;
		tempResult.AddOneTerm(temp1);
	}

	for (;iter_left != m_Polynomial.end();iter_left++)
	{
		temp2.cof = iter_left->second;
		temp2.deg = iter_left->first;
		tempResult.AddOneTerm(temp2);
	}
	tempResult.cutcofzero();
	return tempResult;
}


CPolynomial CPolynomial:: operator*(const CPolynomial& right) const
{
	CPolynomial tempResult;
	Node temp1;
	map<int, double>::const_iterator iter_right = right.m_Polynomial.begin();
	map<int, double>::const_iterator iter_left = m_Polynomial.begin ();
	for (; iter_left != m_Polynomial.end(); iter_left++)
	{
		for (; iter_right != right.m_Polynomial.end(); iter_right++)
		{
			temp1.cof = iter_left->second * iter_right->second;
			temp1.deg = iter_left->first + iter_right->first;
			tempResult.AddOneTerm(temp1);
		}
		iter_right = right.m_Polynomial.begin();
	}
	tempResult.cutcofzero();
	return tempResult;
}

main.h

#include "Polynomial.h"


int main()
{
	//read file
	CPolynomial p1("P1.txt");
	CPolynomial p2("P2.txt");

	cout<<"P1:"<<"\n";
	p1.Print();
	cout<<"\n";

	cout<<"P2:"<<"\n";
	p2.Print();
	cout<<"\n";


#if 0
	//overload =
	CPolynomial p3;
	p3=p1;
	p3.Print();
	cout<<"\n";

	// copy Cploynomial
	CPolynomial p4=p3;
	p4.Print();
	cout<<"\n";


	// overload +
	CPolynomial p5;
	p5 = p1 + p2;
	cout<<"p1+p2:"<<"\n";
	p5.Print();
	cout<<"\n";



	// overload -
	CPolynomial p6;
	p6 = p1 - p2;
	cout<<"p1-p2:"<<"\n";
	p6.Print();
	cout<<"\n";
#endif

	// overload *
	CPolynomial p7;
	p7 = p1 * p2;
	cout<<"p1*p2:"<<"\n";
	p7.Print();



	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jasscical

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值