数据结构 一元多项式.docx
《数据结构 一元多项式.docx》由会员分享,可在线阅读,更多相关《数据结构 一元多项式.docx(11页珍藏版)》请在冰豆网上搜索。
数据结构一元多项式
1需求分析
本程序“一元多项式运算”是以实现一元多项式的简单运算为目的的简单程序。
该程序要求
(1)输入并建立多项式;
(2)两个多项式相加;(3)输出多项式:
n,c1,e1,c2,e2,…cn,en,其中,n是多项式项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
(4)求多项式的导函数。
为实现程序的功能,可以用链表实现对数据的存储及处理。
软件的运行环境为Windowsxp平台下的VisualC++6.0。
硬件环境:
512MB内存,80Gb硬盘,Pentium4CPU,CRT显示器。
2概要设计
本程序有六个函数:
PolyNode*Input()(输入函数);PolyNode*Deri(PolyNode*head)(求导函数);PolyNode*Plus(PolyNode*A,PolyNode*B)(求和函数),voidOutput(PolyNode*head)(输出函数),intmain()(主函数)可使用带哟附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:
系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。
适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。
其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。
3详细设计和实现
图3.1.输入函数的流程图
图3.2相加函数的流程图
PolyNode*Input():
用于输入要处理的多项。
输入形式:
系数1指数1系数2指数2系数3指数3......00,系数和指数保存在同一接点,用next指针进行连接。
输入的同时进行降幂排序。
返回头指针给主函数,以便用于计算。
PolyNode*Deri(PolyNode*head):
用于对输入的多项式进行求导,求导在链表内进行计算,即运算完成链表的值改变,返回头指针。
PolyNode*Plus(PolyNode*A,PolyNode*B):
本函数用于对多项式进行加法计算,需要运用存有两个多项式的头指针,前一头指针可以是前一计算的计算结果,也可以是调用输入函数,后一头指针是调用输入函数输入的多项式的头接点。
经过计算得到一个新的链表,函数返回链表的头指针。
voidOutput(PolyNode*head):
本函数只是对运算结果的输出,输出用多项式的形式。
调用主函数给的头指针,进行输出。
voidmain():
主函数,其中包括菜单的输出,调用清屏函数,调用输入,输出和三个计算函数。
程序代码如下:
#include
#include
usingnamespacestd;
typedefstructnode
{
floatcoef;//系数
intexp;//指数
structnode*next;//指针域指向下一个系数不为0的子项
}PolyNode;
PolyNode*Input()//输入函数
{
floatc;//系数域
inte;//指数域
PolyNode*p,*q,*r,*head;
cout<<"请输入多项式:
\n";
cout<<"形式:
系数1指数1系数2指数2系数3指数3......00:
\n";
head=newPolyNode;//建立头接点
p=head;p->next=NULL;
for(;;)
{
cin>>c>>e;
if(c==0&&e==0)break;//结束输入
if(c==0)continue;//从新输入,不保存
if(head->next==NULL)//输入第一个接点
{
p->next=newPolyNode;
p=p->next;
p->coef=c,p->exp=e;
p->next=NULL;
continue;
}
p=head;
while(p->next!
=NULL&&e<=p->next->exp)p=p->next;//如果输入的指数小于p的下一个接点,p向后指
if(e==p->exp){p->coef+=c;continue;}//如果相等,直接加上去,继续循环
q=newPolyNode;
q->coef=c,q->exp=e;
if(p->next!
=NULL&&e>p->next->exp)//如果p的后继接点的指数小于输入的指数,插入到p的当前接点之后
{
r=p->next;
p->next=q;
q->next=r;
continue;
}
p->next=q;//如果输入的值小于所有接点,接在最后一个接点之后
p=p->next;p->next=NULL;
}
returnhead;
}
PolyNode*Deri(PolyNode*head)//求导
{
PolyNode*p=head;
while(p->next!
=NULL)
{
if(p->next->exp==0)p->next=NULL;
else
{
p->next->coef*=p->next->exp;
p->next->exp--;
p=p->next;
}
}
returnhead;
}
PolyNode*Plus(PolyNode*A,PolyNode*B)//相加
{
PolyNode*head,*p;
head=newPolyNode;
p=head;
A=A->next;
B=B->next;
while(A!
=NULL||B!
=NULL)
{
if(A==NULL){p->next=B;break;}//如果A空,把B后面的所有接点接到p之后
if(B==NULL){p->next=A;break;}//如果B空,把A后面的所有接点接到p之后
if(A->exp==B->exp)//如果两指数数相等,相加
{
if(A->coef+B->coef!
=0)
{p->next=newPolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef+B->coef;
}
A=A->next;
B=B->next;continue;//如果两系数互为倒数,不保存,后指,继续循环
}
if(A->exp>B->exp)
{
p->next=newPolyNode;
p=p->next;
p->exp=A->exp;
p->coef=A->coef;
A=A->next;continue;
}
p->next=newPolyNode;
p=p->next;
p->exp=B->exp;
p->coef=B->coef;
B=B->next;
}
if(A==NULL&&B==NULL)
p->next=NULL;
returnhead;
}
voidOutput(PolyNode*head)//输出
{
PolyNode*p;
p=head->next;
if(p==NULL){cout<<"当前没有公式或计算结果为0,请选1输入!
!
!
\n";return;}
if(p!
=NULL)
{
cout<<"计算结果:
\n";
cout<coef<<"X~"<exp;p=p->next;
}
while(p!
=NULL)
{
cout<<"+"<coef<<"X~"<exp;
p=p->next;
}
cout<cout<<"如果想重新输入公式,请选1输入!
!
!
\n\n";
}
intmain()
{
PolyNode*head_a,*head_b;
intchoice;
head_a=newPolyNode;head_a->next=NULL;
do
{
system("cls");//清屏函数
Output(head_a);
cout<<"______________________________\n";
cout<<"|---------1.输入公式-----------|\n";
cout<<"|---------2.求导-----------|\n";
cout<<"|---------3.两式求和-----------|\n";
cout<<"|---------5.退出程序-----------|\n";
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
cin>>choice;
if(choice==1)head_a=Input();
elseif(choice==2)head_a=Deri(head_a);//求导
elseif(choice==3){head_b=Input();head_a=Plus(head_a,head_b);}//求和
elseif(choice==5)break;
elsecout<<"输入错误,重新输入:
\n";
}
while(choice!
=5);
return0;
}
4调试与操作说明
运行程序时进入程序主界面:
图4.1程序的主界面
此时用户可以输入1—5按回车键进行选择。
1.输入“1”时会有以下提示:
图4.2输入公式的界面
此时按提示输入,例如:
56-88723-400回车
得到结果:
-8X~8+5X~6+7X~2+3X~-4
图4.3显示函数的界面
注意:
此处用户可以不用按降幂的顺序输入多项式,系统会自动为您排序,然后输出排序后的结果。
2.在此界面输入“2”会直接对多项式进行求导,然后输出结果。
如下图:
图4.4求导函数的界面
3.在此界面输入“3”时系统会提示再次输入一个多项式进行求和计算:
输出的结果和上图一样的形式。
4.输入“4”时和输入“3”时类似,计算结果以同样的方法输出。
5.此系统在得到计算结果后可以直接用计算的结果进行下一步计算,如果不想用当前的结果,也可按“1”重新输入公式进行下一步计算。
6.在提示下可以输入“5”+“回车”退出系统。
总结
这次数据结构实验我做的是一元多项式相加问题,刚开始做的时候感觉无从下手,在程序设计的过程中遇到了一些问题,经过老师和同学的指导和帮助,通过上网查资料和看书,终于顺利的解决了。
此次课程设计让我对c++有了更深刻的认识,同时也让我认识到自己对c++的掌握程度还是不够的,还需多加努力,我相信要学好C++不是一朝一夕就能成功的,那需要不懈的努力,冰冻三尺非一日之寒,我相信通过自己的努力能掌握好c++这门语言。
长风破浪会有时,直挂云帆济沧海。
致谢
一元多项式相加的课程设计终于完成了,在此我要感谢一些人,首先要感谢计算机工程系给我这次实践的机会,感谢计算机工程系给我们提供实验条件让我们能够无顾虑的用心做设计。
其次,当然要感谢此次课程设计的指导老师张亚红老师和张勇军老师,谢谢他们的帮助和指导,感谢帮助我的那些同学,感谢我的舍友在生活上对我的照顾和在精神上对我的支持。
最后要感谢互联网上的朋友们,谢谢你们无私的提供学习资料,感谢那些参与编写数据结构课程设计的编写组。
谢谢你们的无私帮助。
如果没有你们的帮助我不可能顺利的完成这次课程设计。
参考文献
殷人昆.数据结构(用面向对象的方法与C++语言描述).第二版,北京:
清华大学出版社,2008
张红霞.数据结构教程与实训.北京:
北京理工大学出版社,2006
揣锦华.面向对象程序设计与VC++实践.西安:
西安电子科技大学出版社,2006
吴乃陵,况迎辉.C++程序设计.北京:
高等教育出版社,2003
金远平.数据结构(C++描述).北京:
清华大学出版社,2005
目录
1需求分析1
2概要设计1
3详细设计和实现2
4调试与操作说明8
总结11
致谢12
参考文献13