一元稀疏多项式简单计算器(C语言)含注释

这篇具有很好参考价值的文章主要介绍了一元稀疏多项式简单计算器(C语言)含注释。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题描述

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

基本要求

一元稀疏多项式简单计算器的基本功能是:

(1)输入并建立多项式;

(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,……,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;

(3)多项式a和b相加,建立多项式a+b;

(4)多项式a和b相减,建立多项式a-b。

测试数据

(1)(2x+5x3-3.1x11)+(7-5x3+11x9)=(-3.1x11+11x9+2x+7)

(2)(6x-3-X+4.4X2-1.2X9)-(-6X-3+5.4X2-X2+7.8X15)=(-7.8X15-1.2X9+12X-3-X)

(3)(1+X+X2+X3+X4+X5)+(-X3-X4)=(1+X+X2+X5)

(4)(X+X3)+(-X-X3)=0

实现提示

用带表头结点的单链表存储多项式。

选作内容

(1)计算多项式在X处的值。

(2)计算多项式a的导函数a’。

(3)多项式a和b相乘,建立乘积多项式ab。

(4)多项式的输出形式为类数学表达式。例如,多项式-3x8+6x3-18的输出形式为-3x^8+6x^3-18。注意,系数为1的非零次项的输出形式中略去系数1,如1x8的输出形式为x^8。

(5)计算器的仿真界面。

程序界面如下:

一元稀疏多项式简单计算器(C语言)含注释

仿真界面如下:

一元稀疏多项式简单计算器(C语言)含注释

Tips:

  1. 可以合并同指数的项

  1. 类数学表达式与实际基本一直

  1. 输入时注意系数与指数为0的情况

  1. 采用链表的数据结构

一些个人感想:

整个程序难度不大,相比运动会略难,在编写过程中耗时最长的是类数学表达式,为了输出准确,不断测试特殊情况,进行调整。

完整程序如下:文章来源地址https://www.toymoban.com/news/detail-482097.html

#include <iostream>
#include <iomanip>
#include <conio.h>
#include <stdio.h>
#include <process.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
using namespace std;
//链表实现多项式

struct Node
{
    int coef;     //系数
    int power;    //指数
    Node *link;  //指针域
};
Node Head,Head2;//头节点
Node *LinkList;//多项式a
Node *LinkList2;//多项式b
int n=0,m=0;//项数

Node *temp,head;//相乘时所使用的新表,用来暂存相乘后的数据

void wait();
void cover();
void input(Node *LinkList,int flag);
void Insert(Node *LinkList,int coef,int power,int flag);
void printLinkList(Node *LinkList,int flag);
void selectionSort(Node *LinkList);
void add(Node *LinkList,Node *LinkList2);
void subtract(Node *LinkList,Node *LinkList2);
void calculate(Node *LinkList);
void dX(Node *LinkList);
void multiply(Node *LinkList);

int main()
{
    char choice;
    LinkList=&Head;
    Head.link=NULL;
    LinkList2=&Head2;
    Head2.link=NULL;
    while(1)
    {
        system("cls");
        printf("\n\n\n\n");
        printf("\t\t               一元稀疏多项式简单计算器  \n");
        printf("\t\t=========================================================");
        printf("\n\n");
        printf("\t\t             1:输入\n");
        printf("\t\t             2:输出(整数序列->类数学表达式)\n");
        printf("\t\t             3:相加\n");
        printf("\t\t             4:相减\n");
        printf("\t\t             5:计算在X处的值\n");
        printf("\t\t             6:计算多项式a的导函数a'\n");
        printf("\t\t             7:多项式a和b相乘,建立乘积多项式ab。\n");
        printf("\t\t             0:退出\n");
        printf("\n");
        printf("\t\t请选择:");
    
        choice = getch();
        system("cls");
        switch(choice)
        {
        case '1':
            cover();
            LinkList->link=NULL;
            input(LinkList,1);
            wait();
            break;
        case '2':
            printLinkList(LinkList,1);
            wait();
            break;
        case '3':
            add(LinkList,LinkList2);
            wait();
            break;
        case '4':
            subtract(LinkList,LinkList2);
            wait();
            break;
        case '5':
            calculate(LinkList);
            wait();
            break;
        case '6':
            dX(LinkList);
            wait();
            break;
        case '7':
            multiply(LinkList);
            wait();
            break;
        case '0':
            exit(0);
        default:
            break;
        }
    }

}

//多项式输入
void input(Node *LinkList,int flag)
{
    Node *p=LinkList->link;
    int coef,power;
    int i,length;//长度
    printf("请输入项数:");
    if(flag==1)
    {
        scanf("%d",&n);
        length=n;
    }
    else
    {
        scanf("%d",&m);
        length=m;
    }
    for(i=1;i<=length;i++)
    {
        printf("请输入第%d项的系数:",i);
        scanf("%d",&coef);
        printf("请输入第%d项的指数:",i);
        scanf("%d",&power);
        Insert(LinkList,coef,power,flag);
    }
}

//数据传入链表-尾插
void Insert(Node *LinkList,int coef,int power,int flag)
{
    int i;
    Node *p=LinkList,*temp;
    while(p->link!=NULL)//计算是否有相同指数
    {
        p=p->link;
        if(p->power==power)
        {
            p->coef+=coef;
            if(flag==1)
                n--;
            else
                m--;
            return;
        }
    }
    temp=new Node;
    temp->power=power;
    temp->coef=coef;
    temp->link=NULL;//指针域
    p->link=temp;
}

//打印多项式
void printLinkList(Node *LinkList,int flag)
{
    selectionSort(LinkList);
    Node *p=LinkList->link,*q=LinkList->link;
    if(flag==1)
        printf("%d||",n);
    else
        printf("%d||",m);
    while(q!=NULL)
    {
        printf("(%d,%d) ",q->coef,q->power);
        q=q->link;
    }
    printf("\n");
    flag=0;//重置flag,控制首项符号
    int sum=0;
    while(p!=NULL)
    {
        sum+=p->coef*pow(1,p->power);//把x=1代入,如果sum=0,说明各项等于0,输出0
        if(p->coef==0)//系数为0,不打印
        {
            p=p->link;
            continue;
        }
        //单独判断正负号的打印
        if(p->coef>0&&flag==1)//系数大于0且不为第一项
            printf(" + ");
        else if(p->coef<0)//系数小于0
            printf(" - ");
        if(p->coef==1||p->coef==-1)//系数为1、-1时单独处理
        {
            if(p->power==0)// |(-)1*X^0|=1
            {
                printf("1");
                flag=1;
                p=p->link;
                continue;
            }
            if(p->power==-1)// |(-)X^-1|=X
            {
                printf("X^(-1) ");
                flag=1;
                p=p->link;
                continue;
            }
            printf("X^%d ",p->power);// |(-)1X^n|=x^n
            flag=1;
        }
        else //其余情况
        {
            if(p->power==1) //|nX^1|=nX
            {
                printf("%dX",abs(p->coef));
                flag=1;
                p=p->link;
                continue;
            }
            else if(p->power==0) //|nX^0|=n
            {
                printf("%d",abs(p->coef));
                flag=1;
                p=p->link;
                continue;
            }
            if(p->power<0) //||n*X^(-m)|=n*X^(-m)
            {
                printf("%dX^(%d) ",abs(p->coef),p->power);
                flag=1;
                p=p->link;
                continue;
            }
            printf("%dX^%d",abs(p->coef),p->power); //多数情况
            flag=1;
        }
        p=p->link;
    }
    if(sum==0)//均为0
        printf("0");
}

//相加
void add(Node *LinkList,Node *LinkList2)
{
    LinkList2->link=NULL;
    printf("请输入多项式b:\n");
    input(LinkList2,m);
    printLinkList(LinkList,1);
    printf("\n加上\n");
    printLinkList(LinkList2,2);
    printf("\n等于\n—————————————————————————————————————————————————\n");
    Node *q=LinkList2->link;
    while(q!=NULL)
    {
        n++;
        Insert(LinkList,q->coef,q->power,1);
        q=q->link;
    }
    printLinkList(LinkList,1);
}

//相减
void subtract(Node *LinkList,Node *LinkList2)
{
    LinkList2->link=NULL;
    printf("请输入多项式b:\n");
    input(LinkList2,2);
    printLinkList(LinkList,1);
    printf("\n减去\n");
    printLinkList(LinkList2,2);
    printf("\n等于\n—————————————————————————————————————————————————\n");
    Node *q=LinkList2->link;
    while(q!=NULL)
    {
        n++;
        Insert(LinkList,-q->coef,q->power,1);
        q=q->link;
    }
    printLinkList(LinkList,1);
}

//计算多项式在X处的值
void calculate(Node *LinkList)
{
    Node *p=LinkList->link;
    int x;
    double sum=0;
    printLinkList(LinkList,1);
    printf("\n请输入X的值:");
    scanf("%d",&x);
    while(p!=NULL)
    {
        sum+=p->coef*pow(x,p->power);
        p=p->link;
    }
    printf("\n当X的值为%d时,多项式的值为:%.2f\n",x,sum);
}

//计算多项式a的导函数a’
void dX(Node *LinkList)
{
    printLinkList(LinkList,1);
    Node *p=LinkList->link;
    while(p!=NULL)
    {
        if(p->power==0)
        {
            p->coef=0;
            p=p->link;
            continue;
        }
        p->coef=p->coef*p->power;//系数=系数×指数
        p->power--;//降幂
        p=p->link;
    }
    printf("\n求导成功!如下:\n");
    printLinkList(LinkList,1);
}

//多项式a和b相乘,建立乘积多项式ab
void multiply(Node *LinkList)
{
    temp=&head;//新表
    temp->link=NULL;
    LinkList2->link=NULL;
    int coef,power;
    printf("请输入多项式b:\n");
    input(LinkList2,2);
    printLinkList(LinkList,1);
    printf("\n乘以\n");
    printLinkList(LinkList2,2);
    printf("\n等于\n—————————————————————————————————————————————————\n");
    Node *p=LinkList->link,*q=LinkList2->link;
    n=0;//因为多项式a要放置相乘后的表达式,所以项数要创新计算
    while(q!=NULL)
    {
        while(p!=NULL)
        {
            n++;
            coef=p->coef*q->coef;
            power=p->power+q->power;
            Insert(temp,coef,power,1);
            p=p->link;
        }
        p=LinkList->link;
        q=q->link;
    }
    LinkList=temp;//多项式a等于新表
    printLinkList(LinkList,1);
}




//选择法排序-降序
void selectionSort(Node *LinkList)
{
    Node *p,*q,*max,*temp;
    p=LinkList;
    while(p->link!=NULL)
    {
        q=p->link;
        max=p;
        while(q->link!=NULL)
        {
            if(q->link->power > max->link->power)
                max=q;
            q=q->link;
        }
        if(max!=p)
        {
            temp=max->link;
            max->link=temp->link;//将本循环的最大值从链表删除
            temp->link=p->link;
            p->link=temp;//将本循环的最大值插入链表
        }
        p=p->link;
    }
}

//公用的等待函数
void wait()
{
    cout << "\n\n请按任意键继续" << flush;
    getch();
}

//计算器的仿真界面
void cover()
{
    cout<<"=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*="<<endl;
    cout<<"*\t\t一元多项式计算器\t\t*"<<endl;
    cout<<"=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*="<<endl<<endl<<endl;
    cout<<"       \t1\t2\t3\t+"<<endl;
    cout<<"       \t4\t5\t6\t-"<<endl;
    cout<<"       \t7\t8\t9\t^"<<endl;
    cout<<"       \t0\t.\t(\tC"<<endl;
    cout<<"       \t'\t=\t)\t×"<<endl;
}

到了这里,关于一元稀疏多项式简单计算器(C语言)含注释的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • PTA 习题3.6 一元多项式的乘法与加法运算

    PTA 习题3.6 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(13)
  • Python做曲线拟合(一元多项式拟合及任意函数拟合)

    Python做曲线拟合(一元多项式拟合及任意函数拟合)

    目录 1. 一元多项式拟合 使用方法 np.polyfit(x, y, deg) 2. 任意函数拟合 使用 curve_fit() 方法 实例: (1)初始化 x 和 y 数据集 (2)建立自定义函数 (3)使用自定义的函数生成拟合函数绘图  polyfig 使用的是最小二乘法,用于拟合一元多项式函数。 参数说明: x 就是x坐标,

    2024年02月02日
    浏览(14)
  • 数据结构(严蔚敏)【一元多项式的运算】【C语言】

    数据结构(严蔚敏)【一元多项式的运算】【C语言】

    1、一元多项式的运算:实现两个多项式加、减乘运算 设计内容: 用顺序存储结构实现一元多项式的加法、减法和乘法。具体要求为:用五个函数分别实现一元多项式的创建、输出、加法、减法和乘法; 设计思路: 将顺序表数组下标作为多项式的指数项,数组内的数据元素

    2023年04月15日
    浏览(22)
  • 第39关:基于链表的两个一元多项式的基本运算

    第39关:基于链表的两个一元多项式的基本运算

    任务描述 本关任务:给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。 编程要求 输入 输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两

    2024年02月06日
    浏览(12)
  • 题02-线性结构2 一元多项式的乘法与加法运算(C语言)

    题02-线性结构2 一元多项式的乘法与加法运算(C语言)

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月07日
    浏览(13)
  • 浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月13日
    浏览(11)
  • 数据结构:链表应用:第1关:基于链表的两个一元多项式的基本运算

    任务描述 本关任务:给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。 编程要求 输入 输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两

    2024年04月12日
    浏览(86)
  • 数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    数据结构中: 一元多项式的运算(相加,相减,相乘)------用C语言 / C++来实现。 数据结构线性表的操作和应用(顺序存储)

    线性表的操作和应用(顺序存储)。用顺序存储实现一元多项式,并进行加、减、乘运算。 (1)一元多项式结构体创建  (2)初始化 (3)一元多项式赋值             (4)打印一元多项式 (5)加法运算                        (6)减法运算 (7)乘法运算    全部代

    2024年02月01日
    浏览(49)
  • MATLAB 之 数据统计分析和多项式计算

    在实际应用中,经常需要对各种数据进行统计处理,以便为科学决策提供依据。这些统计处理包括求数据序列的最大值和最小值、和与积、平均值和中值、累加和与累乘积、标准差和相关系数、排序等,MATLAB 提供了相关的函数来实现。 MATLAB提供了求数据序列最大值的函数m

    2024年02月08日
    浏览(11)
  • 在嵌入式设备中用多项式快速计算三角函数和方根

    惯性传感器的倾角计算要用到三角函数. 在 MCS-51, Cortex M0, M3 之类的芯片上编程时, 能使用的资源是非常有限, 通常只有两位数KB的Flash, 个位数KB的RAM. 如果要使用三角函数和开方就要引入 math.h, 会消耗掉10KB以上的Flash空间. 在很多情况下受硬件资源限制无法使用 math.h, 这时候使

    2024年03月09日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包