一元多项式的表示及其运算的研究与实现.docx
- 文档编号:11037651
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:30
- 大小:155.92KB
一元多项式的表示及其运算的研究与实现.docx
《一元多项式的表示及其运算的研究与实现.docx》由会员分享,可在线阅读,更多相关《一元多项式的表示及其运算的研究与实现.docx(30页珍藏版)》请在冰豆网上搜索。
一元多项式的表示及其运算的研究与实现
一元多项式的表示及其运算的研究与实现
学生姓名:
蒋浩钧指导老师:
乐晓波
摘要一元多项式计算是用C语言设计一个一元多项式简单计算器。
它能够实现按指数降序排列建立并输出多项式,并且能够完成两个多项式的相加,想减的运算和将其结果输入的功能。
体会链式存存储结构的优缺点和适用性。
了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技提高综合运用所学的理论知识和方法独立分析和解决问题的能力;加深对常用数据结构的理解,强化学生的逻辑思维能力和动手能力,巩固良好的编程习惯,掌握工程软件设计的基本方法,为后续课程的学习打下坚实基础。
关键词C语言;一元多项式;链式存存储结构;指数降序排列
目录
1前言--------------------------------------------3
1.1课程设计目的-----------------------------------31.2需求分析----------------------------------------3
2概要设计----------------------------------------4
2.1一元多项式的数学模型------------------------------4
2.2一元多项式数据结构的构造----------------------------------4
2.3系统结构与功能模块流程图----------------------------------5
3详细设计----------------------------------------7
3.1一元多项式的建立-----------------------------7
3.2一元多项式的显示------------------------------8
3.3一元多项式的加法运算-------------------------9
3.4一元多项式的减法运算-------------------------12
5.5一元多项式的乘法运算-------------------------14
3.6帮助----------------------------------------16
4调试及运行结果-----------------------------------------175设计体会与总结------------------------------------------19
5.1设计体会------------------------------------------19
5.2总结--------------------------------------------20参考文献-----------------------------------------20附录:
源程序---------------------------------------------21
1前言
一元多项式算法程序的数据结构是选择用带头结点的单链表存储多项式。
虽然一元多项式可以用顺序和链式两种存储结果表示,但顺序结构的最大长度很难确定。
比如当多项式的系数较大时,此时就会浪费巨大的存储空间,所以应该选择用链式存储结构来存储一元多项式。
单链表[1]的结构体可以用来存储多项式的系数,指数,下一个指针3个元素,这样便于实现任意多项式的加法,减法运算。
掌握一元多项式的表示的基本思想,完成一元多项式表示的基本结构的定义,并对相关算法进行分析与设计,实现一元多项式的基本操作(包括一元多项式的输入与输出、一元多项式的加法等基本操作)的相关算法的编码、调试、测试等工作。
1.1课程设计目的
(1)通过实际项目的分析、设计、编码、测试等工作,体会数据结构在软件工程中的重要作用,并初步学会用C语言(或VC++、VB、JAVA等程序设计语言)开发和维护软件的基本方法。
掌握算法的编写方法。
(2)按要求撰写课程设计报告书,并能正确编写分析、设计、编码、测试等技术文档。
掌握类C语言的算法转换成C程序并上机调试的基本方法。
(3)设计一个C语言程序,该程序具有能够按照指数降序排列建立并输出多项式,完成两个多项式的相加、相减、相乘,并将结果输入的功能。
1.2需要分析
一元多项式算法程序主要从技术的角度来分析可行性。
技术上的可行性研究主要分析技术条件能否顺利完成开发工作,硬、软件能否满足开发者的需要等。
该系统采用了WindowsXP操作系统结合VisualC++6.0、TC2.0等软件开发平台已成熟可行。
硬件方面,科技飞速发展的今天,硬件更新的速度越来越快,容量越来越大,可靠性越来越高,其硬件平台也比较能满足此系统的需要。
此外,还有经济可行性,用户使用可行性,法律可行性等可行性研究,这里从简省去。
(1)能够按照多项式变量的指数降序创建一个多项式;
(2)能够对已创建的多项式进行显示;
(3)能够对已创建的多项式之间的加法运算;
(4)能够对已创建的多项式之间的减法运算;
(5)能够对已创建的多项式进行删除;
(6)能够实现计算器退出操作。
2概要设计
程序为了实现了多项式的创建、多项式的加法、减法、乘法运算以及多项式的清除。
为完成这些功能,还用到了一些辅助函数。
2.1一元多项式的数学模型
设计一个n元多项式程序,并完成多项式的乘法运算。
从实际的角度出发,这里设计的程序是基于一元n次多项式的数学模型[2]。
在数学上,一个一元多项式Pn(x)可按升幂写成:
Pn(x)=a0+a1x+a2x^2+…+anx^n-1.它由n+1个系数惟一确定,因此,在计算机里,它可用一个线性表P来表示:
Pn=(a0,a1,a2,…,an)每一项的指数i隐含在其系数ai的序号里。
多项式的乘法规则:
多次运用单项式与多项式相乘的法则得到的。
计算时(a+b)(m+n),先把(m+n)看成一个单项式,(a+b)是一个多项式,运用单项式与多项式相乘的法则,得到(a+b)(m+n)=a(m+n)+b(m+n),然后再次运用单项式与多项式相乘的法则。
2.2一元多项式数据结构的构造
通过分析多项式的特征,不难看出多项式是由单项式构成的,而每个单项式都具有系数和指数,当系数为0时,该项就失去了意义,在计算机内要表示一个多项式,至少以下数据信息:
系数信息、指数信息和指向下一个单项式的指针。
通过指针[3],我们就可以把多个单项式连接起来,形式一个多项式,需要说明的是从广义的角度讲,单项式也是一个多项式。
基于以上的分析,我们定义多项式的数据结构为如下结构体形式。
typedefstructPolynomial{
floatcoef;//系数
intexpn;//指数
structPolynomial*next;//指向下一个结点
}*Polyn,Polynomial;//Polyn为结点指针类型
该多项式程序除了main()函数外,主要有以下函数。
voidInsert(Polynp,Polynh)
PolynCreatePolyn(Polynhead,intm)
voidDestroyPolyn(Polynp)
voidPrintPolyn(PolynP)
intcompare(Polyna,Polynb)
PolynAddPolyn(Polynpa,Polynpb)
PolynSubtractPolyn(Polynpa,Polynpb)
PolynMultiplyPolyn(Polynpa,Polynpb)
2.3系统结构与功能模块流程图
从实现一元多项式运算过程的角度来分析,至少需要这样一些子功能模块。
(1)多项式创建功能;
(2)多项式运算功能;
(3)操作界面显示功能;
(4)销毁多项式的功能;
(5)多项式复制功能等。
系统的整体流程和主要功能模块如图2-1所示。
3详细设计
main函数[4]用来实现提示使用者输入、显示功能列表、调用其他运算函数实现运算功能。
在main()函数中,定义m、n用来保存两个多项式的项数,pa、pb、pc、pd、pf定义程序所需链表的头指针。
在程序开始要求输入两个多项式的项数,随后根据项数创建两个链表以保存多项式,再显示出功能列表后通过if语句来实现功能的选择,从而对整个程序流程进行控制,来进行一元多项式的输入与输出、一元多项式的加法、减法等基本操作的相关算法[5]的设计。
3.1一元多项式的建立
输入一元多项式采用头插入法的方式,插入多项式中一个项的系数和指数,就产生一个新的节点,建立起它的右指针,并用头结点指向他;为了判断一个多项式是否输入结束,定义一个结束标志,当输入非0时久继续,当输入0时,就结束一个多项式的输入,其具体算法设计如下。
算法:
pnode*creat()
{
intm;floatn;pnode*head,*rear,*s;
head=(pnode*)malloc(sizeof(pnode));
rear=head;
printf("inputcoef:
");
scanf("%f",&n);
printf("inputexp:
");
scanf("%d",&m);
while(n!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=n;
s->exp=m;
s->next=NULL;
rear->next=s;
rear=s;printf("inputcoef:
");
scanf("%f",&n);
printf("inputexp:
");
scanf("%d",&m);
}
head=head->next;
returnhead;
}
3.2一个多项式的显示
如果系数是大于0的话就输出+系数x^指数的形式;如果系数是小于0的话就输出系数x^指数的形式;如果系数为0的话,就直接输出系数;如果系数是1的话就直接输出+x;如果系数是-1的话就直接输出-x,其具体算法设计如下。
算法:
voiddisplay(pnode*head)
{
pnode*p;intone_time=1;p=head;
while(p!
=NULL)
{
if(one_time==1)
{if(p->exp==0)
printf("%f",p->coef);
elseif(p->coef==1||p->coef==-1)
printf("x^%d",p->exp);
elseif(p->coef>0)
printf("%fx^%d",p->coef,p->exp);
elseif(p->coef<0)
printf("%fx^%d",p->coef,p->exp);
one_time=0;
}
else{
if(p->exp==0)
{if(p->coef>0)
printf("+%f",p->coef);
}
elseif(p->coef==1)
printf("+x^%d",p->exp);
elseif(p->coef==-1)
printf("x^%d",p->exp);
elseif(p->coef>0)
printf("+%fx^%d",p->coef,p->exp);
elseif(p->coef<0)
printf("%fx^%d",p->coef,p->exp);
}
p=p->next;
}
printf("\n");
}
3.3一元多项式的加法运算
它从两个多项式的头部开始,两个多项式的某一项不为空时,如果指数相等的话,系数就相加,相加的和不为0的话,用头插法建立一个新的节点。
P的指数小于q的指数的话,就应该复制q节点到多项式中。
P指数大于q指数的话,就应该复制p节点到多项式中。
当第二个多项式空第一个不为空时,将第一个多项式用新节点产生。
当第一个多项式空,第二个不为空时,将第二个多项式用新节点产生,其具体算法设计如下。
算法:
pnode*add(pnode*heada,pnode*headb)
{pnode*headc,*p,*q,*s,*r;
floatx;
p=heada;q=headb;
headc=(pnode*)malloc(sizeof(pnode));
r=headc;
while(p!
=NULL&&q!
=NULL)
{if(p->exp==q->exp)
{x=p->coef+q->coef;
if(x!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
}
elseif(p->exp
{s=(pnode*)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
else
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
}
while(p!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=q->coef;
s->exp=q->exp;
r->next=s;
r=s;
p=p->next;
}
r->next=NULL;
headc=headc->next;
returnheadc;
}
3.4一元多项式的减法运算
它从两个多项式的头部开始,两个多项式的某一项不为空时,如果指数相等的话,系数就相减,相减的差不为0的话,用头插法建立一个新的节点。
P的指数小于q的指数的话,就应该复制q节点到多项式中。
P指数大于q指数的话,就应该复制p节点到多项式中,并且建立的节点的系数为原来的相反数。
当第二个多项式空第一个不为空时,将第一个多项式用新节点产生。
当第一个多项式空,第二个不为空时,将第二个多项式用新节点产生,并且建立的节点的系数为原来的相反数,其具体算法设计如下。
算法:
pnode*sub(pnode*heada,pnode*headb)
{
pnode*headc,*p,*q,*s,*r;
floatx;
p=heada;q=headb;
headc=(pnode*)malloc(sizeof(pnode));
r=headc;
while(p!
=NULL&&q!
=NULL)
{if(p->exp==q->exp)
{x=p->coef-q->coef;
if(x!
=0)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=x;
s->exp=p->exp;
r->next=s;
r=s;
}
q=q->next;p=p->next;
}
elseif(p->exp
{s=(pnode*)malloc(sizeof(pnode));
s->coef=-q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
else
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
}
while(p!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=p->coef;
s->exp=p->exp;
r->next=s;
r=s;
p=p->next;
}
while(q!
=NULL)
{s=(pnode*)malloc(sizeof(pnode));
s->coef=-q->coef;
s->exp=q->exp;
r->next=s;
r=s;
q=q->next;
}
r->next=NULL;
headc=headc->next;
returnheadc;
}
3.5一元多项式的乘法运算
PolynAddPolyn(Polynpa,Polynpb)该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。
其计算的结果存放在新建的pc所指向的链表中。
函数中调用了intcompare(Polyna,Polynb)的结果。
下面是实现加法的关键代码,其具体算法设计如下。
算法:
PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynqa=pa->next;
Polynqb=pb->next;
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(compare(qa,qb)){
case1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case-1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}//switch
if(qc->coef!
=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
elsefree(qc);//当相加系数为0时,释放该结点
}//while
returnheadc;
}//AddPolyn
intcompare(Polyna,Polynb){
if(a&&b){
if(!
b||a->expn>b->expn)return1;
elseif(!
a||a->expn
elsereturn0;
}
elseif(!
a&&b)return-1;//a多项式已空,但b多项式非空
elsereturn1;//b多项式已空,但a多项式非空
}//compare
3.6帮助
为了方便程序的运行,本算法设计提供了正确的多项式的输入方法,以及程序中多项式的表示方法。
算法:
voidhelp()
{
printf("************帮助***********\n");
printf("1.输入时只输入多项式的系数与指数(00表示结束)\n");
printf("2.请按指数升幂形式输入.\n");
printf("3.例如输入\"112200\"表示\"1*X^1+2*X^2\"\n");
}
4调试及运行结果
通过以上数据对程序的测试分析可知,本程序较好的完成了题目的要求,能够完成两个多项式的排序,求值,相加,相减,相乘,并将结果输出。
但在设计该算法时出现了一些问题,例如在建立链表时头指针的设立导致了之后运用到相关的指针时没能很好的移动指针,不能实现算法。
为了是输入的数据按指数降序排列,可在数据的输入后做一个节点的排序函数,通过对链表排序后在进行之后加减乘运算。
该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确,以下几图即为该程序运行结果效果图。
程序成功运行后的情况如图4-1所示。
图4-1程序成功运行选项图
此时可以选择输入的数字:
0代表退出程序;1代表两个多项式相加;2代表两个多项式想减;3代表提供帮助。
按1后,输入“452300”和“651400”表示多项式4x^5+2x^3和6x^5+x^4,程序可实现多项式相加,其运行情况如4-2图所示。
图4-2程序实现多项式相加运算图
按2后,输入“452300”和“951300”表示多项式4x^5+2x^3和9x^5+x^3,程序可实现多项式相减,其运行情况如4-3图所示。
图4-3程序实现多项式相减运算图
按3后,程序可实现帮助,其运行情况如4-4图所示。
图4-4程序实现帮助图
对多项式4x^5+2x^2+3x和x^10+7x^2的加减乘三种运算进行演示,其运行情况如图4-5所示。
图4-5程序实现多项式加减乘三种运算图
5设计体会与总结
5.1设计体会
这次的课程设计是通过用我们我们所学过的带有头结点的单链表的数据结构为基础建立一元多项式。
在进一步设计一个一元多项式简单计数器。
该计数器能够按照指数降序排序建立并输出多项式,并且能够完成两个多项式的相加,相减,并输出结果。
通过这次课程设计,我了解C语言这门课的重要性,我们一定要学好C语言。
C语言功能强,使用灵活,可移植性好,目标程序质量好,它既有高级程序语言的优点,又有低级程序的许多特点,既可以用来编写系统软件,又可以用来编写应用软件,而且C语言语法限制不严格,程序设计自由度大。
所以我们要学会正确的使用C语言编程,而《数据结构》学的怎么样直接影响到我们对其它专业课的学习和今后业务的成长。
我觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤东手,多实践。
通过这次课程设计使我得到了充分的锻炼,并使自己得到了较大的提高。
在编程的过程中善于发现程序中的错误,并且能很快地排除这些错误,使程序能正常运行。
经验丰富的人,当编译时出现“出错信息”时,能够很快地判断出错所在,并改正之。
而缺乏经验的人即使在明确的出错提示下也往往找不出错误而求救于他人。
调试程序的过程只能“会意”难以“言传”。
因此在试验时千万不要再程序通过后就觉得万事大吉,完成了任务,而应当在已通过的程序基础上做一些改动,在进行编译,连接和运行。
通过这次课程设计练习,使我更深刻地理解了C语言的精髓-----指针的使用。
完成整个程序设计有,对指针掌握的更加熟练。
同时通过直接对链表的操作,加深了对数据结构的理解和认识。
并在完
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 表示 及其 运算 研究 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)