2019-07-08:一元多项式的加减计算(C++)

本文介绍了一元多项式的加减计算,详细阐述了问题描述、实验分析和C++代码实现,包括多项式的初始化、输出、创建、复制、加法、减法等操作,并提供了代码架构和实验结果分析。
摘要由CSDN通过智能技术生成


前言

一元多项式的加减计算(本文链接

一元多项式的乘法计算(原文链接

提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

  1. 能够按照指数升序排列建立并输出多项式;
  2. 能够完成两个多项式的相加并将结果输入;

二、实验分析

  1. 实验的第一步应该建立所需的数据类型
typedef struct
{
    double coef ;      //系数
    int expn ;        //指数
}num;
typedef struct PNode
{
    num data;
    struct PNode *next;
}Pnode , *Polyn ;
  1. 第二步是一元多项式的具体操作实现
    1)void Initpolyn( Polyn &Po ) //初始化一个空的一元多项式链表
    2)void Printpolyn( Polyn Po ) //输出一元多项式链表
    3)void Createpolyn( Polyn &Po ) // 创建一元多项式链表;
    4)void Copypolyn( Polyn &Po, Polyn Poa ) //复制Poa一元多项式到Po,Po用于保存Poa中的元素,用于保证后面的Poa还是原本的Poa;
    5)Polyn Addpolyn( Polyn Poa , Polyn Pob ) //加法 Poa=Poa+Pob
    6)void Subpolyn( Polyn Poa , Polyn Pob ) //减法 Poa=Poa-Pob,先是将Pob中的元素置负,然后应用Polyn Addpolyn( Polyn Poa , Polyn Pob )函数来计算Poa=Poa+(-Pob);
    7)void Maxexpn( Polyn Po ,int &n ) //一元多项式的次数(最高阶)

3、 第二步应该构思程序主界面。

	1)	主界面:
	******************一元多项式计算的操作**************
	一元多项式a与b的加减运算 :1    求一元多项式a的次数 : 2 
	****************************************************
	
	
	2)	子界面:
	******************************************
	加法 a+b : 1        减法 a-b : 2      
	******************************************

三、C++代码架构

完整代码链接

#include<iostream>
//#include"danlianbiao.cpp"
#include<stdlib.h>
using namespace std;

typedef struct
{
    double coef ;      //系数
    int expn ;        //指数
}num;
typedef struct PNode
{
    num data;
    struct PNode *next;
}Pnode , *Polyn ;

void Initpolyn(  Polyn &Po  )    //初始化
{
    Po=new Pnode;
    Po->next=NULL;
}

void Printpolyn(  Polyn Po )     //输出
{

	//代码空缺

}

void Createpolyn(  Polyn &Po  )    // 创建一元多项式链表;
{
    int i , s , n ;
    Polyn p, r,rre;
    cin>>n;
    while(  n<1 )
    {
        cout<<"输入数据太小了,再来:";
        cin>>n;
    }  //while
    cout<<"输入"<<n<<"对一元多项式的系数double coef和指数int expn:";
    for( i=0 ; i<n ;i++ )
    {
        p=new Pnode;
        cin>>p->data.coef;
        cin>>p->data.expn;
        //cout<<"0   "<<p->data.coef<<p->data.expn<<endl;

        if(  p->data.coef != 0 )
        {
            //cout<<"01   "<<p->data.coef<<p->data.expn<<endl;
            rre=Po;
            r=rre->next;
            while(  r  &&  ( r->data.expn  <  p->data.expn ))     //按指数由小到大排序
            {
                rre=r;
                r=r->next;
            } //while(  r  &&  ( r->data.expn  <  p->data.expn ))

            if(  r && r->data.expn  ==  p->data.expn   )
            {
                s = r->data.coef + p->data.coef;
                //cout<<"1   "<<r->data.coef<<endl;
                if( s != 0 )
                {
                    r->data.coef=s;
                }
                else{   //coef为0,则删除r
                    rre->next=r->next;
                    delete r;
                    r=rre->next;
                }

                delete p;   //系数coef被合并,没有用到p,所以delete
            } //if(  r && r->data.expn  ==  p->data.expn   )
            else
            {
                p->next=rre->next;
                rre->next=p;
                //cout<<"2    "<<r->data.coef<<endl;
            }
                //cout<<"3    "<<r->data.coef<<endl;
        } //if(  p->data.coef != 0 )
        else
            delete p;
    }   //for( i=0 ; i<n ;i++ )
}

void Copypolyn( Polyn &Po, Polyn Poa )    //复制Poa一元多项式到Po
{
    Polyn p , pa , r ;
    Initpolyn(  Po  );
    p=Po;
    pa=Poa->next;
    while( pa )
    {
        r=new Pnode;
        r->data.coef=pa->data.coef;
        r->data.expn=pa->data.expn;
        p->next=r;
        p=r;
        pa=pa->next;
    }
    p->next=NULL;
}

void Addpolyn( Polyn &Poa ,  Polyn Pob )    //加法 Poa=Poa+Pob
{
    Polyn pa , pb, p1 ,r ;
    double s;
    p1=Poa;
    pa=p1->next;
    pb=Pob->next;
    while( pa && pb )
    {
        if( pa->data.expn == pb->data.expn )
        {
            s=pa->data.coef + pb->data.coef;
            if( s != 0 )
            {
                pa->data.coef=s;
                p1->next=pa;
                p1=pa;
                pa=pa->next;
                pb=pb->next;
            }  //if1
            else
            {
                pa=pa->next;
                pb=pb->next;
            }
        }  //if0
        else
            if( pa->data.expn > pb->data.expn )
            {
                p1->next=pb;
                p1=pb;
                pb=pb->next;
            }//if2
            else
            {
                p1->next=pa;
                p1=pa;
                pa=pa->next;
            }

    }  //while
    p1->next= pa ? pa:pb;
}

void Subpolyn( Polyn Poa ,  Polyn Pob  )   //减法  Poa=Poa-Pob
{
    Polyn pb;
    pb=Pob->next;
    while(  pb  )
    {
        pb->data.coef *= -1;
        //cout<<pb->data.coef<<endl;
        pb=pb->next;
    }
    //Printpolyn( Pob );
    Addpolyn(  Poa ,  Pob );
    cout<<"输出一元多项式 a-b 的结果为: ";
    Printpolyn( Poa );
}

void Maxexpn( Polyn Po ,int &n )  //一元多项式的次数(最高阶)
{
    Polyn p;
    p=Po->next;
    n=p->data.expn;
    while( p->next )
    {
        p=p->next;
        if( p->data.expn >  n )
        n=p->data.expn;
    }
}

/*
功能:
1.多项式的初始化和创建;
2.多项式的运算功能:+,-
3.一元多项式的查找,插入,删除;
*/


main( )
{
    int i=2,n , ma , m;
    Polyn Poa,Pob,Po;
    cout<<"*****************************一元多项式计算的操作*******************************"<<endl;
    cout<<"       一元多项式a与b的加减运算 :1              求一元多项式a的次数 : 2 "<<endl;
    cout<<"********************************************************************************"<<endl;
    cout<<"输入你中意的操作代号n= ";
    cin>>n;
    while( n<1 || n>2 )
    {
        cout<<"错了,错了,再来输一遍,n=";
        cin>>n;
    }
    cout<<endl;
    Initpolyn(  Poa  );
    Initpolyn(  Pob  );
    cout<<"输入一元多项式a的项数ma:  ";
    Createpolyn(  Poa  );
    Copypolyn( Po, Poa );
    cout<<"新建立的一元多项式a长这样:a=";
    Printpolyn( Poa );
    //Printpolyn( Po );

    do
    {
        if(  i>4 )
        {
            cout<<"********************************************************************************"<<endl;
            cout<<"       一元多项式a与b的加减运算 :1              求一元多项式a的次数 : 2"<<endl;
            cout<<"********************************************************************************"<<endl;
            cout<<"输入你中意的操作代号n= ";
            cin>>n;
            while( n<1 || n>2 )
            {
                cout<<"错了,错了,再来输一遍,n=";
                cin>>n;
            } //while
        }   //if
        if( !Pob->next  &&  n==1  )
        {
            cout<<"输入一元多项式b的项数mb:  ";
            Createpolyn(  Pob );    //1.多项式的初始化和创建;
            cout<<"新建立的一元多项式b长这样:b=";
            Printpolyn( Pob );
        }
        switch( n )
        {
            case 1:
                cout<<"**********************************************"<<endl;
                cout<<"    加法 a+b : 1        减法 a-b : 2      "<<endl;
                cout<<"**********************************************"<<endl;
                cout<<"再输入你中意的操作代号m= ";
                cin>>m;
                while( m<1 || m>2 )
                    {
                        cout<<"错了,错了,再来输一遍,m=";
                        cin>>m;
                    }
                if( m==1 )
                {
                        cout<<"**********************加法 a+b **********************"<<endl;
                        Copypolyn( Poa, Po );
                        //cout<<"新建立的一元多项式a长这样:a=";
                        //Printpolyn( Poa );
                        //cout<<"新建立的一元多项式b长这样:b=";
                        //Printpolyn( Pob );
                        Addpolyn( Poa ,  Pob );
                        cout<<"输出一元多项式 a+b 的结果为:a+b=";
                        Printpolyn( Poa  );
                }  //if
                else
                {
                        cout<<"**********************减法 a-b **********************"<<endl;
                        Copypolyn( Poa, Po );
                        //cout<<"新建立的一元多项式a长这样:a=";
                        //Printpolyn( Poa );
                        //cout<<"新建立的一元多项式b长这样:b=";
                        //Printpolyn( Pob );
                        Subpolyn( Poa ,  Pob  );
                }  //else
                break;

            case 2:
                    cout<<"********************求一元多项式a的次数****************"<<endl;
                    Copypolyn( Poa, Po );
                    Maxexpn(  Poa , ma );
                    cout<<"一元多项式的次数(最高阶)为: "<<ma<<endl<<endl;
                     break;
        } //switch0

        cout<<"如果你还想进行其他操作,就输入一个大于4的数值给i,否则输入一个小于4的数值给i来结束操作吧!!  i= ";
        cin>>i;
        cout<<endl<<endl;
    }while( i>4 );  //do
    cout<<"你可终于操作完了,拜拜!!!"<<endl<<endl;
}

五、结果及分析

结果如下:

在这里插入图片描述

结果分析

  • 一元多项式计算是我第一个做的课程实验设计,想的比较多,运行到现在暂时未发现错误,有错误也会有相应的正当反应。
符号多项式的操作,已经成为表处理的典型用例。在数学上,一个一元多项式Pn(x)可按升幂写 成: Pn(x) = p0+ p1x+ p2x2+….+ pnxn 它由n+1个系数唯一确定,因此,在计算机里,它可用一个线 性表P来表示: P = (p0 ,p1 ,p2 ,… pn)每一项的指数i隐含在其系数pi的序号里。 假设Qm(x)是一元m次多项式,同样可用线性表Q来表示:Q = (q0 ,q1 ,q2 ,… qm)。 不失一般性,设m<n,则两个多项式相加的结果 Rn(x) = Pn(x)+Qm(x)可用线性表R表示:R = (p0+q0 , p1+q1 , p2 +q2 , … , pm +qm , pm+1 ,… pn)。显然,我们可以对P、Q和R采用顺序存储结构, 使得多项式相加的算法定义十分简洁。至此,一元多项式的表示及相加问题似乎已经解决了。 然而在通常的应用中,多项式的次数可能很高且变化很大,使得顺序存储结构的最大长度很难 决定。特别是在处理形如:S(x) = 1+3x10000+2x20000的多项式时,就要用一长度为20001的线性表来 表示,表中仅有三个非零元素,这种对内存空间的浪费是应当避免的,但是如果只存储非零系数项 则显然必须同时存储相应的指数。 一般情况下的一元n次多项式可写成: Pn(x) = p1x e1 + p2x e2 + … + pmx em 其中 pi,是指数为 ei 的项的非零系数,且满足 0 ≤ e1 < e2 < …< em = n,若用一个长度为 m 且 每个元素有两个数据项(系数项和指数项)的线性表便可唯一确定多项式 Pn(x)。 ((p1 ,e1) , (p2 ,e2) , … ,(pm,em)) 在最坏情况下,n+1(=m)个系数都不为零,则比只存储每项系数的方案要多存储一倍的数据。但 是,对于 S(x)类的多项式,这种表示将大大节省空间。 本题要求选用线性表的一种合适的存储结构来表示一个一元多项式,并在此结构上实现一元多 项式的加法,减法和乘法操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

门牙磕掉了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值