多项式运算C++版

设计要求:

具备一元多项式加、减、乘的运算功能。(多项式系数的输入和输出均按次数从高到低排列形式安排系数。,最右面的为零次项系数,从右向左依次增加。

例如:多项式加法 

输入: 2  -5  0  7  (表示多项式 2x3-5x2+7)

3  1  -8      (表示多项式 3x2+x-8)

输出 2  -2  1   -1 

(2x3-5x2+7)+( 3x2+x-8)= 2x3-2x2+x-1

输入的数据项数是不定长的。

#include<iostream>
using namespace std;

//程序提示
class Tips
{
public:
	void SoftwareInfo()//软件名与制作者
	{
		cout<<"多项式运算-WhiteDouglas制作"<<endl<<endl<<endl;
		cout<<"==============================开始使用吧!=============================="<<endl<<endl;
	}
	void Choose()//选择功能
	{
		cout<<"请选择您需要的功能,输入数字编号并以回车结束:"<<endl<<endl;
		cout<<"1.多项式加法"<<endl<<"2.多项式减法"<<endl<<"3.多项式乘法"<<endl<<"4.输入其它字符退出程序"<<endl<<endl; 
	}
	void Input()//显示输入规范
	{
		cout<<"请输入一组多项式系数,以空格分隔,并以任意英文字符加回车结束"<<endl;
		cout<<"例如:输入2 4 6 8 10 e然后回车"<<endl;
	}
	void Again()//显示再来一次
	{
		cout<<"==============================再来一次吧!=============================="<<endl<<endl;
	}
};

//多项式运算加法
class Add
{
public:
	int arrA[100];//第一组多项式系数
	int arrB[100];//第二组多项式系数
	int arrResult[100];//用于存储运算结果的一个数组
	int arrAcount,arrBcount;//分别检测第一组和第二组多项式系数的下标
	void AddFunction()//定义一个加法功能的方法
	{
		arrAcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		arrBcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		int num;//声明要输入的数字变量
		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrAcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrA[arrAcount]=num;//将输入的数值赋值给对应下标的数组
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		cout<<"请再输入一组多项式系数"<<endl;//输出提示
		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrBcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrB[arrBcount]=num;//将输入的数值赋值给对应下标的数组
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		for(int i=0,j=arrAcount;i<=arrAcount;++i,--j)//通过for循环将第一组数组数据顺序颠倒,次幂小的排在前面方便后续做合并同类项
		{
			if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
			{
				int temp;//声明一个临时变量
				temp=arrA[i];
				arrA[i]=arrA[j];
				arrA[j]=temp;//交换头尾数据
			}
		}
		for(int i=0,j=arrBcount;i<=arrBcount;++i,--j)//通过for循环将第二组数组数据顺序颠倒,次幂小的排在前面方便后续做合并同类项
		{
			if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
			{
				int temp;//声明一个临时变量
				temp=arrB[i];
				arrB[i]=arrB[j];
				arrB[j]=temp;//交换头尾数据
			}
		}
		if(arrAcount>arrBcount)//如果数组A,即第一组多项式的项数多于第二组,则执行函数体内的操作
		{
			for(int i=0;i<=arrBcount;++i)//for循环进行合并同类项并赋值给结果数组
			{
				arrResult[i]=arrA[i]+arrB[i];
			}
			for(int i=arrBcount+1;i<=arrAcount;++i)//for循环将剩下的无对应的元素进行赋值给结果数组
			{
				arrResult[i]=arrA[i];
			}
			for(int i=0,j=arrAcount;i<=arrAcount;++i,--j)//将结果数组的顺序再颠倒过来成为最终数据
			{
				if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
				{
					int temp;//声明一个临时变量
					temp=arrResult[i];
					arrResult[i]=arrResult[j];
					arrResult[j]=temp;//交换头尾数据
				}
			}
			cout<<"多项式运算加法的结果:"<<endl;
			for(int i=0;i<=arrAcount;++i)//通过for循环输出结果
			{
				cout<<arrResult[i]<<" ";
			}
			cout<<endl<<endl;
		}
		else
		{
			for(int i=0;i<=arrAcount;++i)//for循环进行合并同类项并赋值给结果数组
			{
				arrResult[i]=arrA[i]+arrB[i];
			}
			for(int i=arrAcount+1;i<=arrBcount;++i)//for循环将剩下的无对应的元素进行赋值给结果数组
			{
				arrResult[i]=arrB[i];
			}
			for(int i=0,j=arrBcount;i<=arrBcount;++i,--j)
			{
				if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
				{
					int temp;//声明一个临时变量
					temp=arrResult[i];
					arrResult[i]=arrResult[j];
					arrResult[j]=temp;//交换头尾数据
				}
			}
			cout<<"多项式运算加法的结果:"<<endl;
			for(int i=0;i<=arrBcount;++i)//通过for循环输出结果
			{
				cout<<arrResult[i]<<" ";
			}
			cout<<endl<<endl;
		}
	}
};

//多项式运算减法
class  Subtraction
{
public:
	int arrA[100];//第一组多项式系数
	int arrB[100];//第二组多项式系数
	int arrResult[100];//用于存储运算结果的一个数组
	int arrAcount,arrBcount;//分别检测第一组和第二组多项式系数的下标
	void SubtractionFunction()//定义一个减法功能的方法
	{
		arrAcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		arrBcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		int num;//声明要输入的数字变量
		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrAcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrA[arrAcount]=num;
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		cout<<"请再输入一组多项式系数"<<endl;//输出提示
		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrBcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrB[arrBcount]=num;//将输入的数值赋值给对应下标的数组
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		for(int i=0,j=arrAcount;i<=arrAcount;++i,--j)//通过for循环将第一组数组数据顺序颠倒,次幂小的排在前面方便后续做合并同类项
		{
			if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
			{
				int temp;//声明一个临时变量
				temp=arrA[i];
				arrA[i]=arrA[j];
				arrA[j]=temp;//交换头尾数据
			}
		}
		for(int i=0,j=arrBcount;i<=arrBcount;++i,--j)//通过for循环将第二组数组数据顺序颠倒,次幂小的排在前面方便后续做合并同类项
		{
			if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
			{
				int temp;//声明一个临时变量
				temp=arrB[i];
				arrB[i]=arrB[j];
				arrB[j]=temp;//交换头尾数据
			}
		}
		if(arrAcount>arrBcount)//如果数组A,即第一组多项式的项数多于第二组,则执行函数体内的操作
		{
			for(int i=0;i<=arrBcount;++i)//for循环进行合并同类项并赋值给结果数组
			{
				arrResult[i]=arrA[i]-arrB[i];
			}
			for(int i=arrBcount+1;i<=arrAcount;++i)//for循环将剩下的无对应的元素进行赋值给结果数组
			{
				arrResult[i]=arrA[i];
			}
			for(int i=0,j=arrAcount;i<=arrAcount;++i,--j)//将结果数组的顺序再颠倒过来成为最终数据
			{
				if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
				{
					int temp;
					temp=arrResult[i];
					arrResult[i]=arrResult[j];
					arrResult[j]=temp;
				}
			}
			cout<<"多项式运算减法的结果:"<<endl;
			for(int i=0;i<=arrAcount;++i)//通过for循环输出结果
			{
				cout<<arrResult[i]<<" ";
			}
			cout<<endl<<endl;
		}
		else
		{
			for(int i=0;i<=arrAcount;++i)//for循环进行合并同类项并赋值给结果数组
			{
				arrResult[i]=arrA[i]-arrB[i];
			}
			for(int i=arrAcount+1;i<=arrBcount;++i)//for循环将剩下的无对应的元素进行赋值给结果数组
			{
				arrResult[i]=-arrB[i];
			}
			for(int i=0,j=arrBcount;i<=arrBcount;++i,--j)//将结果数组的顺序再颠倒过来成为最终数据
			{
				if(i<j)//用于判断是否到达数组的中央,以便结束数据排序操作
				{
					int temp;//声明一个临时变量
					temp=arrResult[i];
					arrResult[i]=arrResult[j];
					arrResult[j]=temp;//交换头尾数据
				}
			}
			cout<<"多项式运算减法的结果:"<<endl;
			for(int i=0;i<=arrBcount;++i)//通过for循环输出结果
			{
				cout<<arrResult[i]<<" ";
			}
			cout<<endl<<endl;
		}
	}
};

//多项式运算乘法
class Multiplication
{
public:
	int arrA[100][2];//第一组多项式系数以及对应的指数
	int arrB[100][2];//第二组多项式系数以及对应的指数
	int arrResultA[100][2];//用于存储运算结果的一个数组
	int arrResultB[100][2];//用于存储最终运算结果的一个数组
	int arrResulttemp[2][2];//用于临时存储结果
	int arrAcount,arrBcount,arrResultAcount,arrResultBcount;//分别检测第一组和第二组多项式系数的下标,以及结果数组A和B的下标
	void MultiplicationFunction()//定义一个乘法功能的方法
	{
		arrAcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		arrBcount=-1;//定义一个变量,初值为-1,由后面的代码可知,一旦输入一个数字就会变为0并依次增加。可以认为是数组的下标。
		int num;//声明要输入的数字变量
		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrAcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrA[arrAcount][0]=num;//将输入的数值赋值给对应下标的数组
			arrA[arrAcount][1]=arrAcount;//将下标,也可以理解为指数值赋给相对应的数组行元素
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		cout<<"请再输入一组多项式系数"<<endl;//输出提示

		while(cin>>num)//当输入数字的时候则执行函数体内的代码,否则跳出循环
		{
			++arrBcount;//输入第一个数即可变为0,并依次递增,用作多项式系数的下标
			arrB[arrBcount][0]=num;//将输入的数值赋值给对应下标的数组
			arrB[arrBcount][1]=arrBcount;//将下标,也可以理解为指数值赋给相对应的数组行元素
		}
		cin.clear();//清除错误状态 
		cin.ignore();//跳过无效数据
		for(int i=0,j=arrAcount;i<j;++i,--j)//通过for循环将第一组二维数组第一列数据顺序颠倒,使系数和指数值相匹配
		{
			int temp;//声明一个临时变量
			temp=arrA[i][0];
			arrA[i][0]=arrA[j][0];
			arrA[j][0]=temp;//交换头尾数据
		}
		for(int i=0,j=arrBcount;i<j;++i,--j)//通过for循环将第二组二维数组第一列数据顺序颠倒,使系数和指数值相匹配
		{
			int temp;//声明一个临时变量
			temp=arrB[i][0];
			arrB[i][0]=arrB[j][0];
			arrB[j][0]=temp;//交换头尾数据
		}
		arrResultAcount=-1;
		for(int i=0;i<=arrAcount;++i)//通过for循环将多项式一一相乘后未合并的项直接赋给数组arrResultA
		{
			for(int j=0;j<=arrBcount;++j)//arrResultAcount是数组arrResult的下标值
			{
				++arrResultAcount;
				arrResultA[arrResultAcount][0]=arrA[i][0]*arrB[j][0];//两组多项式系数分别相加赋值给数组arrResultA
				arrResultA[arrResultAcount][1]=arrA[i][1]+arrB[j][1];//两组多项式系数对应的指数值分别相加赋值给数组arrResultA
			}
		}
		arrResultBcount=0;//设定arrResult数组的初始下标值
		arrResultB[0][0]=0;
		arrResultB[0][1]=0;//赋一个初值
		int index=1;//用于定义状态,检测是否需要在arrResultB数组中另外开辟一个元素行
		for(int i=0;i<=arrResultAcount;++i)//通过for循环,把arrResultA数组中的值遍历到arrResultB中,并且检测指数是否相同,相同则系数相加,不同则在arrResultB结果数组中多添加一个元素行
		{
			for(int j=0;j<=arrResultBcount;++j)//通过for循环遍历arrResultA,并将其指数相同的系数加至arrResultB
			{
				if(arrResultA[i][1]==arrResultB[j][1])//如果当指数相同
				{
					arrResultB[j][0]=arrResultA[i][0]+arrResultB[j][0];//将系数相加并赋值
					index=0;//将状态改为0,表示不用再另外开辟一个元素行了
				}
				if(index==0)
				{
					break;//一旦检测到该元素行已被合并,则没有必要继续循环,直接跳出循环即可
				}
			}
			if(index==1)//若未被合并
			{
				++arrResultBcount;//将下标后移一位
				arrResultB[arrResultBcount][0]=arrResultA[i][0];//赋值
				arrResultB[arrResultBcount][1]=arrResultA[i][1];//赋值
			}
			index=1;//将状态改为初始值1
		}
		for(int i=0;i<=arrResultBcount-1;++i)//控制进行循环的次数
		{
			for(int j=0;j<=arrResultBcount;++j)//控制进行比较的次数
			{
				if(arrResultB[j][1]<arrResultB[j+1][1])//将指数小的元素后移
				{
					arrResulttemp[0][0]=arrResultB[j][0];
					arrResultB[j][0]=arrResultB[j+1][0];
					arrResultB[j+1][0]=arrResulttemp[0][0];//对项系数进行冒泡排序
					arrResulttemp[0][1]=arrResultB[j][1];
					arrResultB[j][1]=arrResultB[j+1][1];
					arrResultB[j+1][1]=arrResulttemp[0][1];//对项系数对应的指数进行冒泡排序
				}
			}
		}
		cout<<"多项式运算乘法的结果:"<<endl;
		for(int i=0;i<=arrResultBcount;++i)//输出结果数组arrResultB
		{
			cout<<arrResultB[i][0]<<"  ";
		}
		cout<<endl<<endl;
	}
};

int main()
{
	Tips tips;//声明一个提示Tips类的对象tips
	tips.SoftwareInfo();//调用tips对象的SoftwareInfo方法
	tips.Choose();//调用tips对象的Choose方法
	int choose;//声明一个choose变量,用于检测用户需要哪一种功能
	while(cin>>choose)//当用户输入时
	{
		if(choose==1)//如果输入值为1
		{
			tips.Input();//调用tips对象的Input方法
			Add add;//声明一个加法Add类的对象add
			add.AddFunction();//调用add对象的AddFunction方法
		}
		else if(choose==2)//如果输入值为2
		{
			tips.Input();//调用tips对象的Input方法
			Subtraction substraction;//声明一个减法Substraction类的对象substraction
			substraction.SubtractionFunction();//调用substraction对象的SubstractionFunction方法
		}
		else if(choose==3)//如果输入值为3
		{
			tips.Input();//调用tips对象的Input方法
			Multiplication multiplication;//声明一个乘法Multiplication类的对象multiplication
			multiplication.MultiplicationFunction();//调用multiplication对象的MultiplicationFunction方法
		}
		else
		{
			break;
		}
		tips.Again();//调用tips对象的Again方法
		tips.Choose();//调用tips对象的Choose方法
	}
	return 0;
}


  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值