多项式Word文档下载推荐.docx
《多项式Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多项式Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
实现两个多项式的减法
ValuePolyn(head,x)
对多项式求值
Derivative(head)
一元多项式head已经存在
对多项式求导
Derivative(pa,pb)
实现两个多项式的乘法
DestroyPolyn(p)
一元多项式p已存在
将一元多项式销毁
PrintPolyn(p)
打印出一元多项式p
}ADTPolyn
2、本程序包含2个模块
a、主函数模块
voidmain(){
创建多项式;
选择操作;
执行运算;
输出结果;
销毁多项式;
}
b、链表模块——实现链表的抽象数据类型
各模块之间的调用如下:
主函数模块
链表模块
三、详细设计
1、结点类型和部分数据定义
typedefstructLNode//存储结构定义
{
floatcoef;
//系数
intexpn;
//指数
structLNode*next;
}*ElemType,LNode;
2、主函数和其他函数的算法分析
voidInsert(ElemTypep,ElemTypeq);
//插入函数,将q插入到p中,用于创建多项式时,实现创建的多项式按降幂//排列
StatusCreatePolyn(ElemType&
p,intn);
//实现多项式的有序创建,调用Insert函数,将各项按幂的降序排列
//n<
=0,返回ERROR;
n>
0,返回OK
StatusDestroyPolyn(ElemTypep);
//实现多项式的销毁,销毁成功返回OK
voidPrintPolyn(ElemTypep)
//实现多项式的输出
intcompare(ElemTypea,ElemTypeb);
//比较两项指数大小,若a的指数大于b的指数,返回1;
若a的指数小于
//b的指数,返回-1;
若a的指数等于b的指数,返回0
ElemTypeAddPolyn(ElemTypepa,ElemTypepb);
//实现两个多项式的加法,创建一个新的多项式,依次比较pa,pb的各项指数
//调用compare函数插入到新多项式中
ElemTypeSubtractPolyn(ElemTypepa,ElemTypepb);
//实现两个多项式的减法,将pb的各项系数取相反数,然后再与pa进行加法
floatValuePolyn(ElemTypehead,intx);
//实现多项式的求值,输入一个x,逐项将其值代入,若该项指数为负,则
//除以x,将指数加1,循环,直到x为0;
否则,乘以x,将指数减1,循
//环,直到x值为0
ElemTypeDerivative(ElemTypehead);
//实现多项式的求导,该项为常数项时,将该项删除,否则,将系数与指数
//相乘作系数,指数减1作指数
ElemTypeMultiplyPolyn(ElemTypepa,ElemTypepb);
//实现多项式的乘法,积的系数等于两系数相乘,积的指数等于两系数之和
//调用Insert函数
四、调试分析
1、在该程序的早期版本中,由于缺乏调试技术,源程序中没有明确对尾指针的指向,曾多次出现内存分配错误,后均通过调试改正。
这是我对调试技术有了进一步了解。
2、函数的时空分析
1)虽然该程序在输入时对输入的顺序并未作硬性要求,但create函数中附加了排序和合并同类项的功能,这样能大大减小后面的加减法的排序次数。
同时在每个函数的排序操作中,均设置了两个指针,一个指向当前结点,另一个指向他的前继结点,这样能方便地在两个指针之间进行插入操作。
create函数中的时间复杂度最大为O((n-1)*n/2),Insert1、Insert2函数中的时间复杂度最大为O(m+n)(其中,p为n项,q为m项,插入操作是将q插入p中)。
2)在create函数中,插入操作中除新开辟的头节点和第一个结点外,其他皆为原链表中的结点,因此空间复杂度为O(8*(m+2)),Insert1、Insert2函数中的空间复杂度最大为O(8*(m+n))(其中,p为n项,q为m项,插入操作是将q插入p中)。
3、在求解合并后多项式项数中,该程序引用了一个全局变量,使项数的求解变得很简单,不需用一个函数来实现。
4、本次程序采用抽象数据类型来实现,使每一个模块的功能变得非常清晰,且模块之间的调用关系也非常明朗。
这样的程序设计方法使编程者的思路非常清晰,同时便于对各个模块进行单独调试,非常方便。
通过本次试验作业,我确实得到了一次良好的程序设计训练。
五、用户手册
1、本程序的运行环境为DOS操作系统,执行文件为:
一元稀疏多项式.exe。
2、进入演示程序后即显示文本方式的用户界面:
3、看到“请选择您要进行的操作(1~8):
”提示后,依次输入一项的系数和指数,按回车键结束。
4、接受其他命令后即执行相应运算和显示相应结果,在此不再一一演示。
六、测试结果
测试数据1:
多项式1:
2,15,8-3.1,11
多项式2:
7,0-5,811,9
运算方式:
加法
结果:
测试数据2:
多项式1:
:
6,-3-1,14.4,2-1.2,9
-6,-35.4,2-1,27.8,15
减法
附录
源程序:
#include<
stdio.h>
malloc.h>
stdlib.h>
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineOVERFLOW-1
floatcoef;
intexpn;
structLNode*next;
typedefintStatus;
//typedeftermElemType;
voidInsert(ElemTypep,ElemTypeq)//插入函数,将各项按幂的降序排列
if(p->
coef==0)//若系数为0释放结点
free(p);
else
{
ElemTypes1,s2;
s1=q;
s2=q->
next;
while(s2&
&
p->
expn<
s2->
expn)//查找插入位置
{
s1=s2;
s2=s2->
}
if(s2&
expn==s2->
expn)//若系数相同,则把它们的系数相加
s2->
coef+=p->
coef;
free(p);
if(!
s2->
coef)//若相加后系数为0,则释放结点
{
s1->
next=s2->
free(s2);
}
else//若为新指数项则插入结点
p->
next=s2;
s1->
next=p;
}
p,intn)//实现多项式的有序创建,将各项按幂的降序排列
if(n<
=0)
returnERROR;
inti;
ElemTypeq;
q=p=(ElemType)malloc(sizeof(LNode));
p->
next=NULL;
for(i=0;
i<
n;
i++)//循环输入各项
q=(ElemType)malloc(sizeof(LNode));
//建立新结点
printf("
请输入第%d项的系数与指数:
"
i+1);
scanf("
%f%d"
&
q->
coef,&
expn);
Insert(q,p);
returnOK;
StatusDestroyPolyn(ElemTypep)//实现多项式的销毁
ElemTypeq1,q2;
q1=p->
q2=q1->
while(q1->
next)
free(q1);
q1=q2;
q2=q2->
voidPrintPolyn(ElemTypep)//实现多项式的输出
ElemTypeq=p->
intcount=1;
//项数计数器
if(!
q)//多项式为空
printf("
该多项式为空!
\n"
);
while(q)
if(q->
coef>
0&
count!
=1)//若该项的系数不为0且不是第一项
printf("
+"
coef!
=1&
q->
=-1)//若该项的系数不为正负1
%f"
q->
coef);
if(q->
expn==1)//若指数为1输出X
printf("
x"
elseif(q->
expn)//若指数不为0
x^%d"
else
coef==1)
if(!
expn)//若系数为1,指数为0
printf("
1"
elseif(q->
expn==1)//若系数为1,指数也为1
else
coef==-1)
expn)//若系数为-1,指数为0
-1"
expn==1)//若系数为-1,指数为1
-x"
else
-x^%d"
q=q->
count++;
intcompare(ElemTypea,ElemTypeb)//比较指数大小
if(a&
b)
if(a->
expn>
b->
expn)//a,b均不为空时,a的指数大于b的指数返回1
return1;
elseif(a->
expn)
return-1;
else
return0;
elseif(!
a&
b)//a为空b不为空时返回-1
return-1;
else//b为空a不为空时返回1
return1;
ElemTypeAddPolyn(ElemTypepa,ElemTypepb)//实现两个多项式的加法,和按幂的降序排列
ElemTypeqa=pa->
ElemTypeqb=pb->
ElemTypeheadc,hc,qc;
hc=(ElemType)malloc(sizeof(LNode));
//建立头结点
hc->
headc=hc;
//headc=(ElemType)malloc(sizeof(LNode));
while(qa||qb)
qc=(ElemType)malloc(sizeof(LNode));
switch(compare(qa,qb))//按幂降序将各项插入到qc中
case1:
qc->
coef=qa->
expn=qa->
expn;
qa=qa->
break;
case0:
coef+qb->
qb=qb->
case-1:
coef=qb->
if(qc->
=0)//若该项系数不为0,则放到hc中
qc->
next=hc->
hc->
next=qc;
hc=qc;
else//否则释放结点
free(qc);
returnheadc;
ElemTypeSubtractPolyn(ElemTypepa,ElemTypepb)//实现多项式的减法
ElemTypeh=pb;
ElemTypep=pb->
ElemTypepd;
//pd=(ElemType)malloc(sizeof(LNode));
while(p)//将pb的各项系数取相反数
coef*=-1;
p=p->
pd=AddPolyn(pa,h);
//调用加法
for(p=h->
p;
p=p->
next)//将pb还原
returnpd;
floatValuePolyn(ElemTypehead,intx)//实现多项式的求值
ElemTypep;
floatsum=0,t;
for(p=head->
t=1;
for(i=p->
i!
=0;
)
if(i<
0)//若指数为负,则除以x,直到指数为0
t/=x;
i++;
else//若指数为非负,则乘以x,直到指数为0
t*=x;
i--;
sum+=p->
coef*t;
//最后每项乘以系数,求和
returnsum;
ElemTypeDerivative(ElemTypehead)//实现多项式的求导
ElemTypeq=head->
next,p1,p2,hd;
hd=p1=(ElemType)malloc(sizeof(LNode));
hd->
expn!
=0)//该项不是常数项时
p2=(ElemType)malloc(sizeof(LNode));
p2->
coef=q->
coef*q->
expn=q->
expn-1;
next=p1->
//连接结点
p1->
next=p2;
//p1=p2;
returnhd;
ElemTypeMultiplyPolyn(ElemTypepa,ElemTypepb)//实现多项式乘法
ElemTypehf,pf;
hf=(ElemType)malloc(sizeof(LNode));
hf->
for(;
qa;
qa=qa->
for(qb=qb->
qb;
qb=qb->
pf=(ElemType)malloc(sizeof(LNode));
pf->
coef*qb->
//积的系数等于两系数相乘
expn+qb->
//积的指数等于两指数之和
Insert(pf,hf);
returnhf;
voidmain()
//inta;
//intm,n,x;
/*pa=(ElemType)malloc(sizeof(structPolynomial));
pb=(ElemType)malloc(sizeof(structPolynomial));
pc=(ElemType)malloc(sizeof(structPolynomial));
pd=(ElemType)malloc(sizeof(structPolynomial));
*/
charselect;
ElemTypepa,pb,pc,pd;
***********************************************************\n"
**一元稀疏多项式运算器**\n\n"
menu:
\n1:
创建多项式\n2:
输出多项式\n3:
多项式的加法运算\n4:
多项式的减法运算\n5:
多项式的乘法运算\n6:
对多项式求导\n7:
代入x求多项式的值\n8:
退出程序\n"
while
(1)
请选择您要进行的操作(1~8):
\n"
scanf("
%c"
select);
switch(select)
case'
1'
:
intm;
请输入多项式的项数:
scanf("
%d"
m);
CreatePolyn(pa,m);
多项式创建成功!
break;
/*printf("
请输入b的项数:
n);
pb=CreatePolyn(pb,n);
是否继续操作(Y\N)?
%c"
ch);
if(ch=='
N'
||'
n'
*/
//break;
2'
\n多项式a="
PrintPolyn(pa);
break;
3'
intm,n;
请输入a的项数:
CreatePolyn(pb,n);
\n多项式b="
PrintPolyn(pb);
pc=AddPolyn(pa,pb);
\na+b="
PrintPolyn(pc);
4'
pc=SubtractPolyn(pa,pb);
\na-b="
5'
pc=MultiplyPolyn(pa,pb);
\na*b="
6'
pc=Derivative(pa);
\n多项式a