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

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

//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;
}

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

时间: 2024-07-31 14:59:25

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

oracle表分区、表分析及oracle数据泵文件导入导出开心版

1.先说oracle表分区是什么吧,这样吧我们来举个桃子,栗子太小,我们就不举了,我们来举个桃子. 你有500万份文件,你要把他存在磁盘上,好嘛,我们就一个文件夹,500万分文件在那儿杵着,我们想找到要的那个打开,嘿嘿,我们得找到什么时候. 这时候,有个人告诉你,你把文件按照特定的规律存在不同的文件夹中,这样的话你就会好找很多. 哇,突然你开窍了,你说,对啊,你好牛逼啊,我怎么没想到呢?分开之后我在找的话就会快很多啊,所以你很高兴,也很服他.于是你就开始做了. --这个不同的文件夹就是不同的分区

数据从文件导入Elasticsearch

1.资源准备 1.数据文件:accounts.json 2.索引名称:bank 3.数据类型:account 4.批量操作API:bulk 2.导入数据 curl -XPOST 'localhost:9200/bank/account/_bulk?pretty' --data-binary @accounts.json 3.确认是否导入成功,查看索引,并响应 curl 'localhost:9200/_cat/indices?v' health index pri rep docs.count

MySQL之IDE工具介绍及数据备份(数据库导入,导出)

MySQL之IDE工具介绍及数据备份 一.IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 二.MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境( 如数据文件.控制文件.归档日志文件等).但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数据库,效率相对较低.#3. 导出表:

Java数据存入文件和读取文件

在Java程序开发过程中我们发现并不能够让程序多次运行时获得上一次关闭程序前的运行结果--我们没有将运行的结果加以保存.这个时候我们就要找到Java操作读取数据的方法(以操作文件为例):Java中的输入/输出模型,I/O模型又称为I/O流.(以下简称I/O流). 流按方向可以分为输入(input)和输出(output)2种.输入和输出是相对的,这里我们是站在程序的角度来看的,将程序的数据写到文件就是输出,从文件中读取数据就是输入. 按类型(大小)可以分为字节型(byte)和字符型(byte)2种

Oracle Imp and Exp (导入和导出) 数据 工具使用

Oracle 提供两个工具imp.exe 和exp.exe分别用于导入和导出数据.这两个工具位于Oracle_home/bin目录下. 导入数据exp 1 将数据库ATSTestDB完全导出,用户名system 密码123456 导出到c:\export.dmp中 exp system/[email protected] file=c:\export.dmp full=y 其中ATSTestDB为数据库名称,system为该数据库里的账户,123456为其密码. 2 将数据库中system用户与

.NET从EXCEL文件导入数据

.NET com组件 这种方法在计算机没有安装office套件时,也是能够使用的.所以不依赖于软件, 但是还是需要xcel.exe编译后的dll文件打包到相应的程序中来引用.这样将dll文件" 随身携带",就可以了.还是挺不错的! 1.注册Microsoft.Office.Interop.Excel.dll 在office安装文件夹下找到excel.exe,路径D:\Program Files(x86)\Microsoft Office\Office15.将excel.exe文件复制到

大容量导入和导出数据 -- bcp实用工具

大容量导入和导出数据 -- bcp实用工具 作用 bcp 实用工具可以在SQL Server实例和用户指定格式的数据文件间大容量复制数据. 使用 bcp 实用工具可以将大量新行导入 SQL Server 表,或将表数据导出到数据文件. 除非与 queryout 选项一起使用,否则使用该实用工具不需要了解 Transact-SQL 知识. 若要将数据导入表中,必须使用为该表创建的格式文件,或者必须了解表的结构以及对于该表中的列有效的数据类型. 注意: 如果使用 bcp 备份数据,请创建一个格式化文

Hive中数据的加载和导出

原文:http://blog.javachen.com/2014/06/09/hive-data-manipulation-language.html 关于 Hive DML 语法,你可以参考 apache 官方文档的说明:Hive Data Manipulation Language. apache的hive版本现在应该是 0.13.0,而我使用的 hadoop 版本是 CDH5.0.1,其对应的 hive 版本是 0.12.0.故只能参考apache官方文档来看 cdh5.0.1 实现了哪些

Android数据存储-文件操作

一.预备知识 1.Android中的MVC设计模式 MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器.一个逻辑模型可以对于多种视图模型,比如一批统计数据你可以分别用柱状图.饼图来表示.一种视图模型也可以对于多种逻辑模型.使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,而C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,这与<设计模式>中的观察者模式是完全一样. MVC好处:从用户的角度出发,用户可