数据结构-一元多项式加减程序

来源:互联网 发布:js倒计时3秒 编辑:程序博客网 时间:2024/04/30 00:43

//一元多项式加减程序
//程序:张建波
//时间:2005/7/12 PM:20-08

//功能:
//     1:可以计算 1+2+3-1+2-5+6+3 (加减法均可)
//     2: 可以计算 2x+3x+5x-x^2+x^3+4x^7+9
//     3: 可以进行组合计算 A=1+2+x+x^2  B=x+x^2  A+B=3+2x+2x^2
//注意:除指数不能为 负!!其余都可以输入负数

#include <iostream.h>
#include <string.h>
#include <math.h>
#include "Menu.h"
#include "Key.h"

typedef struct Polyn //项的结构
{
    int e;     //指数
    int c;  //系数
}PolynElem;

///函数申明
char *MidStr(char *p,int F1,int F2);             //取字符串
int sVal(char *s);                               //字符串,转整形变量
int fx(char *f,PolynElem *Arg);                  //从表达式中 分离项
void SpPolyn(char *PolynString,int *c,int *e);   //添加项:分离系数、指数
void PolynElemSub(PolynElem *s,int &nn);         //合并同类项
void AddPolynElem(PolynElem *argA,int &nA,PolynElem *argB,int nB,int isADD);
                                                 //合并A,B表达式,结果存在A中
void OutPutFx(PolynElem *arg,int n);             // 输出表达式
void OrderFx(PolynElem *arg,int n);              //表达式排序

void Test_Fx();  //测试程序

///~

int _f2_main(){


    Menu m[3];
    m[1].Name="一元多项式加减";
    m[2].Name="返回          ";

    int t=1,ID;
    while(t)
    {
        ShowMenu("数据结构 一元多项式加减运算",m,2);//显示菜单
        cout<<"/t说明:1-每个表达式最长不超过300字符!/n";
        cout<<"/t      2-表达式可以由 含x的1次项(aX、x的n次项(X^n)、常数项(c)组成/n";
        cout<<"/t      3-表达式中可以包含加减运算+/-/n";
        cout<<"/t      例如:8x+2x^3+3x^4+60-4x^2-9+x/n";
   
        ID=SelectMenuID();
        switch(ID)
        {
        case 1:Test_Fx();InitKey();break;
        case 2:t=0;break;
          }
   
    }
   
    return 0;
}

void Test_Fx(){  //测试程序

    PolynElem A[600],B[300];
    char f1[300],f2[300];
    cout<<"请输入数学表达式A:/nF(X)=";
    cin>>f1;
    cout<<"请输入数学表达式B:/nF(X)=";
    cin>>f2;
    cout<<"/n您输入的表达式/nA="<<f1<<endl;
    cout<<"B="<<f2<<endl;
   

    int nA,nB;

    ///加法演示
    nA=fx(f1,A);   //识别表达式,并分离系数,存入数组A中
    nB=fx(f2,B);
    PolynElemSub(A,nA);  //把f1 中 同指数的加起来
    PolynElemSub(B,nB);  //把f1 中 同指数的加起来
    cout<<"A+B=";
    AddPolynElem(A,nA,B,nB,1);  //加法合并
    PolynElemSub(A,nA);//计算
    OrderFx(A,nA);//排序
    OutPutFx(A,nA);//输出结果


    ///减法演示
    nA=fx(f1,A);   //识别表达式,并分离系数,存入数组A中
    nB=fx(f2,B);
    PolynElemSub(A,nA);  //把f1 中 同指数的加起来
    PolynElemSub(B,nB);  //把f1 中 同指数的加起来
    cout<<"A-B=";
    AddPolynElem(A,nA,B,nB,0);  //减法合并
    PolynElemSub(A,nA);//计算
    OrderFx(A,nA);//排序
    OutPutFx(A,nA);//输出结果

}

char *MidStr(char *p,int F1,int F2){ //取字符串
    char *buf=new char[F2-F1+1];  //开辟一个临时数组,保存字符
    int k=0;
    for(int i=F1;i<=F2;i++) //从F1开始取字符串,直至F2结束
    {
        buf[k++]=p[i];     //把字符串保存在 buf中
    }
    buf[k]='/0';
    return buf;   //返回buf的首地址
}

int sVal(char *s){//字符串,转整形变量
   
    int L=strlen(s);
    char *h,*p;
    h=p=s;
    int tmp=0;
    int K=0;
    int PW=0;
    while(*p)
    {
        switch(*p){
        case '0':tmp=0;break;
        case '1':tmp=1;break;
        case '2':tmp=2;break;
        case '3':tmp=3;break;
        case '4':tmp=4;break;
        case '5':tmp=5;break;
        case '6':tmp=6;break;
        case '7':tmp=7;break;
        case '8':tmp=8;break;
        case '9':tmp=9;break;
        }
        PW=(int)(pow(10,L-1));
        tmp=tmp*PW;
        K=K+tmp;

        tmp=0;
        L--;

        p++;
   
    }
   
    return K;

}


void SpPolyn(char *PolynString,int *c,int *e){  //添加项:分离系数、指数
    char *h,*p,*fc;
    int F1=0,F2=0;
    char *cc,*ee;
   
    fc=h=p=PolynString;  //指向PolynString

    //处理 系数 没有的情况,如果没有输入系数,则自动添加 1

    if(fc[0]=='x'){
        int len=strlen(fc);
        char *ss=new char[len+2];
        ss[0]='1';
        ss[1]='/0';
        ss=strcat(ss,fc);
        fc=h=p=PolynString=ss;  //指向新的字符数据
    }

    int tmp=0;

    if(strchr(fc,'X')!=NULL || strchr(fc,'x')!=NULL)
    {
        if(strchr(fc,'^')!=NULL)
        {  
            while(*p)
                {
                    if(*p=='X' || *p=='x')
                        {
                            cc=MidStr(h,F1,F2-1);  //系数字符串
                            F1=F2;
                        }
                    p++;
                    F2++;
                }
            ee=MidStr(h,F1+2,strlen(h)); //指数字符串
            *c=sVal(cc);
            *e=sVal(ee);
        }
        else
        {
            //一次项
        tmp=sVal(MidStr(h,0,strlen(h)-2));
        *c=tmp;
        *e=1;
           
        }
    }
    else
    {
        //常数项
        tmp=sVal(h);//转换数字
        *c=tmp;     //保存系数
        *e=0;       //指数置为 0
    }
}

int fx(char *f,PolynElem *Arg)  //从表达式中 分离项
{
    int F1=0,F2=0;
    int i=0;
    int j=0;
    int n=0;

    int c,e;

    char *p,*h;
    char *tmp;

    h=p=f;  //保存表达式

    int Flag=1;//符号 +/-

    int L1=strlen(f);  //防错处理
    f[L1]='#';
    f[L1+1]='/0';


    while(*p){       
        if(*p=='+' || *p=='-' || *p=='#')
            {
            if(j==0){  //处理首字符是 + 或 -
                if(*p=='-')Flag=-1;
                else
                    Flag=1;
                j++;
                p++;
                continue;
            }
           
                F2=j-1;
                tmp=MidStr(h,F1,F2);//取项:即取字符串
               
                F1=j+1; //重新标记 F1
               
                SpPolyn(tmp,&c,&e);//分离系数
           
                Arg[n].c=c*Flag;
                Arg[n].e=e;
                n++;
                if(*p=='-')Flag=-1;
                else
                    Flag=1;
            }
            j++;
            p++;
    }
return n;
}

void PolynElemSub(PolynElem *s,int &nn){  //合并同类项

    int i,j;
    int k;
    int pn=0;
    int n;
    n=nn;
    PolynElem TMP[1000]; //临时数组,保存加法结果

    for(i=0;i<n;i++)   //加
        for(j=i+1;j<n;j++)
        {
            if(s[i].e==s[j].e)  //指数相等,底数相加
            {
                s[j].c=s[j].c+s[i].c;  //两数相加
                s[i].c=0;      //把加数 置为0 ,表示已经加过了
            }
        }
    for(k=0;k<n;k++)  //剔出系数为0的无用项
    {
        if(s[k].c==0)continue;
        else
        {
            TMP[pn].c=s[k].c;
            TMP[pn].e=s[k].e;
            pn++;
        }
    }

    for(k=0;k<pn;k++) //保存结果
    {
        s[k].c=TMP[k].c;
        s[k].e=TMP[k].e;
    }

    nn=pn;//返回加合后的项数

}

void AddPolynElem(PolynElem *argA,int &nA,PolynElem *argB,int nB,int isADD){//合并A,B表达式,结果存在A中
    int i,j,k;
    i=nA;
    j=nB;

    for(k=0;k<nB;k++)
    {
        if(isADD==1)argA[nA+k].c=argB[k].c; //加法合并
            else argA[nA+k].c=-(argB[k].c);  //减法合并时,需要做+ - 处理
        argA[nA+k].e=argB[k].e;
    }
    nA=nA+nB;
}

void OutPutFx(PolynElem *arg,int n){// 输出表达式
    if(n==0)cout<<"0";
    for(int i=0;i<n;i++)
    {
        cout<<arg[i].c;
        if(arg[i].e!=0)
        {
            cout<<"X";
            if(arg[i].e!=1)cout<<"^"<<arg[i].e;
        }
       
        if(arg[i+1].c>=0 && i+1<n)cout<<"+";
    }
    cout<<"/n";
}

void OrderFx(PolynElem *arg,int n){//表达式排序
    int i,j;
    PolynElem TMP;
    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        {
            if(arg[j].e<arg[i].e)
            {
                TMP.c=arg[i].c;
                TMP.e=arg[i].e;
                arg[i].c=arg[j].c;
                arg[i].e=arg[j].e;
                arg[j].c=TMP.c;
                arg[j].e=TMP.e;

            }
        }

}

原创粉丝点击