首页 > 编程语言 > 详细

用C++实现一元多项式的四则运算包括数据的文件导入与导出

时间:2015-08-28 15:38:05      阅读:268      评论:0      收藏:0      [点我收藏+]

对于一元多项式我们都再熟悉不过了,这是使用数据结构的单链表进行实现的,下面贴一下我的实现代码,欢迎批评指导

//test.h
#pragma once
#include<iostream>
#include<fstream>
using namespace std;

class P_Sum
{
public:
 typedef struct P_node
{
	double coef;
	int index;
	P_node* next;
}P_node;

P_Sum():head(BuyNode(-1,-1))
{}
~P_Sum()
{
	clean();
	Freenode(head);
}
void clean()
{
	P_node*p=head->next;
	P_node*q =NULL;
	while(p != NULL)
	{ 
		q=p->next;
		delete p;
		p=q;
	}
	head->next=NULL;
}


void push_front(double coef=0.0, int index=0);
void push_back(double coef=0.0,int inex=0);
void add_Poly_list(const P_Sum &poly1,const P_Sum&poly2);
int Max_index()const;
void Multiply_Poly(const P_Sum &poly1, const P_Sum&poly2);
void Sub_Poly_list(const P_Sum &poly1,const P_Sum&poly2);
void sort();
void Load();
void DownLoad();
void readin();



friend istream& operator>>(istream& in,P_Sum& sum)
{
	int coef=0;
	int index=0;
	P_node*p=sum.head->next;
	while(in>>coef>>index && index != -1)
	{
	    sum.push_back(coef,index);
	}
	return in;
}
friend ostream& operator<<(ostream& out,P_Sum& sum)
{
	 P_node* p=sum.head->next;
	if(p == NULL)
	{
		out<<"not exist\n";
		return out;
	}
	while(p != NULL)
	{
		if(p->index == 0)
		{
			out<<p->coef;
		}
		else if(p->coef == 1)
		{
			out<<"X^"<<p->index;
		}
		else
		{  
			out<<p->coef<<"X^"<<p->index;
		}
		p = p->next;
		if(p!=NULL && p->coef>0)
		{
			out<<"+";
		}	
		
	}
	out<<"\n";
	return out;
}


protected:
	P_node* BuyNode(double coef=0.0, int index=0)
	{
		P_node* p = new P_node;
		p->coef = coef != 0.0 ? coef : 0.0;
		p->index = coef != 0 ? index : 0;
		p->next =NULL;
		return p;
	}
	void Freenode(P_node *p)
	{
		delete p;
		p = NULL;
	}
	void insert(P_node*&ptr)
	{
		P_node*p = head;
		while (p->next != NULL && p->next->index > ptr->index)
		{
			p = p->next;
		}
		ptr->next=p->next;
		p->next = ptr;
		return;
	}
private:
 
P_node*head;
};

#include"test.h"
void P_Sum::push_front(double coef, int index)
	{
		P_node*p = BuyNode(coef, index);
		p->next = head->next;
		head->next = p;
	}
void P_Sum::push_back(double coef,int index)
{
	P_node*s=BuyNode(coef,index);
	P_node *p = head;
	while(p->next != NULL)
		p = p->next;
	p->next = s;
	s->next = NULL;
}
int P_Sum::Max_index()const
	{
		P_node *p = head->next;
		int tmp = p->index;
		P_node* q = p->next;
		while (q != NULL)
		{
			tmp = tmp > q->index ? tmp : q->index;
			q = q->next;
		}
		return tmp != 0 ? tmp : -1;
	}
void P_Sum::add_Poly_list(const P_Sum &poly1,const P_Sum&poly2)
	{
		P_node* p = poly1.head->next;
		P_node* q = poly2.head->next;
		P_node* ptmp = NULL;
		while (p != NULL && q != NULL)
		{
			if (p->index == q->index)
			{
				double  tmp = p->coef + q->coef;
				push_back(tmp, p->index);
				p = p->next;
				q = q->next;
				if(tmp <1e6)
			 {
				continue;
			 }
			}
			else if (p->index <q->index)
			{
				push_back(q->coef, q->index);
				q = q->next;
			}
			else
			{
				push_back(p->coef, p->index);
				p = p->next;
			}
		}
		if (p != NULL)
			ptmp = q;
		else
			ptmp = p;
		while (ptmp!= NULL)
		{
			push_back(ptmp->coef, ptmp->index);
			ptmp = ptmp->next;
		}
	}
void P_Sum::Sub_Poly_list(const P_Sum &poly1,const P_Sum&poly2)
	{
		P_node* p = poly1.head->next;
		P_node* q = poly2.head->next;
		if(q == NULL || p == NULL)
		{
		cout<<"poly1 or poly2 is empty\n";
		return ;
		}
		P_node* ptmp = NULL;
		while (p != NULL && q != NULL)
		{
			if (p->index == q->index)
			{
				double  tmp = p->coef - q->coef;
				push_back(tmp, p->index);
				p = p->next;
				q = q->next;
				if(tmp <1e6)
			 {
				continue;
			 }
			}
			else if (p->index >q->index)
			{
				push_back(p->coef, p->index);
				p = p->next;
			}
			else
			{
				push_back(-(q->coef), q->index);
				q = q->next;
			}
		}
		while (p!= NULL)
		{
			push_back(ptmp->coef, ptmp->index);
			p= p->next;
		}
		while(q!=NULL)
		{
			push_back(-(q->coef), q->index);
			q= q->next;
		}
	}
 
void P_Sum::Multiply_Poly(const P_Sum &poly1, const P_Sum&poly2)
	{
		P_node*p = poly1.head->next;
		P_node*q = poly2.head->next;
		int a = poly1.Max_index();
		int b = poly2.Max_index();
		int tmp = 0;
		if (a != -1 && b != -1)
		{
			tmp = a + b + 1;
		}
		double* dp = new double[tmp];

		for (int i = 0; i< tmp; ++i)
		{
			dp[i] = 0.0;
		}
		while (p != NULL)
		{
			while (p != NULL)
			{
				int k = p->index + q->index;
				dp[k] += p->coef * q->coef;
				p = p->next;
			}
			q = q->next;
		}
		for (int i = 0; i <= a+b; ++i)
		{
			if (dp[i] != 0)
			push_front(dp[i], i);
		}
		delete[]dp;
	}



void P_Sum::sort()
	{
		P_node *p = head->next;
		P_node *q = p->next;
		p->next = NULL;
		P_node *h = NULL;

		while (q != NULL)
		{
			h = q->next;
			insert(q);
			q = h;
		}
	}

void P_Sum::Load()
{
	cout<<"请输入要存入的文件名称: ";
	char filename[100]={0};
	cin>>filename;
ofstream outfile(filename,ios::out);//定义文件流对象,打开磁盘文件"f1.dat"
   if(!outfile)                        //如果打开失败,outfile返回值
   {
      cerr<<"open error!"<<endl;
      exit(1);
   }
	cout<<"输入项数: ";
	int n;
	cin>>n;
	double*a=new double[n];
	int*b=new int[n];
   for(int i=0;i<n;i++)
   {
	   cout<<"请输入第"<<i+1<<"组数据: ";
        cin>>a[i]>>b[i];
		push_back(a[i],b[i]);
        outfile<<a[i]<<" "<<b[i]<<" ";
   }            //向磁盘文件"f1.dat"输出数据
   outfile.close();
}

void P_Sum::DownLoad()
{
	cout<<"请输入要存入的文件名称: ";
	char filename[100]={0};
	cin>>filename;
	ofstream outfile(filename,ios::out);//定义文件流对象,打开磁盘文件"f1.dat"
   if(!outfile)                        //如果打开失败,outfile返回值
   {
      cerr<<"open error!"<<endl;
      exit(1);
   }
    P_node* p=head->next;
	if(p == NULL)
	{
		outfile<<"not exist\n";
		return ;
	}
	while(p != NULL)
	{
		if(p->index == 0)
		{
			outfile<<p->coef;
		}
		else if(p->coef == 1)
		{
			outfile<<"X^"<<p->index;
		}
		else
		{  
			outfile<<p->coef<<"X^"<<p->index;
		}
		p = p->next;
		if(p!=NULL && p->coef>0)
		{
			outfile<<"+";
		}	
		
	}
	outfile<<"\n";
}
void P_Sum:: readin()
{
	cout<<"请输入要导入的文件名称: ";
	char filename[100]={0};
	cin>>filename;
              //定义输入文件流对象,以输入方式打开磁盘文件f1.dat
   ifstream infile(filename,ios::in);
   if(!infile)
   {
      cerr<<"open error!"<<endl;
      exit(1);
   }
   char c;
   int n;
   infile>>n>>c;
   double*a=new double[n];
   int *b = new int[n];
   for(int i=0;i<n;i++)
   {
      infile>>a[i]>>b[i];  //从磁盘文件读入10个整数,顺序存放在a数组中
      push_back(a[i],b[i]); //在显示器上顺序显示10个数
   }         
   infile.close();

}

#include "test.h"


int main()
{
	P_Sum pa;
	P_Sum pb;
	P_Sum pc;
	int select = 1;
	while(select)
	{
		printf("*******************************************\n");
		printf("* [1] 创建多项式pa [2] 创建多项式pb       *\n");
		printf("* [3] 显示多项式pa [4] 显示多项式pb       *\n");
		printf("* [5] 多项式相加   [6] 多项式相减         *\n");
		printf("* [7] 多项式相乘   [8] pa存入文件         *\n");
		printf("* [9] pb存入文件   [10] 操作的结果存入文件*\n");
		printf("* [11] 文件导入pa  [12] 文件导入pb        *\n");
		printf("* [13] 清空多项式pa[14] 清空多项式pb      *\n");
		printf("* [15] 排序pa      [16]  排序pa           *\n");        
		printf("* [0] 退出                                *\n");
		printf("*******************************************\n");
		printf("请选择:>");
		scanf("%d",&select);

		if(select == 0)
			break;

		switch(select)
		{
		case 1:
			cout<<"请输入系数和指数(-1 -1 表示结束)\n";
			cin>>pa;
			break;
		case 2:
			cout<<"请输入系数和指数(-1 -1 表示结束)\n";
			cin>>pb;
			break;
		case 3:
			cout<<pa;
			break;
		case 4:
			cout<<pb;
			break;
		case 5:
			pc.add_Poly_list(pa,pb);
			pc.sort();
			cout<<pc;
			//pc.clean();
			break;
		case 6:
			pc.Sub_Poly_list(pa,pb);
			pc.sort();
			cout<<pc;
			//pc.clean();
			break;
		case 7:
			pc.Multiply_Poly(pa,pb);
			cout<<pc;
			//pc.clean();
			break;
		case 8:
			pa.Load();
			break;
		case 9:
			pb.Load();
			break;
		case 10:
			cout<<pc;
			pc.DownLoad();
			break;
		case 11:
			pa.readin();
			break;
		case 12:
			pb.readin();
			break;
		case 13:
			pa.clean();
			break;
		case 14:
			pb.clean();
			break;
		case 15:
			pa.sort();
			break;
		case 16:
			pb.sort();
			break;
		default:
			break;
		}
	}

	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

用C++实现一元多项式的四则运算包括数据的文件导入与导出

原文:http://blog.csdn.net/kai8wei/article/details/48052225

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!