一元多项式计算.docx
- 文档编号:18380220
- 上传时间:2023-08-16
- 格式:DOCX
- 页数:21
- 大小:185.78KB
一元多项式计算.docx
《一元多项式计算.docx》由会员分享,可在线阅读,更多相关《一元多项式计算.docx(21页珍藏版)》请在冰点文库上搜索。
一元多项式计算
XXX大学
信息科学与工程学院
数据结构课程设计报告
设计题目一元多项式计算
学生专业班级
学生姓名(学号)
设计小组其他同学姓名(学号))
指导教师
完成时间2007年12月23日
实习(设计)地点信息楼机房
2007年12月23日
一、课程设计目的和任务
通过C语言使用链式存储结构实现一元多项式加法、减法和乘法的运算。
通过课程的设计,进一步了解链式结构的运用。
二、分析与设计
1.程序的基本功能:
(1)建立多项式
(2)输出多项式
(3)两个多项式相加,建立并输出和多项式
(4)两个多项式相减,建立并输出差多项式
实现提示:
可选择带头结点的单向循环链表或单链表存储多项式,头结点可存放多项式的参数,如项数等。
2.系统总框图
3.定义的函数及说明:
程序由7个函数构成。
createPoly-----创建一个多项式链表;
outp_poly------输出一个多项式链表。
Addpoly--------多项式和的计算;
Decpoly--------多项式差的计算;
Mulpoly--------多项式积的计算;
DelPoly---------删除多项式;
Main------------主函数。
4.算法设计:
本程序的特点是主要运用指针数组、结构体和链表,其中在建立链表的时候用数组指针,然后通过数组指针完成多项式的创建。
三、系统实施
1.源程序代码
//一元多项式计算
#include
#include
#defineOK1;
#defineREAD(I)while((I=getchar())=='\n');//读入合法字符
typedefintstatus;
typedefstructPolyNode//将结构体polynode另命名为poly以及*p_poly;
{
floatcoef;//系数;
intexpn;//指数;
structPolyNode*next;//指向下一项的系数和指数;
}Poly,*P_Poly;
statusCreatPoly(P_Poly*,int);//创建多项式链表
voidOutP_Poly(P_Poly);//输出多项式
voidAddPoly(P_Poly*,P_Poly,P_Poly);//求和
voidDecPoly(P_Poly*,P_Poly,P_Poly);//求差
voidDelPoly(P_Poly*);//删除并释放多项式
voidmulPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2);
statusmain()
{
P_PolyPolyHead[26]={0};//定义指针数组
charmenu,name;
for(;;)
{
printf("1.建立多项式\n");
printf("2.输出多项式\n");
printf("3.求两个多项式之和(必须先创建),建立和式并输出\n");
printf("4.求两个多项式之差(必须先创建),建立差式并输出\n");
printf("5.求两个多项式的乘积,建立积式并输出\n");
printf("6.删除多项式\n");
printf("0.退出\n");
printf("请选择指令:
");
READ(menu)
switch(menu)
{
case'1':
{
intn;
printf("请输入要创建的多项式的名称(单个小写字母表示):
");
READ(name)
if(NULL!
=PolyHead[name-'a'])
{
printf("此多项式已经存在!
\n");
break;
}
printf("请输入项数:
");
scanf("%d",&n);
if(CreatPoly(&PolyHead[name-'a'],n))printf("多项式%c创建完毕!
\n",name);//取polyhead[name-'a']的地址;
break;
}
case'2':
printf("请输入要输出的多项式的名称:
");
READ(name)
if(NULL==PolyHead[name-'a'])
{
printf("此多项式不存在!
\n");
break;
}
OutP_Poly(PolyHead[name-'a']);
break;
case'3':
{
charname1,name2;
printf("请输入加式一的名称:
");
READ(name1)
if(NULL==PolyHead[name1-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入加式二的名称:
");
READ(name2)
if(NULL==PolyHead[name2-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入要创建的和式的名称:
");
READ(name)
if(NULL!
=PolyHead[name-'a'])
{
printf("此多项式已经存在!
\n");
break;
}
AddPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);
OutP_Poly(PolyHead[name-'a']);
break;
}
case'4':
{
charname1,name2;
printf("请输入被减式的名称:
");
READ(name1)
if(NULL==PolyHead[name1-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入减式的名称:
");
READ(name2)
if(NULL==PolyHead[name2-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入要创建的差式的名称:
");
READ(name)
if(NULL!
=PolyHead[name-'a'])
{
printf("此多项式已经存在!
\n");
break;
}
DecPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);
OutP_Poly(PolyHead[name-'a']);
break;
}
case'5':
{
charname1,name2;
printf("请输入被乘式的名称:
");
READ(name1)
if(NULL==PolyHead[name1-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入乘式的名称:
");
READ(name2)
if(NULL==PolyHead[name2-'a'])
{
printf("此多项式不存在!
请先创建\n");
break;
}
printf("请输入要创建的积式的名称:
");
READ(name)
if(NULL!
=PolyHead[name-'a'])
{
printf("此多项式已经存在!
\n");
break;
}
mulPoly(&PolyHead[name-'a'],PolyHead[name1-'a'],PolyHead[name2-'a']);
OutP_Poly(PolyHead[name-'a']);
break;
}
case'6':
printf("请输入要删除的多项式名称:
");
READ(name)
if(NULL==PolyHead[name-'a'])
{
printf("此多项式不存在!
\n");
break;
}
DelPoly(&PolyHead[name-'a']);
printf("多项式%c已删除!
\n",name);
break;
case'0':
returnOK;
}
}
}
statusCreatPoly(P_Poly*P_PolyHead,intn)
{//为确保其他子函数正常运行,入口参数要求不含同类项、指数递减
inti=0;
P_Polyp,tail;//声明两个指针
*P_PolyHead=(Poly*)malloc(sizeof(Poly));
(*P_PolyHead)->expn=n;
tail=*P_PolyHead;
printf("请按照指数递减序输入最简形式的多项式\n");
for(;i { p=(Poly*)malloc(sizeof(Poly)); printf("请输入第%d项的系数和指数(系数,指数): ",i+1); scanf("%f,%d",&(p->coef),&(p->expn)); tail=tail->next=p; } tail->next=NULL; returnOK; } voidOutP_Poly(P_PolyPolyHead) { inti=0; P_Polyp; printf("%d",PolyHead->expn); p=PolyHead->next; for(;i { printf("%f,%d",p->coef,p->expn); p=p->next; } printf("\n"); } voidAddPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2) { inti=0; P_Polyp1,p2,p,tail; p1=PolyHead1->next; p2=PolyHead2->next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); p=tail=*P_PolyHead; while(p1&&p2) { inte1,e2; e1=p1->expn; e2=p2->expn; if(e1>e2) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p1; p1=p1->next; i++; } elseif(e1==e2) { floatsum_c=p1->coef+p2->coef; if(sum_c! =0.0) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=sum_c; p->expn=e1; i++; } p1=p1->next; p2=p2->next; } elseif(e1 { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p2; p2=p2->next; i++;//i用于计算项的个数 } } while(p1) { p=(Poly*)malloc(sizeof(Poly)); *p=*p1; tail->next=p;//等价于tail=tail->next=p tail=p; p1=p1->next; i++; } while(p2) { p=(Poly*)malloc(sizeof(Poly)); *p=*p2; tail->next=p; tail=p; p2=p2->next; i++; } (*P_PolyHead)->expn=i;//将项的个数存储在第一个节点的指数位上; tail->next=NULL; } voidDecPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2) { inti=0; P_Polyp1,p2,p,tail; p1=PolyHead1->next; p2=PolyHead2->next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); p=tail=*P_PolyHead; while(p1&&p2) { inte1,e2; e1=p1->expn; e2=p2->expn; if(e1>e2) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; *p=*p1; p1=p1->next; i++; } elseif(e1==e2) { floatdif_c=p1->coef-p2->coef; if(dif_c! =0.0) { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=dif_c; p->expn=e1; i++; } p1=p1->next; p2=p2->next; } elseif(e1 { p=(P_Poly)malloc(sizeof(Poly)); tail->next=p; tail=p; p->coef=-p2->coef; p->expn=p2->expn; p2=p2->next; i++; } } while(p1) { p=(Poly*)malloc(sizeof(Poly)); *p=*p1; tail->next=p; tail=p; p1=p1->next; i++; } while(p2) { p=(Poly*)malloc(sizeof(Poly)); *p=*p2; tail->next=p; tail=p; p2=p2->next; i++; } (*P_PolyHead)->expn=i; tail->next=NULL; } voidDelPoly(P_Poly*P_PolyHead) { P_Polyp,prior; p=prior=*P_PolyHead; while(p->next) { p=p->next; free(prior); prior=p; } *P_PolyHead=NULL; } voidmulPoly(P_Poly*P_PolyHead,P_PolyPolyHead1,P_PolyPolyHead2) { inti=0; inte,m,n; floatc=0; P_Polyp1,p2,p,tail; p1=PolyHead1->next; p2=PolyHead2->next; *P_PolyHead=(P_Poly)malloc(sizeof(Poly)); p=tail=*P_PolyHead; //printf("%d",PolyHead2->expn); if(p1! =NULL&&p2! =NULL) { for(m=PolyHead1->expn;m! =0;m--) { for(n=PolyHead2->expn;n! =0;n--) { c=p1->coef*p2->coef; e=p1->expn+p2->expn; p=(P_Poly)malloc(sizeof(Poly)); p->coef=c; p->expn=e; tail->next=p; tail=tail->next; i++; p2=p2->next; } p2=PolyHead2->next; p1=p1->next; } (*P_PolyHead)->expn=i; tail->next=NULL; } else printf("sorry");} 2.程序运行说明(包括结果说明) 运行说明: 运行程序后,先出现以下背景, 上面有提示语句,分别按照这些提示语句进行选择,就会出现相应的菜单。 1.创建a,b多项式 2.输出a,b多项式 3.进行多项式加减法和乘法 4.多项式的删除与退出 5.其它不规范操作的错误提示 结果说明: 多项式最前面的数字代表多项式的项数。 3.存在的问题: 整个程序的功能还不完善,界面做的有些简单,菜单没有做好。 因为还没想出比较好的方法对多项式计算的结果进行化简,所以没有对多项式的计算结果进行化简,同类项没有进行合并。 四、总结与体会 首先,发现自己对知识的掌握不是很牢固,对课程的设计很困难。 自己对知识的掌握和运用是相当的差,感觉自己的知识就是白学了。 其次,通过查资料,对于链表和指针的使用有了更深刻的了解,还有对define和typedef的应用有了新的认识。 如typedefint*bom将int令命名为*bom,则用bom定义的类型为int指针类型的指针,像bomn,n为int型的指针。 define可以代替多行代码,用起来很方便。 typedef有利于程序的通用和移植。 Typedef与#define有相似之处,如typedefintCOUNT和#defineCOUNTint的作用都是用COUNT代替int。 不同之处在于,#define只能做简单的字符串替换。 课程设计成绩评定表 学生姓名 专业班级 设计题目 一元多项式计算 指导教师评语及意见: 指导教师评阅成绩: 指导教师签字: 年月日 注: 此表装订在课程设计之后。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 多项式 计算
![提示](https://static.bingdoc.com/images/bang_tan.gif)