多项式的加法乘法源代码.docx
《多项式的加法乘法源代码.docx》由会员分享,可在线阅读,更多相关《多项式的加法乘法源代码.docx(16页珍藏版)》请在冰豆网上搜索。
多项式的加法乘法源代码
1,按要求输入一元多项式的系数
2,计算一元多项式的加法
3,输出计算结果
4,按要求输入一元多项式的系数
5,计算一元多项式的乘法
6,输出计算结果
7,退出
五、程序流程图
1,加法运算
2,乘法运算
六、源程序
#include
#include
#include
#defineNULL0
typedefstructNode{//定义结构体类型
floatcoef;//系数
intexpn;//指数
structNode*next;//结构体指针
}Node,*Linklist;
structpolynode
{
intc;
inte;
structpolynode*next;
};
structpolynode*creat(void)
{
intc,e;
structpolynode*head=NULL;
structpolynode*p1,*p2,*l,*r;
while(scanf("%d,%d%*c",&c,&e),c||e)
{
p2=(structpolynode*)malloc(sizeof(structpolynode));
p2->c=c;
p2->e=e;
p2->next=NULL;
if(head==NULL)
{head=p2;continue;}
for(l=r=head;l!
=NULL&&(l->e)next)r=l;
if(l==head&&l->e>e)head=p2;
elser->next=p2;
p2->next=l;
}
returnhead;
}
voidoutput(structpolynode*head)
{
structpolynode*p1;
p1=head;
if(p1==NULL)
{printf("\nmultinomialiszero\n");return;}
printf("\n");
while(p1!
=NULL)
{
printf(p1!
=head&&(p1->c)>0?
"+%d":
"%d",p1->c);
printf(p1->e?
"x^%d":
"",p1->e);
p1=p1->next;
}
printf("\n");
}
structpolynode*add(structpolynode*head1,structpolynode*head2)
{
structpolynode*p1,*p2,*r,*l,*h;
h=r=p1=head1;
p2=head2;
if(head1==NULL)
{h=head2;returnh;}
while(p1!
=NULL&&p2!
=NULL)
{
if(p1->e==p2->e)
{
p1->c+=p2->c;
p2=p2->next;
r=p1;
p1=p1->next;
continue;
}
if(p1->ee)
{
r=p1;
p1=p1->next;
continue;
}
if(p1->e>p2->e)
{
l=p2;
p2=p2->next;
if(p1==h)h=l;
elser->next=l;
l->next=p1;
r=l;
continue;
}
}
if(p1==NULL)r->next=p2;
returnh;
}
structpolynode*mul(structpolynode*head1,structpolynode*head2)
{
structpolynode*p,*p1,*p2,*r,*t,*head;
head=NULL;
if(head1==NULL||head2==NULL)returnhead;
for(p2=head2;p2!
=NULL;p2=p2->next)
{
for(p1=head1;p1!
=NULL;p1=p1->next)
{
p=(structpolynode*)malloc(sizeof(structpolynode));
p->c=p1->c*p2->c;
p->e=p1->e+p2->e;
p->next=NULL;
if(p1==head1)t=p;
elser->next=p;
r=p;
}
head=add(head,t);
}
//output(head);
returnhead;
}
Linklistcreatpolyn(LinklistL,intn){//构造新的一元多项式
inti;
Linklisthead,p;
head=(Linklist)malloc(sizeof(Node));//创建头结点
head->next=NULL;
L=head;
for(i=n;i>0;i--){
p=(Linklist)malloc(sizeof(Node));
printf("请输入一元多项式的第%d项的系数和指数:
",i);
scanf("%f%d",&(*p).coef,&(*p).expn);//输入系数和指数
p->next=L->next;
L->next=p;
}
return(head);//返回头结点
}//creatpolyn
intcmp(inta,intb){//比较a,b的大小
if(a>b)
return
(1);
else
if(a==b)
return(0);
else
return(-1);
}
voidprint(LinklistL){//显示一元多项式
Linklistp;
p=L->next;
while(p->next!
=NULL){
printf("%f*x^%d+",(*p).coef,(*p).expn);//输出多项式的项
p=p->next;
}
printf("%f*x^%d\n",(*p).coef,(*p).expn);//输出多项式最后一项
}//Print
LinklistAddpolyn(Linklistpa,Linklistpb){//多项式相加
inta,b;
floatsum;
Linklistha,hb,qa,qb,p1,p2;
ha=pa;//ha,hb分别指向pa和pb中当前结点
hb=pb;
qa=ha->next;//qa和qb分别指向pa和pb中当前结点
qb=hb->next;
while(qa!
=NULL&&qb!
=NULL){//qa和qb均非空
a=(*qa).expn;
b=(*qb).expn;
switch(cmp(a,b)){//比较指数
case-1:
{//a
ha->next=qa;
ha=ha->next;
qa=qa->next;break;}
case0:
{//a=b
sum=(*qa).coef+(*qb).coef;
if(sum!
=0.0){
(*qa).coef=sum;
ha->next=qa;
ha=ha->next;
}
else{
p1=qa;
free(p1);
}
p2=qb;
qa=qa->next;
qb=qb->next;
free(p2);
break;}
case1:
{//a>b
ha->next=qb;
ha=ha->next;
qb=qb->next;
break;}
}//switch
}//while
while(qa!
=NULL){//如果qb不为空
ha->next=qa;
ha=ha->next;
qa=qa->next;
}
while(qb!
=NULL){//如果qb不为空
ha->next=qb;
ha=ha->next;
qb=qb->next;
}
return(pa);
}//Addpolyn
voidmain()
{
intm,n,i;
chart;
Linklistpa,pb;
pa=(Linklist)malloc(sizeof(Node));
pb=(Linklist)malloc(sizeof(Node));
printf("请输入一元多项式pa的项数:
\n");//构造一元多项式pa
scanf("%d",&m);
pa=creatpolyn(pa,m);
printf("请输入一元多项式pb的项数:
\n");//构造一元多项式pb
scanf("%d",&n);
pb=creatpolyn(pb,n);
printf("多项式pa为:
");//输出pa
print(pa);
printf("多项式pb为:
");//输出pb
print(pb);
printf("多项式pa与pb的和为:
");//输出多项式pa和pb的和
print(Addpolyn(pa,pb));
structpolynode*head1=NULL,*head2=NULL,*head=NULL;
logn:
printf("请输入需要相乘的多项式个数,至少2个:
");
scanf("%d%c",&n);
printf("\n输入一个多项式的方式为:
系数,指数;例如:
3,4;5,6;7,8;as0,0;结束\n");
printf("\n请输入第1个多项式的系数和指数:
");
head1=creat();
printf("\n第1个多项式的为:
");
output(head1);
for(i=1;i{
printf("\n请输入第%d个多项式的系数和指数:
",i+1);
head2=creat();
printf("\n第%d个多项式为:
",i+1);
output(head2);
if(i==1)head=mul(head1,head2);
elsehead=mul(head,head2);
}
printf("\n多项式相乘结果为:
");
output(head);
printf("\n是否继续(y/n)?
");
scanf("%*c%c",&t);
if(t=='y')gotologn;
}
七、程序运行界面图
1,加法运行输入项数
2,输入每一项的系数及指数
3,算出加法运算结果及乘法运行输入项数
4,入乘法运算每一项的系数及指数
5,算出乘法运算的结果
八、心得体会
通过这次的课程设计,是我又温习了数组、循环结构以及嵌套以及分块模块等C语言知识。
一元多项式是一个复杂的运算程序,但是当我设计成功后,我心花怒放。
在课程设计期间,最大的收获是一心一意全心投入去做一件事。
能力很重要,但有时候合作带来的效果也很重要!
大家在一起讨论、研究,一起解决问题,也许有时候一个程序看不懂,但大家在一起讨论,一起去解决,最终还是能够解决的。
对于很多嵌套结构还不是很熟悉,以及指针的运用不是掌握的太好。
所以还是需要进一步的熟悉运用。
东华理工大学长江学院
课程设计评分表
学生姓名:
班级:
学号:
课程设计题目:
一元多项式的加法、乘法运算的实现
项目内容
满分
实评
选
题
能结合所学课程知识、有一定的能力训练。
符合选题要求
(5人一题)
10
工作量适中,难易度合理
10
能
力
水
平
能熟练应用所学知识,有一定查阅文献及运用文献资料能力
10
理论依据充分,数据准确,公式推导正确
10
能应用计算机软件进行编程、资料搜集录入、加工、排版、制图等
10
能体现创造性思维,或有独特见解
10
成
果
质
量
总体设计正确、合理,各项技术指标符合要求。
10
说明书综述简练完整,概念清楚、立论正确、技术用语准确、结论严谨合理;分析处理科学、条理分明、语言流畅、结构严谨、版面清晰
10
设计说明书栏目齐全、合理,符号统一、编号齐全。
格式、绘图、表格、插图等规范准确,符合国家标准
10
有一定篇幅,字符数不少于5000
10
总分
100
指导教师评语:
指导教师签名:
年月日