数据结构课程设计一元多项式的加法减法乘法的实现Word格式.docx
- 文档编号:16295392
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:25
- 大小:81.84KB
数据结构课程设计一元多项式的加法减法乘法的实现Word格式.docx
《数据结构课程设计一元多项式的加法减法乘法的实现Word格式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式的加法减法乘法的实现Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
摘要
分析了matlab,mathmatic,maple等数学软件对一元多项式的计算过程,步骤后。
由于这些软件比较大功能齐全,但是实用性不强。
因此,利用microsoftvisualstudio6.0开发工具,编程实现了一元多项式的加法、减法、乘法的计算器系统,该系统具有一元多项式的加法、减法、乘法等功能。
关键词:
一元多项式;
软件;
计算
1需求分析
动态链表结构下的一元多项式的加法、减法、乘法的实现。
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+…+Amxm
实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×
(1)输入形式和输入值范围:
输入的系数为float类型,输入的幂为int类型
请选择:
1
请输入你要运算的第一个一元多项式的项数:
2
请输入第1项的系数和指数:
系数:
指数:
请输入第2项的系数和指数:
(2)输出形式
5
一元多项式A为:
x+x^2
一元多项式B为:
4x^4+5x^5+6x^6
(3)程序所能达到的功能
首先判定多项式是否稀疏;
2)
采用动态存储结构实现;
(4)测试数据:
包括正确地输入及其输出结果和含有错误的输入及其输出结果。
正确的输入:
错误的输入:
输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式
2开发及运行平台
Windows7alienware平台上,MicrosoftVisualstudio6.0环境下开发。
所以建议用户在使用时,在windows7平台上使用。
3概要设计
数据类型的定义:
structNode
{
floatcoef;
//结点类型,系数
intexp;
//指数
};
typedefNodepolynomial;
structLNode
polynomialdata;
//链表类型
LNode*next;
typedefLNode*Link;
模块调用关系如图1所示:
图1一元多项式计算器模块调用图
4详细设计
加法模块:
voidPolyAdd(Link&
pc,Linkpa,Linkpb)
{
Linkp1,p2,p,pd;
CopyLink(p1,pa);
CopyLink(p2,pb);
pc=newLNode;
pc->
next<
-NULL;
p<
-pc;
p1<
-p1->
next;
p2<
-p2->
while(p1不为空且p2不为空)
{if(p1->
data.exp<
p2->
data.exp)
then:
p->
next=p1;
p=p->
p1=p1->
elseif(p1->
data.exp>
then:
-p2;
p<
-p->
else
{p1->
data.coef<
data.coef+p2->
data.coef;
//指数相同,系数想加
if(p1->
data.coef不等于0)
{p->
-p1;
p1<
p2<
}
{pd<
deletepd;
//如果系数为0,则删除该项
}}
}
if(p1!
=NULL)
p->
endif
if(p2!
then:
next=p2;
减法模块,如图2所示:
图2减法模块结构图
voidPolySubstract(Link&
Linkp,pt;
CopyLink(pt,pb);
-pt;
while(p不为空)
{(p->
data).coef<
-(-(p->
data).coef);
//被减的多项式前加"
-"
号
-(p->
next);
PolyAdd(pc,pa,pt);
//调用多项式加法运算函数
DestroyLink(pt);
乘法模块:
如图3所示
图3乘法模块结构图
voidPolyMultiply(Link&
{Linkp1,p2,p,pd,newp,t;
next=NULL;
p1=pa->
p2=pb->
while(p1不为空)
{pd=newLNode;
pd->
p=newLNode;
t=p;
while(p2)
{newp=newLNode;
newp->
data.coef=p1->
data.coef*p2->
//系数相乘
data.exp=p1->
data.exp+p2->
data.exp;
//指数相加
t->
next=newp;
t=t->
p2=p2->
PolyAdd(pd,pc,p);
//调用加法函数
CopyLink(pc,pd);
p2=pb->
DestroyLink(p);
DestroyLink(pd);
5调试分析
(1)调试过程中遇到的问题:
独立测试各个模块的功能时发现在创建链表后和另一个进行运算后多余的存储单元没有释放而造成内存的泄漏,还有对于链表的运算时结束条件掌握不透彻导致没有按计划地去结束,比如在用For循环及While循环时没有正确地判断指针的移动与结束条件而得不到自己想要的结果。
进入函数内部调试时发现有误用没有初始化的变量,还有赘余的语句扰乱了代码的健壮性。
在主函数中对各个函数的调用时没有一个清晰的思路,使程序显得很混乱,给调试造成了很大困难。
对非法操作控制的不够完善,例如缺少对越界访问及其非法数据的控制机制,使程序的安全性下降。
(2)算法的时空分析
该程序的实现是用链表实现的,所以时间复杂度和空间复杂度主要来自于链表的操作,都是O(n)。
(3)经验和体会
编写的程序不但要拿来使用,还要给别人查看,以便代码的维护。
所以代码编写的风格尽量规范,清晰。
变量要尽量少定义,结构夜采用简单的。
另外,对指针的使用要小心,尽量在定义的时候就进行初始化,避免野指针,指针的使用涉及到内存的分配。
6测试结果
判断稀疏,如图4所示:
图4判断多项式是否稀疏
加法运算,如图5所示:
图5加法测试结果
减法运算,如图6所示:
图6减法测试结果
乘法运算,如图7所示:
图7乘法测试结果
降幂升幂排序,如图8所示
图8降幂升幂排序测试结果
7结论
该程序基本实现了要求的顺序结构、动态链表结构下的一元多项式的加法、减法、乘法等功能。
代码较为冗余,可读性较差,可以多添加一些提示语句以及注释。
在这次课程设计中我又进一步地了解了数据结构中算法的核心思想的重要性,懂得了一个程序地好坏关键在于算法是否优秀,一个好的优秀的算法可以使我们的程序更加完善,安全性更高以及有更高的效率。
这次设计中我发现了自己的许多不足,如对指针的机制掌握的还不是很透彻,有的时候会出现指针指向错误以及空指针的错误,还有不能很好地分析自己算法地复杂度以及不能很好地使用控制机制使自己的程序流畅地运行。
致谢
感谢指导老师给我的一些重要指导以及提供的资料,感谢严蔚敏编著的数据结构等资料,让我在编写代码的过程中少走了很多弯路。
参考文献
[1]苏仕华等编著.数据结构课程设计.机械工业出版社.2007
[2]严蔚敏等编著.数据结构(C语言版).清华大学出版社.2003
[3]严蔚敏等编著.数据结构题集(C语言版).清华大学出版社,2003
[4].郑莉等编著.C++程序设计语言(第三版).清华大学出版社,2005.06北京
[5].陈清华朱红主编.VisualC++课程设计案例精选与编程指导.东南大学出版社,2003.06,南京
[6].刘振安等编著.C++程序设计课程设计.机械工业出版社,2004.08,北京
附录
附录1源程序清单
#include<
iostream>
//标准输入输出流
conio.h>
//使程序中可用键盘输入函数
stdlib.h>
//使程序中可用系统标准输出函数
math.h>
//调用数学库函数
usingnamespacestd;
//命名空间std内定义的所有标识符均有效
structNode{
structLNode{
voidCreateLink(Link&
L,intn);
voidPrintList(LinkL);
pc,Linkpa,Linkpb);
voidCopyLink(Link&
pc,Linkpa);
intJudgeIfExpSame(Linkpa,Linke);
voidDestroyLink(Link&
L);
intCompareIfNum(inti);
L)
{Linkp;
p=L->
while(p)
{L->
next=p->
deletep;
p=L->
deleteL;
L=NULL;
L,intn)
{if(L!
{DestroyLink(L);
Linkp,newp;
L=newLNode;
L->
(L->
data).exp=-1;
//创建头结点
p=L;
for(inti=1;
i<
=n;
i++)
{newp=newLNode;
cout<
<
"
请输入第"
项的系数和指数:
endl;
;
cin>
>
(newp->
data).coef;
data).exp;
if(newp->
0)
{cout<
您输入有误,指数不允许为负值!
deletenewp;
i--;
continue;
p=L;
data.coef==0)
系数为零,重新输入!
while((p->
next!
=NULL)&
&
((p->
next->
data).exp<
data).exp))
{p=p->
//p指向指数最小的那一个}
if(!
JudgeIfExpSame(L,newp))
{newp->
else
输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"
DestroyLink(L);
CreateLink(L,n);
//创建多项式没有成功,递归调用重新创建
break;
JudgeIf(L);
//判断稀疏
voidJudgeIf(LinkL)
intflag=0;
//判断是否为稀疏的标志
while(p->
{if(abs(p->
data.exp-p->
data.exp)>
1)
flag=1;
flag=0;
p=p->
if(flag)
cout<
该多项式是稀疏的哈"
else
该多项式是连续的哈"
intJudgeIfExpSame(LinkL,Linke)
while(p!
=NULL&
(e->
data.exp!
=p->
data.exp))
if(p==NULL)
return0;
elsereturn1;
voidPrintList(LinkL)
if(L==NULL||L->
next==NULL)
该一元多项式为空!
{p=L->
if((p->
data).coef>
{if((p->
data).exp==0)
(p->
//如果指数为0则直接输出系数
elseif((p->
data).coef==1&
data).exp==1)
x"
//如果系数和指数均为1,则输出x
data).exp!
=1)
x^"
data).exp==1&
data).coef!
elsecout<
//如果指数为0,则直接输出系数
elseif(p->
data.coef==-1&
data.exp==1)
-x"
//如果系数为-1,指数为1,则输出-x
-x^"
//如果指数为1,则输出系数倍x
while(p!
{if((p->
0)//系数大于0时输出情况
data).exp==0)
+"
=1)
data).coef==1)
0)//系数小于0时输出情况
pc,Linkpa)
{Linkp,q,r;
r=pc;
p=pa;
{q=newLNode;
q->
data.coef=p->
data.exp=p->
r->
next=q;
r=q;
{Linkp1,p2,p,pd;
p=pc;
p1=p1->
p2=p2->
while(p1!
p2!
{
data.coef!
=0)
{pd=p1;
{p->
{Linkp,pt;
p=pt;
data).coef=(-(p->
voidClear()
{system("
pause"
);
system("
cls"
}//让用户重新选择
{pd=newLNode;
{newp=newLNode;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 一元 多项式 加法 减法 乘法 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)