数据结构课程设计一元多项式的加法减法乘法的实现.docx
《数据结构课程设计一元多项式的加法减法乘法的实现.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式的加法减法乘法的实现.docx(25页珍藏版)》请在冰豆网上搜索。
数据结构课程设计一元多项式的加法减法乘法的实现
一、设计题目
一元多项式的加法、减法、乘法的实现。
二、主要内容
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+…+Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+…+Bnxn
请实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
要求:
1) 首先判定多项式是否稀疏
2) 采用动态存储结构实现;
3) 结果M(x)中无重复阶项和无零系数项;
4) 要求输出结果的升幂和降幂两种排列情况
三、具体要求及应提交的材料
1.每个同学以自己的学号和姓名建一个文件夹,如:
“***************张三”。
里面应包括:
学生按照课程设计的具体要求所开发的所有源程序(应该放到一个文件夹中)、任务书和课程设计说明书的电子文档。
2.打印的课程设计说明书(注意:
在封面后夹入打印的“任务书”以后再装订)。
四、主要技术路线提示
为把多个小功能结合成一个完整的小软件,需使用“菜单设计”技术(可以是控制台方式下的命令行形式,若能做成图形方式则更好)。
五、进度安排
共计两周时间,建议进度安排如下:
选题,应该在上机实验之前完成
需求分析、概要设计可分配4学时完成
详细设计可分配4学时
调试和分析可分配10学时。
2学时的机动,可用于答辩及按教师要求修改课程设计说明书。
注:
只用课内上机时间一般不能完成设计任务,所以需要学生自行安排时间做补充。
六、推荐参考资料(不少于3篇)
[1]苏仕华等编著,数据结构课程设计,机械工业出版社,2007
[2]严蔚敏等编著,数据结构(C语言版),清华大学出版社,2003
[3]严蔚敏等编著,数据结构题集(C语言版),清华大学出版社,2003
指导教师签名日期年月日
系主任审核日期年月日
摘要
分析了matlab,mathmatic,maple等数学软件对一元多项式的计算过程,步骤后。
由于这些软件比较大功能齐全,但是实用性不强。
因此,利用microsoftvisualstudio6.0开发工具,编程实现了一元多项式的加法、减法、乘法的计算器系统,该系统具有一元多项式的加法、减法、乘法等功能。
关键词:
一元多项式;软件;计算
1需求分析
动态链表结构下的一元多项式的加法、减法、乘法的实现。
设有一元多项式Am(x)和Bn(x).
Am(x)=A0+A1x1+A2x2+A3x3+…+Amxm
Bn(x)=B0+B1x1+B2x2+B3x3+…+Bnxn
实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)和M(x)=Am(x)×Bn(x)。
(1)输入形式和输入值范围:
输入的系数为float类型,输入的幂为int类型
请选择:
1
请输入你要运算的第一个一元多项式的项数:
2
请输入第1项的系数和指数:
系数:
1
指数:
1
请输入第2项的系数和指数:
系数:
1
指数:
2
(2)输出形式
请选择:
5
一元多项式A为:
x+x^2
一元多项式B为:
4x^4+5x^5+6x^6
(3)程序所能达到的功能
1) 首先判定多项式是否稀疏;
2) 采用动态存储结构实现;
3) 结果M(x)中无重复阶项和无零系数项;
4) 要求输出结果的升幂和降幂两种排列情况
(4)测试数据:
包括正确地输入及其输出结果和含有错误的输入及其输出结果。
正确的输入:
请选择:
5
一元多项式A为:
x+x^2
一元多项式B为:
4x^4+5x^5+6x^6
错误的输入:
请输入第1项的系数和指数:
系数:
1
指数:
1
请输入第2项的系数和指数:
系数:
2
指数:
1
输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式
请输入第1项的系数和指数:
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->next;
while(p1不为空且p2不为空)
{if(p1->data.expdata.exp)
then:
p->next=p1;p=p->next;p1=p1->next;
elseif(p1->data.exp>p2->data.exp)
then:
p->next<-p2;p<-p->next;p2<-p2->next;
else
{p1->data.coef<-p1->data.coef+p2->data.coef;//指数相同,系数想加
if(p1->data.coef不等于0)
{p->next<-p1;
p<-p->next;
p1<-p1->next;
p2<-p2->next;
}
else
{pd<-p1;
p1<-p1->next;
p2<-p2->next;
deletepd;//如果系数为0,则删除该项
}}
}
if(p1!
=NULL)
then:
p->next=p1;endif
if(p2!
=NULL)
then:
p->next=p2;endif
}
减法模块,如图2所示:
图2减法模块结构图
voidPolySubstract(Link&pc,Linkpa,Linkpb)
{
Linkp,pt;
CopyLink(pt,pb);
p<-pt;
while(p不为空)
{(p->data).coef<-(-(p->data).coef);//被减的多项式前加"-"号
p<-(p->next);
}
PolyAdd(pc,pa,pt);//调用多项式加法运算函数
DestroyLink(pt);
}
乘法模块:
如图3所示
图3乘法模块结构图
voidPolyMultiply(Link&pc,Linkpa,Linkpb)
{Linkp1,p2,p,pd,newp,t;
pc=newLNode;
pc->next=NULL;
p1=pa->next;
p2=pb->next;
while(p1不为空)
{pd=newLNode;
pd->next=NULL;
p=newLNode;
p->next=NULL;
t=p;
while(p2)
{newp=newLNode;
newp->next=NULL;
newp->data.coef=p1->data.coef*p2->data.coef;//系数相乘
newp->data.exp=p1->data.exp+p2->data.exp;//指数相加
t->next=newp;
t=t->next;
p2=p2->next;
}
PolyAdd(pd,pc,p);//调用加法函数
CopyLink(pc,pd);
p1=p1->next;
p2=pb->next;
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//标准输入输出流
#include//使程序中可用键盘输入函数
#include//使程序中可用系统标准输出函数
#include//调用数学库函数
usingnamespacestd;//命名空间std内定义的所有标识符均有效
structNode{
floatcoef;//结点类型,系数
intexp;//指数
};
typedefNodepolynomial;
structLNode{
polynomialdata;//链表类型
LNode*next;
};
typedefLNode*Link;
voidCreateLink(Link&L,intn);
voidPrintList(LinkL);
voidPolyAdd(Link&pc,Linkpa,Linkpb);
voidPolySubstract(Link&pc,Linkpa,Linkpb);
voidCopyLink(Link&pc,Linkpa);
voidPolyMultiply(Link&pc,Linkpa,Linkpb);
intJudgeIfExpSame(Linkpa,Linke);
voidDestroyLink(Link&L);
intCompareIfNum(inti);
voidDestroyLink(Link&L)
{Linkp;
p=L->next;
while(p)
{L->next=p->next;
deletep;
p=L->next;
}
deleteL;
L=NULL;
}
voidCreateLink(Link&L,intn)
{if(L!
=NULL)
{DestroyLink(L);}
Linkp,newp;
L=newLNode;
L->next=NULL;
(L->data).exp=-1;//创建头结点
p=L;
for(inti=1;i<=n;i++)
{newp=newLNode;
cout<<"请输入第"<
"<cout<<"系数:
";
cin>>(newp->data).coef;
cout<<"指数:
";
cin>>(newp->data).exp;
if(newp->data.exp<0)
{cout<<"您输入有误,指数不允许为负值!
"<deletenewp;
i--;
continue;
}
newp->next=NULL;
p=L;
if(newp->data.coef==0)
{cout<<"系数为零,重新输入!
"<deletenewp;
i--;
continue;
}
while((p->next!
=NULL)&&((p->next->data).exp<(newp->data).exp))
{p=p->next;//p指向指数最小的那一个}
if(!
JudgeIfExpSame(L,newp))
{newp->next=p->next;
p->next=newp;
}
else
{cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<deletenewp;
DestroyLink(L);
CreateLink(L,n);//创建多项式没有成功,递归调用重新创建
break;
}
}
JudgeIf(L);//判断稀疏
}
voidJudgeIf(LinkL)
{Linkp;
intflag=0;//判断是否为稀疏的标志
p=L->next;
while(p->next!
=NULL)
{if(abs(p->next->data.exp-p->data.exp)>1)
flag=1;
else
flag=0;
p=p->next;
}
if(flag)
cout<<"该多项式是稀疏的哈"<else
cout<<"该多项式是连续的哈"<}
intJudgeIfExpSame(LinkL,Linke)
{Linkp;
p=L->next;
while(p!
=NULL&&(e->data.exp!
=p->data.exp))
p=p->next;
if(p==NULL)
return0;
elsereturn1;
}
voidPrintList(LinkL)
{Linkp;
if(L==NULL||L->next==NULL)
cout<<"该一元多项式为空!
"<else
{p=L->next;
if((p->data).coef>0)
{if((p->data).exp==0)
cout<<(p->data).coef;//如果指数为0则直接输出系数
elseif((p->data).coef==1&&(p->data).exp==1)
cout<<"x";//如果系数和指数均为1,则输出x
elseif((p->data).coef==1&&(p->data).exp!
=1)
cout<<"x^"<<(p->data).exp;
elseif((p->data).exp==1&&(p->data).coef!
=1)
cout<<(p->data).coef<<"x";
elsecout<<(p->data).coef<<"x^"<<(p->data).exp;
}
if((p->data).coef<0)
{if((p->data).exp==0)
cout<<(p->data).coef;//如果指数为0,则直接输出系数
elseif(p->data.coef==-1&&p->data.exp==1)
cout<<"-x";//如果系数为-1,指数为1,则输出-x
elseif(p->data.coef==-1&&p->data.exp!
=1)
cout<<"-x^"<data.exp;
elseif(p->data.exp==1)
cout<data.coef<<"x";//如果指数为1,则输出系数倍x
elsecout<<(p->data).coef<<"x^"<<(p->data).exp;
}
p=p->next;
while(p!
=NULL)
{if((p->data).coef>0)//系数大于0时输出情况
{if((p->data).exp==0)
cout<<"+"<<(p->data).coef;
elseif((p->data).exp==1&&(p->data).coef!
=1)
cout<<"+"<<(p->data).coef<<"x";
elseif((p->data).exp==1&&(p->data).coef==1)
cout<<"+"<<"x";
elseif((p->data).coef==1&&(p->data).exp!
=1)
cout<<"+"<<"x^"<<(p->data).exp;
elsecout<<"+"<<(p->data).coef<<"x^"<<(p->data).exp;
}
if((p->data).coef<0)//系数小于0时输出情况
{if((p->data).exp==0)
cout<<(p->data).coef;
elseif(p->data.coef==-1&&p->data.exp==1)
cout<<"-x";
elseif(p->data.coef==-1&&p->data.exp!
=1)
cout<<"-x^"<data.exp;
elseif(p->data.exp==1)
cout<data.coef<<"x";
elsecout<<(p->data).coef<<"x^"<<(p->data).exp;
}
p=p->next;
}
}
cout<}
voidCopyLink(Link&pc,Linkpa)
{Linkp,q,r;
pc=newLNode;
pc->next=NULL;
r=pc;
p=pa;
while(p->next!
=NULL)
{q=newLNode;
q->data.coef=p->next->data.coef;
q->data.exp=p->next->data.exp;
r->next=q;
q->next=NULL;
r=q;
p=p->next;}
}
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->next;
while(p1!
=NULL&&p2!
=NULL)
{if(p1->data.expdata.exp)
{
p->next=p1;
p=p->next;
p1=p1->next;
}
elseif(p1->data.exp>p2->data.exp)
{
p->next=p2;
p=p->next;
p2=p2->next;
}
else
{p1->data.coef=p1->data.coef+p2->data.coef;
if(p1->data.coef!
=0)
{
p->next=p1;
p=p->next;
p1=p1->next;
p2=p2->next;
}
else
{pd=p1;
p1=p1->next;
p2=p2->next;
deletepd;//如果系数为0,则删除该项
}
}
}
if(p1!
=NULL)
{p->next=p1;}
if(p2!
=NULL)
{p->next=p2;}
}
voidPolySubstract(Link&pc,Linkpa,Linkpb)
{Linkp,pt;
CopyLink(pt,pb);
p=pt;
while(p!
=NULL)
{(p->data).coef=(-(p->data).coef);//被减的多项式前加"-"号
p=p->next;
}
PolyAdd(pc,pa,pt);//调用多项式加法运算函数
DestroyLink(pt);
}
voidClear()
{system("pause");
system("cls");
}//让用户重新选择
voidPolyMultiply(Link&pc,Linkpa,Linkpb)
{Linkp1,p2,p,pd,newp,t;
pc=newLNode;
pc->next=NULL;
p1=pa->next;
p2=pb->next;
while(p1!
=NULL)
{pd=newLNode;
pd->next=NULL;
p=newLNode;
p->next=NULL;
t=p;
while(p2)
{newp=newLNode;
newp->next=NULL;
newp->data.coef=p1->data.coef*p2->data.coef;//系数相乘
newp->data.exp=p1->