您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > 数据结构课程设计报告一元稀疏多项式计算器
课程设计报告1.需求分析【问题描述】设计一个一元稀疏多项式简单计算器.【基本要求】一元稀疏多项式基本功能包括: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+5x8-3.1x11)+(11x9-5x8+7)=(-3.1x11+11x8+2x+7)2)(-1.2x9+6x-3+4.4x2-x)-(7.8x15+4.4x2-6x-3)=(-7.8x15-1.2x9+12x-3-x)3)(x5+x4+x3+x2+x+1)-(-x4-x3)=(x5+x2+x+1)4)(x3+x)-(-x3-x)=05)(x100+x)+(x200+x100)=(x200+2x100+x)6)(x3+x2+x)+0=x3+x2+x7)互换上述测试数据中的前后两个多项式.2.概要设计ADTPolynomial{数据对象:D={ai|aiTermSet,i=1,2,…,m,m≥0,TermSet中的每个元素包含一个表示系数的实数和表示指数的整数}数据对象:R1={ai,ai-1|ai,ai-1D,且ai-1中的指数值小于ai中的指数,i=2,…,m}基本操作:CreatePolyn(void)Result:指数由大到小输入m项的系数和指数,建立一元多项式pPrintPoly(LNodeHead)Result:输出一元多项式AddPoly(LNodeH1,LNodeH2)Condition:一元多项式pa,pb已存在Result:完成多项式相加运算,即pa=pa+pb,并销毁一元多项式pb.SubtractPoly(LNodeH1,LNodeH2)Condition:一元多项式pa,pb已存在Result:完成多项式相减运算,即pa=pa-pb,并销毁一元多项式pb.}ADTPolynomial3.详细设计【数据类型定义】typedefstructnode{intexpn,coef;structnode*next;}Nodetype,*LNode;//定义结点类型【函数原型定义】LNodeCreatePolyn(void);VoidPrintPoly(LNodeHead);LNodeAddPolyn(LNodeH1,LNodeH2);LNodeSubPolyn(LNodeH1,LNodeH2);【核心算法描述】CreatePolyn()LNodeCreatePolyn(void)//创建表达式{LNodeHead,p,pre,pree;intx,z;Head=(LNode)malloc(sizeof(Nodetype));Head-next=NULL;printf(当你输入的系数为0时,输入将结束!\n);printf(请输入第一项系数:);scanf(%d,&x);if(x==0){p=(LNode)malloc(sizeof(LNode));p-coef=0;p-expn=0;Head-next=p;p-next=NULL;}while(x!=0){printf(请输入指数:);scanf(%d,&z);p=(LNode)malloc(sizeof(Nodetype));p-coef=x;p-expn=z;pre=Head;while(pre-next&&pre-next-expn=z)//原有项指数大于插入项{pree=pre;pre=pre-next;}p-next=pre-next;//插入项pre-next=p;if(pre-expn==p-expn)//原有项指数等于插入项{pre-coef+=p-coef;pre-next=p-next;free(p);}if(pre-coef==0)//系数为0{pree-next=pre-next;free(pre);}printf(请输入系数:);scanf(%d,&x);}if(Head-next==NULL)//多项式空{pre=(LNode)malloc(sizeof(LNode));pre-coef=0;pre-expn=0;pre-next=Head-next;Head-next=pre;}returnHead;}PrintPolyn()voidPrintPolyn(LNodeHead)//输出表达式{LNodepre;pre=Head-next;if(pre-expn==0)//指数为0printf(%d,pre-coef);elseprintf(%d*X(%d),pre-coef,pre-expn);pre=pre-next;while(pre)//系数不为0{if(pre-expn==0)//指数为0{if(pre-coef0)printf(+%d,pre-coef);elseif(pre-coef0)printf(%d,pre-coef);}else//指数不为0{if(pre-coef0)printf(+%d*X(%d),pre-coef,pre-expn);elseif(pre-coef0)printf(%d*X(%d),pre-coef,pre-expn);}pre=pre-next;//遍历每一项}printf(\n);}AddPolyn()LNodeAddPolyn(LNodeH1,LNodeH2)//表达式相加{LNodeH3,p1,p2,p3,pre;//p1第一个多项式的项,prep的前一项H3=(LNode)malloc(sizeof(LNode));H3-next=NULL;//建立一个空的多项式p1=H1-next;//第一个多项式的第一项p2=H2-next;pre=H3;//while(p1&&p2){if(p1-expnp2-expn)//第一个多项式的项的指数大于第二个的{p3=(LNode)malloc(sizeof(LNode));p3-expn=p1-expn;p3-coef=p1-coef;p3-next=pre-next;pre-next=p3;pre=p3;p1=p1-next;}elseif(p1-expnp2-expn)//第一个多项式的项的指数小于第二个的{p3=(LNode)malloc(sizeof(LNode));p3-expn=p2-expn;p3-coef=p2-coef;p3-next=pre-next;pre-next=p3;pre=p3;p2=p2-next;}elseif(p1-coef+p2-coef!=0)//相加为不0,指数相同系数相加{p3=(LNode)malloc(sizeof(LNode));p3-expn=p1-expn;p3-coef=p1-coef+p2-coef;p3-next=pre-next;pre-next=p3;pre=p3;p1=p1-next;p2=p2-next;}else//相加为0{p1=p1-next;p2=p2-next;}}while(p2){p3=(LNode)malloc(sizeof(LNode));p3-expn=p2-expn;p3-coef=p2-coef;p3-next=pre-next;pre-next=p3;pre=p3;p2=p2-next;}while(p1){p3=(LNode)malloc(sizeof(LNode));p3-expn=p1-expn;p3-coef=p1-coef;p3-next=pre-next;pre-next=p3;pre=p3;p1=p1-next;}returnH3;}Substract()LNodeSubstractPolyn(LNodeH1,LNodeH2)//表达式相减{//让系数变负,代入加法LNodeH3,pre;pre=H2-next;while(pre){pre-coef=-pre-coef;pre=pre-next;}H3=AddPolyn(H1,H2);pre=H2-next;while(pre){pre-coef=-pre-coef;pre=pre-next;}returnH3;}【函数调用关系】main()调用CreatePoly(),PrintPoly(),AddPoly(),scanf()函数输入,printf()函数输出。4.运行记录5.总结首次做课程设计的题目,小激动,小紧张,编程的基础比较差,所以把第二章学习的内容仔仔细细的看完了一遍,但还不够,在老师问我问题时,我才发现我对next的理解出错了,对for语句也不太熟悉,所以找了好几个同学请教,终于理解多了一层,不容易啊。下次要是还有机会做课程设计的话,一定要给自己多些时间,来把程序研究透,这跟实习一样,对编程技能很有提高效果,在过程中碰到不理解或不熟悉的地方就会翻课本,找课件,查资料,也学会了一些以前很不熟悉的函数的使用与作用。
本文标题:数据结构课程设计报告一元稀疏多项式计算器
链接地址:https://www.777doc.com/doc-2398796 .html