ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:72.20KB ,
资源ID:8219438      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8219438.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(多项式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

多项式.docx

1、多项式题目:一元稀疏多项式计算器班级:信管09-1班 姓名:单锦芳 学号:0901050304 一、 需求分析(1) 用线性链表来存储多项式的信息。当要求输入多项式时,用户依次输入多项式的系数和指数(包括符号),其中,系数是浮点型,指数是整型,该程序会将每一项的系数和指数储存在链表的一个结点中,链表的next指针指向该多项式的下一项。(2) 演示程序是用户在键盘上输入演示程序中规定的命令从屏幕上输出显示用户输入的多项式,并显示多项式经计算以后的值。(3) 输出结果中,若系数为1,则将系数省略,若为0,将该项省略;若指数为1,指数省略,指数为0,该项为常数项。(4) 本程序的输出结果中,多项式按

2、降幂排序。(5) 该程序实现的功能:a:创建多项式 b:输出多项式 c:多项式的加法运算 d:多项式的减法运算e:多项式的乘法运算 f:对多项式求导 g:多项式求值 二、 概要设计1、 设定链表的抽象数据类型ADT Polyn 数据对象:D=aiElemType,i=1,2,m,m0ElemType中的每一个元素包含一个表示系数的实数,一个表示指数的整数和一个指向下一项的指针数据关系:R1=ai-1,ai| ai-1,aiD,且ai-1中的指数值ai中的指数值,i=2,n基本操作: CreatePolyn(&P,n) 操作结果:输入第n项的系数和指数,建立一元多项式P Insert(p, q)

3、 初始条件:一元多项式p,q已存在 操作结果:通过插入使两多项式合并为一个,实现按降幂排序Compare(a,b)初始条件:一元多项式a,b存在操作结果:比较a,b的指数大小AddPolyn(pa,pb)初始条件:一元多项式pa,pb已经存在操作结果:实现两个多项式的加法SubtractPolyn(pa,pb)初始条件:一元多项式pa,pb已经存在操作结果:实现两个多项式的减法ValuePolyn(head,x)操作结果:对多项式求值Derivative (head)初始条件:一元多项式head已经存在操作结果:对多项式求导Derivative(pa,pb)初始条件:一元多项式pa,pb已经存

4、在操作结果:实现两个多项式的乘法 DestroyPolyn(p) 初始条件:一元多项式p已存在操作结果:将一元多项式销毁 PrintPolyn(p) 初始条件:一元多项式p已存在 操作结果:打印出一元多项式pADT Polyn2、 本程序包含2个模块a、 主函数模块void main()创建多项式;选择操作;执行运算;输出结果;销毁多项式;b、链表模块实现链表的抽象数据类型各模块之间的调用如下:主函数模块 链表模块三、 详细设计1、 结点类型和部分数据定义typedef struct LNode /存储结构定义 float coef; /系数 int expn; /指数 struct LNod

5、e *next;*ElemType,LNode;2、 主函数和其他函数的算法分析void Insert(ElemType p,ElemType q); /插入函数,将q插入到p中,用于创建多项式时,实现创建的多项式按降幂/排列Status CreatePolyn(ElemType &p,int n); /实现多项式的有序创建,调用Insert函数,将各项按幂的降序排列 /n0,返回OKStatus DestroyPolyn(ElemType p); /实现多项式的销毁,销毁成功返回OKvoid PrintPolyn(ElemType p) /实现多项式的输出int compare(ElemTy

6、pe a,ElemType b); /比较两项指数大小,若a的指数大于b的指数,返回1;若a的指数小于/b的指数,返回-1;若a的指数等于b的指数,返回0ElemType AddPolyn(ElemType pa,ElemType pb); /实现两个多项式的加法 ,创建一个新的多项式,依次比较pa,pb的各项指数 /调用compare函数插入到新多项式中ElemType SubtractPolyn(ElemType pa,ElemType pb); /实现两个多项式的减法,将pb的各项系数取相反数,然后再与pa进行加法float ValuePolyn(ElemType head,int x)

7、; /实现多项式的求值,输入一个x,逐项将其值代入,若该项指数为负,则 /除以x,将指数加1,循环,直到x为0;否则,乘以x,将指数减1,循/环,直到x值为0ElemType Derivative(ElemType head); /实现多项式的求导,该项为常数项时,将该项删除,否则,将系数与指数 /相乘作系数,指数减1作指数ElemType MultiplyPolyn(ElemType pa,ElemType pb); /实现多项式的乘法,积的系数等于两系数相乘,积的指数等于两系数之和 /调用Insert函数四、 调试分析1、 在该程序的早期版本中,由于缺乏调试技术,源程序中没有明确对尾指针的

8、指向,曾多次出现内存分配错误,后均通过调试改正。这是我对调试技术有了进一步了解。2、 函数的时空分析1) 虽然该程序在输入时对输入的顺序并未作硬性要求,但create函数中附加了排序和合并同类项的功能,这样能大大减小后面的加减法的排序次数。同时在每个函数的排序操作中,均设置了两个指针,一个指向当前结点,另一个指向他的前继结点,这样能方便地在两个指针之间进行插入操作。create函数中的时间复杂度最大为O(n-1)*n/2),Insert1、Insert2函数中的时间复杂度最大为O(m+n)(其中,p为n项,q为m项,插入操作是将q插入p中)。2) 在create函数中,插入操作中除新开辟的头节

9、点和第一个结点外,其他皆为原链表中的结点,因此空间复杂度为O(8*(m+2), Insert1、Insert2函数中的空间复杂度最大为O(8*(m+n) (其中,p为n项,q为m项,插入操作是将q插入p中)。3、在求解合并后多项式项数中,该程序引用了一个全局变量,使项数的求解变得很简单,不需用一个函数来实现。4、 本次程序采用抽象数据类型来实现,使每一个模块的功能变得非常清晰,且模块之间的调用关系也非常明朗。这样的程序设计方法使编程者的思路非常清晰,同时便于对各个模块进行单独调试,非常方便。通过本次试验作业,我确实得到了一次良好的程序设计训练。五、 用户手册1、本程序的运行环境为DOS操作系统

10、,执行文件为:一元稀疏多项式.exe。2、进入演示程序后即显示文本方式的用户界面:3、看到“请选择您要进行的操作(18):”提示后,依次输入一项的系数和指数,按回车键结束。4、接受其他命令后即执行相应运算和显示相应结果,在此不再一一演示。六、测试结果测试数据1:多项式1:2, 1 5, 8 -3.1, 11多项式2:7, 0 -5,8 11,9运算方式:加法结果:测试数据2:多项式1::6,-3 -1,1 4.4,2 -1.2,9多项式2:-6,-3 5.4,2 -1,2 7.8,15运算方式:减法结果:附录源程序:#include#include#include#define TRUE 1#

11、define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -1typedef struct LNode /存储结构定义 float coef; /系数 int expn; /指数 struct LNode *next;*ElemType,LNode;typedef int Status;/typedef term ElemType;void Insert(ElemType p,ElemType q) /插入函数,将各项按幂的降序排列 if(p-coef=0) / 若系数为0释放结点 free(p); else ElemType s1,s

12、2; s1=q; s2=q-next; while(s2 & p-expn expn) /查找插入位置 s1=s2; s2=s2-next; if(s2 & p-expn = s2-expn) /若系数相同,则把它们的系数相加 s2-coef+=p-coef; free(p); if(!s2-coef) /若相加后系数为0,则释放结点 s1-next=s2-next; free(s2); else /若为新指数项则插入结点 p-next=s2; s1-next=p; Status CreatePolyn(ElemType &p,int n) /实现多项式的有序创建,将各项按幂的降序排列 if(

13、n next=NULL; for(i=0;icoef,&q-expn); Insert(q,p); /调用Insert函数 return OK; Status DestroyPolyn(ElemType p) /实现多项式的销毁 ElemType q1,q2; q1=p-next; q2=q1-next; while(q1-next) free(q1); q1=q2; q2=q2-next; return OK;void PrintPolyn(ElemType p) /实现多项式的输出 ElemType q=p-next; int count=1; /项数计数器 if(!q) /多项式为空 p

14、rintf(该多项式为空!n); while(q) if(q-coef0 & count!=1) /若该项的系数不为0且不是第一项 printf(+); if(q-coef!=1 & q-coef!=-1) /若该项的系数不为正负1 printf(%f,q-coef); if(q-expn=1) /若指数为1输出X printf(x); else if(q-expn) /若指数不为0 printf(x%d,q-expn); else if(q-coef=1) if(!q-expn) /若系数为1,指数为0 printf(1); else if(q-expn=1) /若系数为1,指数也为1 pr

15、intf(x); else printf(x%d,q-expn); if(q-coef=-1) if(!q-expn) /若系数为-1,指数为0 printf(-1); else if(q-expn=1) /若系数为-1,指数为1 printf(-x); else printf(-x%d,q-expn); q=q-next; count+; printf(n);int compare(ElemType a,ElemType b) /比较指数大小 if(a & b) if(a-expn b-expn) /a,b均不为空时,a的指数大于b的指数返回1 return 1; else if(a-exp

16、n expn) return -1; else return 0; else if(!a & b) /a为空b不为空时返回-1 return -1; else /b为空a不为空时返回1 return 1;ElemType AddPolyn(ElemType pa,ElemType pb) /实现两个多项式的加法,和按幂的降序排列 ElemType qa=pa-next; ElemType qb=pb-next; ElemType headc,hc,qc; hc=(ElemType)malloc(sizeof(LNode); /建立头结点 hc-next=NULL; headc=hc; /hea

17、dc=(ElemType)malloc(sizeof(LNode); while(qa | qb) qc=(ElemType)malloc(sizeof(LNode); switch(compare(qa,qb) /按幂降序将各项插入到qc中 case 1: qc-coef=qa-coef; qc-expn=qa-expn; qa=qa-next; break; case 0: qc-coef=qa-coef+qb-coef; qc-expn=qa-expn; qa=qa-next; qb=qb-next; break; case -1: qc-coef=qb-coef; qc-coef=qb

18、-coef; qb=qb-next; break; if(qc-coef!=0) /若该项系数不为0,则放到hc中 qc-next=hc-next; hc-next=qc; hc=qc; else /否则释放结点 free(qc); return headc;ElemType SubtractPolyn(ElemType pa,ElemType pb) /实现多项式的减法 ElemType h=pb; ElemType p=pb-next; ElemType pd; /pd=(ElemType)malloc(sizeof(LNode); while(p) /将pb的各项系数取相反数 p-coe

19、f*=-1; p=p-next; pd=AddPolyn(pa,h); /调用加法 for(p=h-next;p;p=p-next) /将pb还原 p-coef*=-1; return pd;float ValuePolyn(ElemType head,int x) /实现多项式的求值 ElemType p; int i; float sum=0,t; for(p=head-next;p;p=p-next) t=1; for(i=p-expn;i!=0;) if(icoef*t; /最后每项乘以系数,求和 return sum;ElemType Derivative(ElemType head

20、) /实现多项式的求导 ElemType q=head-next,p1,p2,hd; hd=p1=(ElemType)malloc(sizeof(LNode); /建立头结点 hd-next=NULL; while(q) if(q-expn!=0) /该项不是常数项时 p2=(ElemType)malloc(sizeof(LNode); p2-coef=q-coef*q-expn; p2-expn=q-expn-1; p2-next=p1-next; /连接结点 p1-next=p2; /p1=p2; q=q-next; return hd;ElemType MultiplyPolyn(Ele

21、mType pa,ElemType pb) /实现多项式乘法 ElemType hf,pf; ElemType qa=pa-next; ElemType qb=pb-next; hf=(ElemType)malloc(sizeof(LNode); hf-next=NULL; for(;qa;qa=qa-next) for(qb=qb-next;qb;qb=qb-next) pf=(ElemType)malloc(sizeof(LNode); pf-coef=qa-coef*qb-coef; /积的系数等于两系数相乘 pf-expn=qa-expn+qb-expn; /积的指数等于两指数之和 I

22、nsert(pf,hf); /调用Insert函数 return hf;void main() /int a; /int m,n,x; /*pa=(ElemType)malloc(sizeof(struct Polynomial); pb=(ElemType)malloc(sizeof(struct Polynomial); pc=(ElemType)malloc(sizeof(struct Polynomial); pd=(ElemType)malloc(sizeof(struct Polynomial);*/ char select; ElemType pa,pb,pc,pd; print

23、f(*n); printf(* 一元稀疏多项式运算器 *nn); printf(menu:n1: 创建多项式n2: 输出多项式n3: 多项式的加法运算n4: 多项式的减法运算n5: 多项式的乘法运算n6: 对多项式求导n7: 代入x求多项式的值n8: 退出程序n); printf(*n); while(1) printf(请选择您要进行的操作(18): n); scanf( %c,&select); switch(select) case 1: int m; printf(请输入多项式的项数: ); scanf(%d,&m); CreatePolyn(pa,m); printf(多项式创建成功

24、!n); break; /*printf(请输入b的项数: ); scanf(%d,&n); pb=CreatePolyn(pb,n); printf(是否继续操作(YN)?n); scanf(%c,ch); if(ch=N | n) break;*/ /break; case 2: printf(n 多项式a=); PrintPolyn(pa); break; case 3: int m,n; printf(请输入a的项数: ); scanf(%d,&m); CreatePolyn(pa,m); printf(n 多项式a=); PrintPolyn(pa); printf(请输入b的项数:

25、 ); scanf(%d,&n); CreatePolyn(pb,n); printf(n 多项式b=); PrintPolyn(pb); pc=AddPolyn(pa,pb); printf(n a+b=); PrintPolyn(pc); break; case 4: int m,n; printf(请输入a的项数: ); scanf(%d,&m); CreatePolyn(pa,m); printf(n 多项式a=); PrintPolyn(pa); printf(请输入b的项数: ); scanf(%d,&n); CreatePolyn(pb,n); printf(n 多项式b=); PrintPolyn(pb); pc=SubtractPolyn(pa,pb); printf(n a-b=); PrintPolyn(pc); break; case 5: pc=MultiplyPolyn(pa,pb); printf(n a*b=); PrintPolyn(pc); break; case 6: pc=Derivative(pa); printf(n 多项式a

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1