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

数据结构实验1 一元多项式的加减法 实验一  线性表操作(一元多项式的运算) 实验目的 定义线性表的链式存储 2、实现对线性表的一些基本操作和具体函数定义   实验要求: 1、定义线性表的链式存储; 2、实现对线性表的一些基本操作和具体函数定义。 3、定义输出一元多项式的函数; 4、编写主程序调用上面的函数实现一元多项式的加减。   数据输入输出要求:   输入示例: 3 2 3 3 4 5 7 5... 阅读详情

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

            }
        }

}

一元多项式的加减乘除运算(c++实现)—数据结构学习 #include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; typedef struct Node* List; struct Node { List next;//指向下一个结点 int x;//指数 int z;//系数 }; List Read() { ... 阅读详情

相关推荐

【数据结构】用链表实现一元多项式相加减(C语言版)

一元多项式的表示及相加 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 文章目录一元多项式的表示及相加前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任

m0_63425312的博客 4657

一元多项式相加|数据结构

#include<stdio.h> #include<stdlib.h> typedef struct pnode { float coef; int exp; pnode* next; }polynode; int main() { polynode *a,*b,*c; polynode* CREATELIST_R(int n); void OUT(po...

资资的博客 1051

c++设计一个一元稀疏多项式简单计算器

#include using namespace std; struct Node { float coef; int expn; Node *next; }; void Copy(Node *&pc, Node *pa)//把一个链表的内容复制给另一个链表 { Node *p,*q, *r; pc = new Node; pc->next = NULL; r =

Calhoun的博客 8049

数据结构:一元多项式的乘法与加法运算

中国大学MOOC视屏讲解 设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: ...

稀饭 2万+

最详细的一元稀疏多项式计算器C语言实现

1.程序设计思路 1.框架构想 本程序的设计目的旨在使用C语言设计一个一元稀疏多项式计算器,其具有计算器可视化界面,多项式的加减法计算功能和自然语言的输入输出方式的功能,计算器根据用户输入的多项式和指定的功能来进行计算,最后输出计算结果。 2.数据结构的选择 由于多项式是稀疏多项式,故不应该使用数组的形式存储多项式,而应该使用链表存储多项式。 typedef struct { double coef; //多项式系数 ...

WRWEREWRET的博客 5524

一元稀疏多项式计算器 【 数据结构课设作业 ,腾讯架构师首发

{ s = s + (*str - '0') / d; d *= 10.0; str++; } return s * (flag ? -1.0 : 1.0); } void getNums() //在输入的字符串中提取系数和指数 { int i = 0; cnt = 0; double coef; int expn; char str[80]; scanf("%s", str); while (*(str + i)) { coef = get_coef(str + i);

m0_60549751的博客 216

[数据结构]多项式相加减(链表)

<br />一元稀疏多项式计算器<br />基本功能: <br />1 输入并建立多项式 <br />2 输出多项式 <br />3 能够修改多项式(插入一个新的项,删除任意一项) <br />4 多项式A和B相加,建立多项式A+B <br />5 多项式A和B相减,建立多项式A-B <br /> <br />#include<stdio.h><br />#include<malloc.h><br />#include<conio.h><br />typedef struct node{<br />int

Db1314的专栏 1253

数据结构C语言 一元多项式的加减法

数据结构 C语言 动态链表 议员多项式的加减法 数据结构C语言 一元多项式的加减法算法实现 代码,用vs运行,已测试成功运行,

两个一元多项式加减乘运算的链表实现

采用数据结构中线性链表实现一元多项式的加减乘运算,适合初学者!

treefriend博客 2159

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

使用链表操作一元多项式,使之可以直接进行一元多项式的加减法,vs可以直接打开运行,其他软件,请找到文件中的main.c文件进行运行,所有代码均为本人自己写的,仅供学习,请勿做一切任何商业用途

数据结构——一元多项式加法、减法、乘法运算的实现

数据结构——一元多项式加法、减法、乘法运算的实现,可以直接使用

C语言加法和乘法程序,数据结构多项式运算的程序(加减法和乘法)C语言版.doc

数据结构多项式运算的程序(加减法和乘法)C语言版数据结构多项式运算的程序(加减法和乘法)C语言版#include#includetypedef struct node{//定义节点类型float coef;int expn;struct node * next;}PLOY;void start()//用户选择界面{printf("**********************************...

weixin_35932973的博客 564

数据结构一元多项式的加减乘.

数据结构一元多项式的加减乘. 数据结构的链表形式

设计一个一元稀疏多项式简单计算器

目录1.题目2.需求分析3.程序设计4.测试结果5.源码 1.题目 【问题描述】 设计一个一元稀疏多项式简单计算器。 【基本要求】 (1)输入并建立两个多项式; (2)多项式a与b相加,建立和多项式c; (3)多项式a与b相减,建立差多项式d; (4)输出多项式a, b, c, d。输出格式:比如多项式a为:A(x)=c1xe1+ c2xe2+…+ cmxem,其中,ci和ei分别为第i项的系数和指数,且各项按指数的升幂排列,即0≤e1<e2<…<em。 【测试数据】 (1)(1+x+x2+x3+x4+x5

qq_43794633的博客 7358

数据结构-一元多项式的各项操作

用于实现一元多项式的创建,相加,相减,相乘的操作,适合大学新生对计算机软件的学习

WPS和Excel通用!省市区四级联动下拉菜单保姆级教程(附最新行政区划数据包)

本文详细介绍了在WPS和Excel中实现省市区四级联动下拉菜单的完整教程,包含2024年最新行政区划数据的获取与整理方法。通过名称管理器和INDIRECT函数的组合,以及WPS的特色功能,帮助用户高效准确地录入四级行政区划信息,提升数据录入效率并减少错误。

s1t2u3的博客 610

java 一元稀疏多项式简单计算器,一元稀疏多项式计算器实验报告

一元稀疏多项式计算器实验报告课程名称:数据结构实验名称: 一元稀疏多项式计算器学 院:钱学森学院实 验 日 期 2020年 05 月 08日诚信承诺:我保证本实验报告中的程序和本实验报告是我自己编写,没有抄袭。一、实验目的熟悉课堂上讲过的一元多项式加法数据结构(使用链表)加强C++的基本操作以及STL的使用深入理解类封装,抽象的意义,并在实践中使用二、实验环境...

weixin_29625757的博客 1282

Pdu Router(PduR)模块

1. PduR路由基本功能 2. PduR总线网关功能 3. PduR缓存机制 4. 总结

weixin_43759043的博客 3849
上一篇: 数据结构-文章编辑
下一篇: 数据结构-运动会分数统计
EX_NET
博客等级 码龄21年 953粉丝 270原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值