数据结构课程设计一元多项式.docx
《数据结构课程设计一元多项式.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计一元多项式.docx(18页珍藏版)》请在冰豆网上搜索。
数据结构课程设计一元多项式
长沙学院
课程设计说明书
题目
一元多项式运算
系(部)
计算机科学与技术系
专业(班级)
软件工程6班
姓名
邹胤屏
学号
2010022615
指导教师
魏歌
起止日期
2011.09.06-2011.09.16
课程设计任务书
课程名称:
数据结构与算法
设计题目:
一元多项式计算问题
已知技术参数和设计要求:
问题描述:
设计一个稀疏多项式简单计算器
基本要求:
(1)输入并分别建立多项式A和B
(2)输入输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2……,其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数降序排列
(3)完成两个多项式的相加、相减,并将结果输出;
测试数据:
(1)A+BA=3x14-8x8+6x2+2B=2x10+4x8+-6x2
(2)A-BA=11x14+3x10+2x8+10x6+5B=2x14+3x8+5x6+7
(3)A+BA=x3+x1B=-x3-x1
(4)A+BA=0B=x7+x5+x3+x1
(5)A-BA=100x100+50x50+20x20+xB=10x100+10x50+10x20+x
选作内容:
(1).多项式在x=1时的运算结果
(2)求多项式A和B的乘积
设计工作量:
40课时
工作计划:
见课表
指导教师签名:
日期:
教研室主任签名:
日期:
系主任签名:
日期:
长沙学院课程设计鉴定表
姓名
邹胤屏
学号
2010022615
专业
软件工程
班级
六班
设计题目
图书预定系统
指导教师
付细楚
指导教师意见:
评定等级:
教师签名:
日期:
答辩小组意见:
评定等级:
答辩小组长签名:
日期:
教研室意见:
教研室主任签名:
日期:
系(部)意见:
系主任签名:
日期:
说明
课程设计成绩分“优秀”、“良好”、“及格”、“不及格”四类;
摘要
这是我第一次接触关于数据结构的程序设计,这一次有三个可选择,而我选择了一元多次项式的计算器来作为我这次的任务。
输入多个或一个多项式后,一元多项式有两两进行相加、相减、相乘,还有把它按次幂的升或降进行排列输出。
我做的主界面很普通,按0-4来选择这些功能,如果选择没有在这个范围了,你就可以是否重新选择。
这次主要运用了链表存储结构,这样可以很方便的计算一元多项式的基本运算。
这次设计还用到了
C++和C语言的相关知识,在主函数中可以通过调用来完成运算。
关键字:
数据结构、C++、C语言、链表、一元多项式运算
目录
第1章需求分析····························································6
1.1问题描述·····························································6
1.2基本要求·····························································6
1.3测试数据····························································6
1.4选作内容····························································6
第2章系统分析···························································7
2.1功能模板设计························································7
2.1.1多项式创建··························································7
2.1.2主菜单······························································7
2.2编码································································8
第3章.运行效果图·························································9
3.1创建多项式A..B··················································9
3.2主菜单···························································9
3.3输出多项式AB··················································10
3.4多项式A+B······················································10
3.5多项式A-B······················································10
3.6多项式在X处的值···············································10
3.7退出···························································10
总结······································································11
参考文献·································································12
附录A源程代码···························································13
第1章.需求分析
1.1问题描述:
设计一个稀疏多项式简单计算器
1.2基本要求:
(1)输入并分别建立多项式A和B。
(2)输入输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2……,
其中n是多项式的项数,ci和ei是第i项的系数和指数,序列按指数降序排列。
(3)完成两个多项式的相加、相减,并将结果输出。
1.3测试数据:
(1)A+BA=3x14-8x8+6x2+2;
B=2x10+4x8-6x2
(2)A-BA=11x14+3x10+2x8+10x6+5;
B=2x14+3x8+5x6+7
(3)A+BA=x3+x1;B=-x3-x1
(4)A+BA=0;B=x7+x5+x3+x1
(5)A-BA=100x100+50x50+20x20+x;
B=10x100+10x50+10x20+x
1.4选作内容:
(1)多项式在x=1时的运算结果;
(2)求多项式A和B的乘积
第二章.系统分析
2.1功能模块设计
2.1.1多项式创建
文字说明:
先输入多项式的项数,再用for循环把多项式的系数和指数一一输入,在输入的时候调用voidInsert(node*p,node*h)来进行排序(降幂)并且把相同的项数合并。
2.1.2主菜单
文字说明:
如图所示,选择0-4来操作系统功能.
2.2编码
//A*B时
while(s->next)//系数取反
{
s->coef*=(-1);
s=s->next;
}
//创建多项式中相同次幂时合并
if(!
q2->coef)//系数为0的话释放结点
{
q1->next=q2->next;
delete[]q2;
}
}
else
{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
第三章.运行效果图
图3.1创建多项式A..B
图3.2主菜单
图3.3输出多项式A..B
图3.4多项式A+B图3.5多项式A-B
图3..6多项式在X处的值图3.7退出
总结
这一次课程设计我从一开始就没有用心去做,一想到网上有,我就没有了原来做这个的心了,其实一开始我也是从网上搞了这样的一篇下来,但老师说不可以,我又重新做,我做了好久都没有做出来,后来我又把我的书,网上下载的资料看,就这样我又学到了不少知识,如果我没有去查找相应的资料有话,我是做不出来的。
也因为如此,我体会了到了凡事要自己动手,不劳而获的东西永远都不是自己的,只有经过自己的努力得到的才会属于自己。
这一次让我更加了解了链表,以前不会在输入时排序的,通过这次我了解了。
希望我能在这一次后能个更上一层楼,不再想着从别个地方来不劳而获,加油。
参考文献
[1]王挺,周会平,贾丽丽,徐锡山.C++程序设计[M].北京:
清华大学出版社
[2]严蔚敏,吴伟民,数据结构(C语言版)北京:
清华大学出版社
[3]李跟强,倪飞舟,钟志水,郭清溥数据结构(C++版)(第二版)习题解答用实训指导中国水利水电出版社
附录A源程代码
#include
structnode
{
intcoef;//系数
intexpn;//指数
node*next;
};
//
voidInsert(node*p,node*h)
{
if(p->coef==0)
delete[]p;//系数为0的话释放结点
else{
node*q1;node*q2;
q1=h;q2=h->next;
while(q2&&p->expnexpn)//查找插入位置
{
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)//将指数相同相合并
{
q2->coef+=p->coef;
delete[]p;
if(!
q2->coef)//系数为0的话释放结点
{
q1->next=q2->next;
delete[]q2;
}
}
else
{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
//建立一个头指针为head、项数为m的一元多项式
node*createlist(node*head)
{
inti;intm;
node*p;
p=head=newnode;
head->next=NULL;
cout<<"请输入多项式的项数:
";
cin>>m;
cout<for(i=0;i{
p=newnode;//建立新结点以接收数据
cout<<"请输入第"<
"<cin>>p->coef;
cin>>p->expn;
Insert(p,head);//调用Insert函数插入结点
}
returnhead;
}
voidoutprintlist(node*head)//输出多项式链表
{
node*cur=head->next->next;
cout<next->coef<<"X^"<next->expn;
while(cur)
{
if((cur->coef)>0)
{
cout<<"+";
if((cur->expn!
=0)&&(cur->expn!
=1))
cout<coef<<"X^"<expn;
elseif(cur->expn==0)
cout<coef;
else
cout<coef<<"X";
}
if(cur->coef<0)
{
if((cur->expn!
=0)&&(cur->expn!
=1))
cout<coef<<"X^"<expn;
elseif(cur->expn==0)
cout<coef;
else
cout<coef<<"X";
}
cur=cur->next;
}
cout<}
intcompare(node*q1,node*q2)
{
if(q1&&q2)
{
if(!
q1||q1->expn>q2->expn)
return1;
else
if(!
q1||q1->expnexpn)
return-1;
else
return0;
}
else
if(!
q1&&q2)
return-1;//q1多项式已空,但q2多项式非空
else
return1;//q2多项式已空,但q1多项式非空
}
//多项式的加法A+B
node*addlist(node*q1,node*q2)
{
q1=q1->next;
q2=q2->next;
node*head,*tail,*temp;
tail=newnode;
tail->next=NULL;
head=tail;
while(q1||q2)
{
temp=newnode;
switch(compare(q1,q2))
{
case1:
{
temp->coef=q1->coef;
temp->expn=q1->expn;
q1=q1->next;
break;
}
case0:
{
temp->coef=(q1->coef)+(q2->coef);
temp->expn=q1->expn;
q1=q1->next;
q2=q2->next;
break;
}
case-1:
{
temp->coef=q2->coef;
temp->expn=q2->expn;
q2=q2->next;
break;
}
}
if(temp->coef==0)
delete[]temp;
else
{
temp->next=tail->next;
tail->next=temp;
tail=temp;
}
}
returnhead;
}
//多项式的减法A-B
node*Subtractlist(node*q1,node*q2)
{
node*s=q2;
node*s1;
if(s==NULL)
{
cout<<"这个多项式空的。
\n";
returnNULL;
}
else
{
while(s->next)//系数取反
{
s->coef*=(-1);
s=s->next;
}
}
s1=addlist(q1,s);
returns1;
}
//输入x值,计算并返回多项式的值
floatValuelist(node*head,floatx)
{
node*p;
inti;
floatsum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!
=0;)
{
if(i<0){t/=x;i++;}//指数小于0,进行除法
else
{
t*=x;i--;
}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
returnsum;
}//ValuePolyn
intmain()
{
intflag=0,g=0;
floatx;
node*A=NULL,*B=NULL,*pc,*pd,*pe;//定义各式的头指针,pa与pb在使用前付初值NULL
cout<cout<<"建立多项式A\n";cout<A=createlist(A);//建立多项式A
cout<<"建立多项式B."<B=createlist(B);//建立多项式B
//输出菜单
cout<<"*****************一元多项式的运算*******************"<cout<<"**"<cout<<"*----------------------------操作提示---------------------------*"<cout<<"**"<cout<<"*------------------------0.退出功能系统-------------------------------*"<cout<<"**"<cout<<"*1.输出多项式A和B*"<cout<<"*2.建立多项式A+B*"<cout<<"*3.建立多项式A-B*"<cout<<"**"<cout<<"*------------------------4.计算多项式A在x处的值-----------------*"<cout<<"**"<cout<<"*****************一元多项式的运算*********************"<while(g==0)
{
cout<<"请选择操作功能:
";
cin>>flag;
cout<switch(flag)
{
case1:
{
cout<<"多项式A:
"<cout<<"多项式B:
"<cout<break;
}
case2:
{
pc=addlist(A,B);
cout<<"多项式A+B:
"<outprintlist(pc);
cout<break;
}
case3:
{
pd=Subtractlist(A,B);
cout<<"多项式A-B:
"<outprintlist(pd);
cout<break;
}
case4:
{
cout<<"输入x的值:
x=";
cin>>x;
cout<<"输入x的值后多项式A的值是:
";
cout<cout<break;
}
}
if(flag==0)
{
break;
cout<}
if(flag<0||flag>4)
{
inti=0;
cout<cout<<"!
!
!
!
!
你输入的操作有错噢!
!
!
!
!
"<cout<<"----------------------------"<cout<<"*******重新输入*****---1"<cout<<"******不重新输入****---0"<cout<<"----------------------------"<cout<<"请选择:
"<cin>>i;
cout<if(i==1)
g=0;
else
g=1;
cout<}
}
return0;
}