设计要求:
具备一元多项式加、减、乘的运算功能。(多项式系数的输入和输出均按次数从高到低排列形式安排系数。,最右面的为零次项系数,从右向左依次增加。
例如:多项式加法
输入: 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;
}