//一元多项式加减程序
//程序:张建波
//时间: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;

}
        }

}

转载于:https://www.cnblogs.com/hgndinfo/archive/2006/02/09/2713930.html

数据结构-一元多项式加减程序相关推荐

  1. 一元多项式加减乘实现c/c++

    一.实验题目:  一元多项式简单的计算器 1.主要功能: (1)输入并建立多项式: (2)输出多项式: (3)两个多项式相加,建立并输出和多项式: (4)两个多项式相减,建立并输出差多项式. (5)算 ...

  2. 数据结构 - 一元多项式相加减(C语言)

    通常情况下,一元多项式可写成: an(x) = a1x^e1 + a2x^e2 + a3x^e3 + ... + amx^em (数字,m为下标),其中:pi是指数为ei的项的非零系数,0<= ...

  3. 一元多项式加减乘运算-数据结构-课程设计

    Polyn.h #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct ...

  4. Linux加减程序编写,Makefile 入门(加减乘除实现)

    Makefile 入门(加减乘除实现) 准备 使用任意Linux发行版即可,本文使用WSL Ubuntu. 开始之前,需要安装必要的工具: sudo apt install make g++ 开始 1 ...

  5. 数据结构(C语言)多项式加减

    这是大二刚开始数据结构的平时作业,上次随便发了,没来得及写标题和内容.题目要求用链表来实现多项式的加减,其实就是设置一个两个指针进行遍历,在代码段里有一些注解,要是有不太清楚的地方可以在下面留言或是私 ...

  6. c语言中程序偏离,C语言中的指针加减偏移量

    首先看一段程序: #include int main() { int a[5] = {1, 2, 3, 4, 5}; int* p = (int*)(&a + 1); printf(" ...

  7. 微信小程序购物车 数量加减功能

    微信小程序购物车 数量加减功能 wxml <!-- 主容器 --> <view class="stepper"> <!-- 减号 --> < ...

  8. C语言(CED)编写一个程序,求两个字符之间的加减运算。

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 复习C语言,不同的心境遇到了不同的问题: 问题: 编写一 ...

  9. android商品数量加减,微信小程序实现一个简单的商品数量加减案例

    简介 这是一个用微信小程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用,很简单哦~~~. 核心js方法说明addCount(增加数量) delCount (减少数量) ...

最新文章

  1. 懒加载中进行字典转模型
  2. 【实习】今日头条【抖音火山】后台开发实习生
  3. Kettle使用_22 维度更新 缓慢变化维 拉链表
  4. haroopad夜间模式与数学公式显示
  5. 小心DLL链接静态库时的内存错误
  6. 最新emlog媒体范美化版v6.3.1
  7. Caffe的创始人贾扬清说,算法工程师将不存在?
  8. python进程问题
  9. Activity的几种启动模式介绍
  10. 通过OpenOffice实现Office文档转换为PDF格式的文档
  11. 1、NoSQL数据库简介
  12. matlab产生窄带信号,窄带信号
  13. 玩转Python第三方库库tqdm
  14. Excel查找字符串下标(findsearch)
  15. 宇视网络视频录像机升级步骤
  16. append()与prepend()的区别
  17. 6-7 BMI计算(类与对象) (10分)
  18. 一文分析 Web3 尚未被主流采用的 6 个主要原因
  19. 自称中本聪的他被法官怒怼:你的证词毫无可信度!
  20. Facebook营销进阶技巧有哪些

热门文章

  1. 获取当前 服务 路径 .net
  2. HBuilder打包App方法
  3. 【知了堂学习笔记】数据库连接池简介,以及Eclipse中C3p0连接池的简单运用
  4. 权限管理系统如何分别实现对用户和角色的授权
  5. Hihocoder 最近公用祖先三 在线LCA
  6. POJ 2115 C Looooops (扩展欧几里德解同余方程 Ax = B(mod C) )
  7. ASP.NET典型三层架构企业级医药行业ERP系统实战(8大模块22个子系统)
  8. 当你遇到modifying layer that is being finalized的时候怎么办?
  9. 基于Carbide.C++ 的Symbian开发环境搭建
  10. VUE系列-Vue中组件的应用(三)