




免费预览已结束,剩余12页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.5一元稀疏多项式计算器实习报告一、 需求分析 1输入并建立多项式;2输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;3多项式a和b相加,建立多项式ab;4多项式a和b相减,建立多项式ab;5多项式a和b相乘,建立多项式ab;6计算多项式在x处的值;7求多项式P的导函数P;8.多项式的输出形式为类数学表达式;9.做出计算器的仿真界面;10. 测试数据:(1) (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)(2) (6x-3-x+4.4x2-1.2x9+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(5)(x+x100)+(x100+x200)=(x+2x100+x200)(6)(x+x2+x3)+0=x+x2+x3(7)互换上述测试数据中的前后两个多项式二、 概要设计1. 链表的抽象数据类型定义为:ADT LinkList 数据对象:D ai | aiElemSet, i=1,2,.,n, n0 数据关系:R1 |ai-1, aiD, i=2,.,n 基本操作: InitList(&L) 操作结果:构造一个空的线性表L。 DestroyList(&L) 初始条件:线性表L已存在。 操作结果:销毁线性表L。ClearList(*L) 初始条件:线性表L已存在。 操作结果:将线性表L重置为空表。 LocateElem(L, e, cmp() 初始条件:线性表L已存在,compare()是元素判定函数。 操作结果:返回L中第1个与e满足关系cmp()的元素的位序。 若这样的元素不存在,则返回值为0。 SetCurElem(&p, e) 初始条件:线性表L已存在,且非空。操作结果:用元数e更新p所指结点中元数的值。GetCurElem(p)初始条件:线性表L已存在,且非空。操作结果:返回p所指结点中数据元数的值。InsFirst (&L, h, s) 初始条件:线性表L已存在,h结点在L中。 操作结果:在L的s所指结点插入在h结点之后,L的长度加1。 DelFirst (&L, h, q) 初始条件:线性表L已存在且非空,q结点在L中且不是尾结点 操作结果:删除链表L中的h结点之后的结点q,L的长度减1。 MakeNode(&p, e)操作结果:创建了一个结点p,其data部分为e。FreeNode(&p)初始条件:结点p存在且非空。操作结果:释放结点p空间。Append(LinkList &L,Link s)初始条件:线性表L已存在。操作结果:s及s以后的结点链接到了原L之后,L的长度增加链上的结点数。ListEmpty(L)初始条件:线性表L已存在。操作结果:若线性链表L为空表,则返回TRUE,否则返回FALSE。GetHead(L)初始条件:线性表L已存在。操作结果:返回线性链表L中头结点的位置。NextPos(L, p)初始条件:线性表L已存在。操作结果:返回p所指结点的直接后继的位置,若没后继,则返回NULL。int cmp(a, b)初始条件:存在两个元数。操作结果:比较a,b的数值,分别返回-1,0,1。 ADT LinkList2.一元多项式的抽象数据类型定义为:ADT Polynomial数据对象:D ai | aiTermSet, i=1,2,.,m, m0 TermSet中的每个元素包含一个表示系数的实数和表示指数的整数数据关系:R1 |ai-1, aiD, 且ai-1中的指数值next=L.tail-next=NULL; return OK;/ 返回线性表L中头结点的位置。Position GetHead(LinkList &L);/已知p指向线性链表L中的一个结点,返回p所指结点的直接后驱的位置/若无后继,返回NULLPosition Nextpos(LinkList &L,Link p);/已知p指向线性表L中的一个结点,返回p所指结点中数据元素的值。ElemType GetCurElem(Link p);/已知p指向线性链表L中的一个结点,用e更新p所指结点中数据元素的值。Status SetCurElem(Link &p,float e); /已知h指向线性链表的某个结点,将q所指的结点插入在h之后。Status InsFirst(Link h,Link q); s-next=h-next; h-next=s; L.len+; if(!s-next) L.tail=s; return OK;/已知h指向线性链表的头结点,删除线性链表第一个指结点并以q返回Status DelFirst(Link h,Link &q);/若线性链表L为空,则返回TRUE,否则返回FALSE。Status ListEmpty(LinkList L); if(L.head=L.tail=NULL) return TRUE; else return FALSE;/将指针s所指的一连串结点连接在线性表L的最后一个结点之后,并改变链表L的尾指针指向新的尾结点。Status Append(polynomial &L,Link s); i=0; q=s; while(s) /找到新的tail,计数s长度 p=s; s=s-next; i+; L.tail-next=q; L.tail=p; L.len+=i; return OK;/判断已知链表中,是否存在相同的元素e,若存在返回TURE,且q指示L中第一个与e相同的结点元素;/否则返回FALSE,并q指示L中第一个稍大于e的元素的直接前驱的位置Status LocateElem(LinkList L,ElemType e,Position &q); p=L.head; while(p-next) s=p; p=p-next; m=p-data; if(cmp(e,m )=0) q=p; return TRUE; q=p; return FALSE;/整表删除void ClearList(LinkList &L); if(L.head!=L.tail) p=q=L.head-next; L.head-next=NULL; while(p!=L.tail) p=q-next; free(q); q=p; free(q); L.tail=L.head; L.len=0; return OK;/依a的指数值)b的指数数值,分别返回-1,0,+1int cmp(term a, term b) ; if(a.expnb.expn) return 1;3.基于多项式的操作(部分伪码如下)/输入m项的系数和指数,建立表示一元多项式的有序链表Pvoid CreatPolyn(polynomial &p,int m);InitList(p);h=GetHead(p);e.coef=0.0;e.expn=-1;SetCurElem(h,e);for(int i=1;i=m;i+) cout请输入第ie.coefe.expn; coutdata.coef+=e.coef; +c; m=m-c;/销毁一元多项式Pvoid DestroyPolyn(polynomial &p); while(p.head -next!=NULL) k=p.head; p.head =p.head -next; free(k); free(&p);/打印输出一元多项式Pvoid PrintPolyn(polynomial p);ha=GetHead(p);coutm, ; for(int i=1;i=m;i+) qa=NextPos(p,ha); e=GetCurElem(qa); coute.coef,e.expn, ; ha=qa; coutnext; hc=GetHead(Pc); while(qa) a=GetCurElem(qa); qb=GetHead(Pb); qb=qb-next; while(qb) b=GetCurElem(qb); c.coef=a.coef*b.coef; c.expn=a.expn+b.expn; MakeNode(qc,c); InsFirst(Pc,hc,qc); hc=NextPos(Pc,hc); qc=NextPos(Pc,qc); qb=qb-next; qa=qa-next; DestroyPolyn(Pb); ClearList(Pa); Pa.head=Pc.head; Pa.tail=Pc.tail; Pa.len=Pc.len;/计算多项式在x处的值double Evaluation(double x, polynomial p);/计算多项式P的导函数Pvoid Derivative( polynomial &p ); InitList(Pb); qa=GetHead(Pa); qa=qa-next; hb=GetHead(Pb); while(qa) a=GetCurElem(qa); b.coef=a.coef*a.expn; b.expn=a.expn-1; MakeNode(qb,b); InsFirst(Pb,hb,qb); hb=NextPos(Pb,hb); qb=NextPos(Pb,qb); qa=qa-next; qb=NULL; ClearList(Pa); Pa.head=Pb.head; Pa.tail=Pb.tail; Pa.len=Pb.len;4.主函数和其他函数的伪码算法int main() Initialization();ReadCommand(cmd);while (cmd != q & cmd != Q)Interpret(cmd);display();ReadCommand(cmd); return 0;void Initialization()pre_cmd = ;cmd = ;InitList(La);InitList(Lb);void display()system(cls); /清屏在屏幕上方显示操作命令清单:CreatePolynomial_a -1 CreatePolynomial_b -2 a+b - a-b a*b -* Derivation of a -d Calculate a in x -c Quit -q 在屏幕下方显示操作命令提示框:Enter a operation code(1,2,+,_,*,c,d OR q): ;void ReadCommand(char &cmd)/读入操作命令符 显示检入操作命令符的提示信息;dodisplay();cin cmd; while (!strchr(cmdsets, cmd);void Interpret(char cmd) /解释执行操作命令cmdswitch (cmd)case 1:ClearList(La);cout n; cout endl;CreatPolyn(La, n);/输入多项式SortPolyn(La);break;case 2:ClearList(Lb);cout endl m; cout endl;CreatPolyn(Lb, m);/输入多项式SortPolyn(Lb);break;case +:cout endl 两多项式相加的结果:;AddPolyn(La, Lb);PrintPolyn(La, La.len);Expression(La,La.len);getchar();getchar();break;case -:cout endl 两多项式相减的结果:;SubtractPolyn(La, Lb);PrintPolyn(La, La.len);Expression(La,La.len);getchar();getchar();break;case *:cout endl 两多项式相乘的结果:;MultiplyPolyn(La, Lb);PrintPolyn(La, La.len);Expression(La,La.len);getchar();getchar();break;case c:case C:cout 请输入x的值 x;cout 多项式a在 x 处的值为 CalPolyn(La, x);getchar();getchar();break;case d:case D:DerivPolyn(La);cout 求导结果为;PrintPolyn(La, La.len);Expression(La,La.len);getchar();getchar();default:cout 输入错误 endl; 5.函数的调用关系图反映了演示程序的层次结构四、 调试分析1. 一开始写求导部分代码时没有考虑常数项求导变零的情况,结果输出后常数项以系数为0指数为-1的形式输出,不符合规范。调试后加入if判断语句让常数项求导之后的结果不显示出来。2. 加减法操作出现多项式Pb若有几项的指数比Pa中任一项都小,则那几项在运算过后被漏掉的现象。调试后发现在把Pb剩余结点链接到Pa时出了问题,把Pb的数据链上去了之后没有把Pb的长度减掉,而且Pb的头指针也不见了,所以后面读取的时候会出错。修改了小函数Append以及加减法部分代码之后,解决了这个问题。3. 类数学表达式输出时会出现“1x”以及“x1”现象。通过加上if语句区别处理后解决的问题。4. 本程序的模块划分比较合理,且尽可能将指针的操作封装在结点和链表两个模块中,致使链表模块的调试比较顺利。5. 算法的时空分析(1) 由于链表采用带头结点的单链表,并增设尾指针和表的长
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新药研发新方向:2025年靶点发现与验证技术临床转化策略研究
- 5G时代2025年成人教育终身学习体系构建与智能平台运营前景报告
- 城市轨道交通智慧运维系统在2025年的运维人员技能提升报告
- 2025年事业单位工勤技能-河南-河南房管员三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-河南-河南仓库管理员一级(高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-河北-河北机械热加工三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏护理员三级(高级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏保安员三级(高级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西汽车修理工(技师/高级技师)历年参考题库含答案解析
- 2025年事业单位工勤技能-广西-广西无损探伤工一级(高级技师)历年参考题库典型考点含答案解析
- 2023《个人信息保护法》实务解读PPT
- 叠片机说明书
- 结核病筛查结果报告单
- GB/T 18051-2000潜油电泵振动试验方法
- 广告投放“冷启动期”及“ocpm起量”的底层逻辑
- 小学音乐《村晚》优质课件设计
- 竞选团支书幽默大气简短六篇
- 知名投资机构和投资人联系方式汇总
- (完整word版)教育部发布《3-6岁儿童学习与发展指南》(全文)
- 混凝土监理旁站记录
- 结肠息肉的护理查房精编ppt
评论
0/150
提交评论