一元稀疏数多项式计算器

目录

1.问题描述

2.需求分析

3.算法设计和实现

4.调试分析与测试结果

1.问题描述

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

 2.需求分析

(1)输入并建立多项式。
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,⋯,cn,en,其中n是多项式的项数,cᵢ,eᵢ,分别是第i项的系数和指数,序列按指数降序排序。
(3)实现多项式a和b相加,建立多项式a+b。
(4)实现多项式a和b相减,建立多项式a-b。
(5)计算多项式在x处的值。
(6)计算器的仿真界面(选做)。

 3.算法设计和实现

设计思路:

       通过链表来存储和操作多项式,使用排序算法确保节点按照指数递增的顺序排列,并实现了多项式的加减和求值功能。首先定义了链表节点结构体dnode,包含系数c和指数e,以及指向下一项的指针next。创建了一个函数creat(),用来输入多项式的项数和每一项的系数和指数,并以链表的形式存储多项式。实现了一个函数swap(),用来交换两个节点的系数和指数。实现了一个函数sort(),采用冒泡排序法对链表中的节点按指数进行排序,确保链表的节点以递增的指数顺序排列。实现了一个函数operate(),用来对两个多项式进行计算。函数根据用户选择的运算方式,相加或相减两个多项式的对应项,并将结果存储在一个新的链表中。实现了一个函数prn(),用来打印链表中存储的多项式。实现了一个函数qiuzhi(),用来求多项式在给定x值处的值。函数根据多项式的每一项的系数和指数进行计算,最后得到多项式在给定x值处的结果。在主函数main()中,先创建两个多项式a和b,分别输入、排序和打印。然后调用operate()函数对两个多项式进行运算,并打印结果。最后调用qiuzhi()函数,求多项式的值,并输出结果。

//主要函数:
dnode *creat()            /*用链表存放多项式*/
void swap(dnode *p,dnode *q)        /*交换p,q指针所指的指数和系数*/
void sort(dnode *h)                  /*采用冒泡法对链表每一项重新排序*/
dnode *operate(dnode *a,dnode *b)     /*稀疏多项式计算*/
void prn(dnode *h)//打印结果
float qiuzhi(int x,dnode *h)  //求多项式在x处的值

//源代码:
 #include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define NULL 0
typedef struct node        /*定义多项式每一项*/
{
int e;                //e为指数
float c;            //c为系数
struct node *next;    //next指向下一项
}dnode;
dnode *creat()            /*用链表存放多项式*/
{                        //多项式的创建, 即输入两个多项式
dnode *h,*p;
int e,i,n;            //n为多项式的项数
float c;            //c为多项式的系数
h=(dnode *)malloc(sizeof(dnode));            //分配头节点
h->next=NULL;
do                  //当n为0或小于1时,则重新输入
{ 
printf("请输入多项式的项数n:");
scanf("%d",&n);
}while(n<1);
for(i=1;i<=n;i++)    //输入各项的系数c和指数e
{
printf("请输入第%d项的系数c和指数e:",i);
scanf("%f%d",&c,&e);
p=(dnode *)malloc(sizeof(dnode));        //创建新结点
p->c=c;p->e=e;    //将值传给data域
p->next=h->next;//用头插法建立链表
h->next=p;
}
return h;            //返回头结点
}
void swap(dnode *p,dnode *q)            /*交换p,q指针所指的指数和系数*/
{
float m; //中间变量
int n;    //中间变量
n=p->e;  //交换操作
p->e=q->e;
q->e=n;
m=p->c;
p->c=q->c;
q->c=m;
}
void sort(dnode *h)                       /*采用冒泡法对链表每一项重新排序*/
{
dnode *pi,*pl,*p,*q;
p=h->next;            //p此时指向第一项
while(p->next!=NULL)
p=p->next;        //寻找尾结点
pi=p;              //pi指向最后一次交换的位置,初值为表尾
while(pi!=h->next)    //结点数大于1时
{
pl=h->next;        //pl为中间变量,起传递地地址的作用
for(p=h->next;p!=pi;p=p->next)
{
q=p->next;
if(p->e>q->e)
{
swap(p,q);  //调用交换函数
pl=p;
}
}
pi=pl;            //pi指向前一个结点
}
}
dnode *operate(dnode *a,dnode *b)        /*稀疏多项式计算*/
{
int sel;
float x;
dnode *p1,*p2,*p,*t;    //t为结果链表的表头
t=(dnode *)malloc(sizeof(dnode));
t->next=NULL;
printf("--------------------------------------\n");
printf("|            请选择运算方式:        |\n");
printf("|            1、多项式相加          |\n");
printf("|            2、多项式相减          |\n");
printf("|            0、退出!                |\n");
printf("--------------------------------------\n");
printf("请选择:");
scanf("%d",&sel);
p1=a->next;
p2=b->next;
while(p1&&p2)
{   
if(p1->e==p2->e)        //指数相同
{
if(sel==1)
x=p1->c+p2->c;    //系数相加   
else
x=p1->c-p2->c;    //系数相减
if(x!=0)
{
p=(dnode *)malloc(sizeof(dnode));
p->e=p1->e;
p->c=x;
p->next=t->next;//利用头插法将p结点插入t中
t->next=p;
}
p1=p1->next;
p2=p2->next;
}
else if(p1->e>p2->e)    //p1的指数大于p2的指数
{   
p=(dnode *)malloc(sizeof(dnode));
p->e=p2->e;
if(sel==1)
p->c=p2->c;
else
p->c=(-1)*p2->c;
p->next=t->next;
t->next=p;
p2=p2->next;
}
else                    //p1的指数小于p2的指数
{   
p=(dnode *)malloc(sizeof(dnode));
p->e=p1->e;
p->c=p1->c;
p->next=t->next;
t->next=p;
p1=p1->next;
}
}
while(p1!=NULL)                //p2为空,p1不为空时
{   
p=(dnode *)malloc(sizeof(dnode));
p=p1;
p1=p1->next;
p->next=t->next;        //把p1 放在结果链表后面
t->next=p;
}
while(p2!=NULL)                //p1为空,p2不为空时
{
p=(dnode *)malloc(sizeof(dnode));
p->e=p2->e;
if(sel==2)                //如果选择的是2,则将p2中剩余的项的系数取其相反数
p->c=(-1)*p2->c;
else
p->c=p2->c;
p2=p2->next;
p->next=t->next;        //把p1 放在结果链表后面
t->next=p;
}
return t;                    //返回运算后的多项式的头结点
}
void prn(dnode *h)//打印结果
{
dnode *p;
p=h->next;
if(p==NULL)  //如果多项式项数为0
{
printf("多项式项数为0,退出!\n");
exit(0);                      //终止函数
}
printf("生成的多项式如下:\n");
while((p->next)!=NULL)  //否则,则输出
{
printf("%3.1f X^%d + ",p->c,p->e);
p=p->next;
}
if(p->next==NULL)
{
printf("%3.1f X^%d\n",p->c,p->e);
}
}
float qiuzhi(int x,dnode *h)  //求多项式在x处的值
{
dnode *p;
float sum=0;
int i,t;
printf("请输入x的值:");
scanf("%d",&x);
for(p=h->next;p;p=p->next)
{
t=1;
for(i=p->e;i!=0;)
{
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}  //指数小于0,进行除法
}
sum+=p->c*t;
}
return sum;
}
void main()
{
int x;
float sum=0;
dnode *a,*b,*c;
a=creat();    //第一个多项式
sort(a);    //排序
prn(a);        //打印结果
b=creat();    //第二个多项式
sort(b);    //排序
prn(b);        //打印结果
c=operate(a,b); //结果多项式
prn(c);        //打印
sum=qiuzhi(x,c);
printf("多项式的值为:%.3f",sum);
printf("\n");
}

4.调试分析与测试结果 

调试分析:

问题1:代码需要用户输入多项式的系数和指数。确保输入值格式正确并按预期提供。

用户可能会输入以处理输入无效或非数字的。

解决方法:考虑添加错误处理以处理多项式项数(n)小于1的情况。

问题2:sort()函数使用冒泡排序算法对多项式项按指数重新排序。

解决方法:验证排序逻辑是否正确,并检查潜在的错误或边界情况。

问题3:验证prn()函数是否正确打印多项式项的期望格式。

          解决方法:检查输出格式的任何潜在问题,比如漏掉符号或多余空格。

 测试结果:

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值