数据结构课程设计报告一元多项式加减乘除.docx
- 文档编号:4886690
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:38
- 大小:249.69KB
数据结构课程设计报告一元多项式加减乘除.docx
《数据结构课程设计报告一元多项式加减乘除.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元多项式加减乘除.docx(38页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告一元多项式加减乘除
数学与计算机学院
课程设计说明书
课程名称:
数据结构课程设计
课程代码:
8404181
题目:
一元多项式运算的实现
年级/专业/班:
2009-计科-3
学生姓名:
学 号:
312009080605319
开始时间:
2011年06月13日
完成时间:
2011年06月21日
课程设计成绩:
学习态度及平时成绩(30)
技术水平与实际能力(20)
创新(5)
说明书撰写质量(45)
总分(100)
指导教师签名:
年月日
摘要
随着计算机的普及,对数学中一元多项式的研究也逐渐普及,计算机程序员通过对其结构的分析,针对其特殊的结构,利用不同的计算机设计语言编程利用计算机系统实现了对一元多项式的一系列操作。
本课程设计中主要利用C、C++语言编写程序实现了稀疏一元多项式的简单运算系统,该系统具有一元多项式顺序和动态两种存储结构,实现了一元多项式的加法、减法、乘法运算等功能。
关键词:
计算机;一元多项式;C;C++;顺序存储;动态存储
1引言
1.1问题的提出
随着计算机的不断发展,计算机的线性表的应用越来越广泛,如今线性表在计算器程序上的应用已达非常成熟的阶段。
但作为计算机领域的初学者要如何利用数据结构的知识完成线性表在一元多项式运算中的简单运用?
一元多项式的表示在计算机内可以用顺序来表示,借助元素在存储相对位置来表示数据元素之间的关系,顺序表中每两个相邻位置表示一元多项式的一个项的系数、指数。
创建一个一元多项式顺序表,对一元多项式的运算中会出现的各种情况进行分析,实现一元多项式的相加、相减、相乘操作。
一元多项式的表示在计算机内也可以用链表来表示,为了节省存储空间,只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个系数非零项,它包含三个域,分别存放该项的系数、指数以及指向下一个多项式项结点的指针。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。
1.2国内外研究的现状
顺序存储和链式存储实现简单的计算运算是计算机实现的最简单最低的基本功能,
顺序存储和链式存储是计算各种功能的基础,随着计算机的研究不断发展,现在国内外的研究都达到非常稳定和成熟的程度。
1.3任务与分析
本课题主要的目的是分别采用顺序和动态存储结构实现一元多项式的加法、减法和乘法。
并将操作结果分别按升序和降序输出。
2程序的主要功能
2.1一元多项式创建
建立一元多项式的顺序表和链式表,按程序提示输入每个项数据结束创建。
借助元素在存储器中的相对位置来表示数据元素之间的关系,顺序表中第i个位置表示一元多项式的第i项的系数为第i个位置存放的内容,指数为i-1。
创建一个一元多项式顺序表,对一元多项式的运算中会出现的各种情况进行分析,实现一元多项式的相加、相减、相乘操作。
用链表来表示只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个term项结构和指向下一个节点的指针域,term又包括系数和指数两个域分别存放该项的系数、。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。
2.2一元多项式的加法
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到和多项式中去。
2.3一元多项式的减法
对于两个一元多项式中所有指数相同的项,对应系数相减,若其差不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,将其按减法规则复抄到差多项式中去。
2.4一元多项式的乘法
将乘法运算分解为一系列的加法运算利用两个一元多项式相加的算法实现。
2.5一元多项式项的指数比较
比较相邻两项的指数的大小。
按升序排列时,前面项的指数大于后面项的指数就交换其项的位置。
按降序序排列时,后面项的指数大于前面项的指数就交换其项的位置。
2.6一元多项式运算结果升降排序
一元多项式运算结果选择调用降序或升序排序函数。
2.7一元多项式的输出
将选择的运算操作结果输出。
2.8一元多项式的销毁
销毁已建立的两个多项式,释放空间。
3程序运行平台
VC++6.0。
编译,链接,执行。
WindowsXP。
4总体设计
图4.1系统总体框架图
5程序类的说明
(1)Ploy结构声明
typedefstruct//顺序表结构声明
{
inta[N];//记录多项式
intlen;//记录多项式的长度
}Ploy;
(2)term结构声明
typedefstruct//项的表示
{floatcoef;//系数
intexpn;//指数
}term;
(3)LNode结构声明
typedefstructLNode
{termdata;//term多项式值
structLNode*next;
}LNode,*LinkList;//两个类型名
typedefLinkListpolynomail;//用带头结点的有序链表表示多项式
6模块分析
整个流程图如图所示:
图1
6.1创建模块
6.1.1、链式存储结构的一元多项式的创建
程序源代码:
polynomailcreatpolyn(polynomailP,intm)
{
//输入m项的系数和指数,建立表示一元多项式的有序链表P
polynomailr,q,p,s,Q;
inti;
P=(LNode*)malloc(sizeof(LNode));
r=P;
for(i=0;i { s=(LNode*)malloc(sizeof(LNode)); printf("请输入第%d项的系数和指数: ",i+1); scanf("%f%d",&s->data.coef,&s->data.expn); r->next=s; r=s; } r->next=NULL; if(P->next->next! =NULL) { for(q=P->next;q! =NULL/*&&q->next! =NULL*/;q=q->next)//合并同类项 for(p=q->next,r=q;p! =NULL;) if(q->data.expn==p->data.expn) { q->data.coef=q->data.coef+p->data.coef; r->next=p->next; Q=p; p=p->next; free(Q); } else { r=r->next; p=p->next; } } returnP; } 6.1.2、顺序存储结构一元多项式的创建 程序源代码: voidGetPloy(Ploy*A) { inti,coef,ex,maxe=0; charch; printf("请输入每个项的系数及对应的指数,指数为负数时标志输入结束! \n"); for(i=0;i A->a[i]=0; scanf("%d%d",&coef,&ex); while(ex>=0) { if(ex>maxe) maxe=ex; if(A->a[ex]! =0) { printf("你输入的项已经存在,是否更新原数据? (Y/N)"); cin>>ch; if(ch=='Y'||ch=='y') { A->a[ex]=coef; printf("更新成功,请继续输入! \n"); } else printf("请继续输入! \n");; } else A->a[ex]=coef; scanf("%d%d",&coef,&ex); } A->len=maxe; return; } 6.2一元多项式的加法 6.2.1链式存储两多项式相加 程序源代码: polynomailaddpolyn(polynomailpa,polynomailpb) { //完成多项式相加运算,即: Pa=Pa+Pb polynomails,newp,q,p,r; intj; p=pa->next; q=pb->next; newp=(LNode*)malloc(sizeof(LNode)); r=newp; while(p&&q) { s=(LNode*)malloc(sizeof(LNode)); switch(cmp(p->data,q->data)) { case-1: s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s; r=s; p=p->next; break; case0: s->data.coef=p->data.coef+q->data.coef; if(s->data.coef! =0.0) { s->data.expn=p->data.expn; r->next=s;r=s; } p=p->next; q=q->next; break; case1: s->data.coef=q->data.coef; s->data.expn=q->data.expn; r->next=s; r=s; q=q->next; break; }//switch }//while 6.2.2顺序存储的多项式相加 程序源代码: voidADD(PloyA,PloyB,Ploy*M) /*多项式A与多项式B相加,得到多项式M*/ { intla=A.len,lb=B.len,i; M->len=la>lb? la: lb; for(i=0;i<=la&&i<=lb;i++) { M->a[i]=A.a[i]+B.a[i]; } while(i<=la) { M->a[i]=A.a[i]; i++; } while(i<=lb) { M->a[i]=B.a[i]; i++; } return; } 6.3一元多项式相减 6.3.1链式存储的多项式相减 程序源代码: /*3、两多项式相减*/ polynomailsubpolyn(polynomailpa,polynomailpb) { //完成多项式相减运算,即: Pa=Pa-Pb polynomails,newp,q,p,r,Q;intj; p=pa->next; q=pb->next; newp=(LNode*)malloc(sizeof(LNode)); r=newp; while(p&&q) { s=(LNode*)malloc(sizeof(LNode)); switch(cmp(p->data,q->data)) { case-1: s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s; r=s; p=p->next; break; case0: s->data.coef=p->data.coef-q->data.coef; if(s->data.coef! =0.0) { s->data.expn=p->data.expn; r->next=s; r=s; } p=p->next; q=q->next; break; case1: s->data.coef=-q->data.coef; s->data.expn=q->data.expn; r->next=s; r=s; q=q->next; }//switch }//while while(p) { s=(LNode*)malloc(sizeof(LNode)); s->data.coef=p->data.coef; s->data.expn=p->data.expn; r->next=s; r=s; p=p->next; } while(q) { s=(LNode*)malloc(sizeof(LNode)); s->data.coef=-q->data.coef; s->data.expn=q->data.expn; r->next=s; r=s; q=q->next; } r->next=NULL; if(newp->next! =NULL&&newp->next->next! =NULL)//合并同类项 { for(q=newp->next;q! =NULL;q=q->next) for(p=q->next,r=q;p! =NULL;) if(q->data.expn==p->data.expn) { q->data.coef=q->data.coef+p->data.coef; r->next=p->next; Q=p; p=p->next; free(Q); } else {r=r->next;p=p->next;} } printf("升序1,降序2\n"); printf("选择: "); scanf("%d",&j); if(j==1) arrange1(newp); else arrange2(newp); returnnewp;} 6.3.2顺序存储的多项式相减 程序源代码: voidSUB(PloyA,PloyB,Ploy*M) /*多项式A与多项式B相减(A-B),得到多项式M*/ { intla=A.len,lb=B.len,i; M->len=la>lb? la: lb; for(i=0;i<=la&&i<=lb;i++) { M->a[i]=A.a[i]-B.a[i]; } while(i<=la){M->a[i]=A.a[i];i++;} while(i<=lb){M->a[i]=0-B.a[i];i++;} return; } 6.4一元多项式相乘 6.4.1链式存储的多项式相乘 程序源代码: polynomailmulpolyn(polynomailpa,polynomailpb) { //完成多项式相乘运算,即: Pa=Pa*Pb polynomails,newp,q,p,r; inti=20,j; newp=(LNode*)malloc(sizeof(LNode)); r=newp; for(p=pa->next;p! =NULL;p=p->next) for(q=pb->next;q! =NULL;q=q->next) { s=(LNode*)malloc(sizeof(LNode)); s->data.coef=p->data.coef*q->data.coef; s->data.expn=p->data.expn+q->data.expn; r->next=s; r=s; } r->next=NULL; printf("升序1,降序2\n"); printf("选择: "); scanf("%d",&j); if(j==1) arrange1(newp); else arrange2(newp); for(;i! =0;i--) { for(q=newp->next;q->next! =NULL;q=q->next)//合并同类项 for(p=q;p! =NULL&&p->next! =NULL;p=p->next) if(q->data.expn==p->next->data.expn) { q->data.coef=q->data.coef+p->next->data.coef; r=p->next; p->next=p->next->next; free(r); } } returnnewp;} 6.4.2顺序存储多项式相乘 程序源代码: voidMUL(PloyA,PloyB,Ploy*M) /*多项式A与多项式B相乘,得到多项式M*/ { inti,j; for(i=0;i<=A.len+B.len+1;i++)M->a[i]=0; for(i=0;i<=A.len;i++) for(j=0;j<=B.len;j++) { M->a[i+j]+=A.a[i]*B.a[j]; } M->len=A.len+B.len; return; } 6.5一元多项式输出结果按项的指数排序 6.5.1链式由小到大排序 图6.6.1链式升序流程图 voidarrange1(polynomailpa) {polynomailh=pa,p,q,r; if(pa==NULL)exit(-2); for(p=pa;p->next! =NULL;p=p->next);r=p; for(h=pa;h->next! =r;)//大的沉底 {for(p=h;p->next! =r&&p! =r;p=p->next) if(cmp(p->next->data,p->next->next->data)==1) {q=p->next->next; p->next->next=q->next; q->next=p->next; p->next=q; } r=p;//r指向参与比较的最后一个,不断向前移动 }} 6.5.2链式由大到小排序 图6.6.2链式降序流程图 程序源代码: voidarrange2(polynomailpa) {polynomailh=pa,p,q,r; if(pa==NULL)exit(-2); for(p=pa;p->next! =NULL;p=p->next);r=p; for(h=pa;h->next! =r;)//小的沉底 {for(p=h;p->next! =r&&p! =r;p=p->next) if(cmp(p->next->next->data,p->next->data)==1) {q=p->next->next; p->next->next=q->next; q->next=p->next; p->next=q; } r=p;//r指向参与比较的最后一个,不断向前移动 6.5.3顺序由大到小排序 程序源代码: voidPrintPloy1(PloyA)//降序输出顺序一元多项式 { inti; printf("%dx^%d",A.a[A.len],A.len); for(i=A.len-1;i>=1;i--) { if(A.a[i]==0); elseif(A.a[i]==1)printf("+x^%d",i); elseif(A.a[i]==-1)printf("-x^%d",i); else { if(A.a[i]>0) printf("+%dx^%d",A.a[i],i); else printf("-%dx^%d",-A.a[i],i); } } if(A.a[0]==0); elseif(A.a[0]>0) printf("+%d",A.a[0]);//打印x的0次项 else printf("-%d",-A.a[0]); printf("\n"); return; } 6.5.4顺序由小到大排序 程序源代码: voidPrintPloy2(PloyA)//升序输出顺序一元多项式 { inti=0; while(A.a[i]==0) ++i; if(i==0) printf("%d",A.a[i]); else { if(A.a[i]==1) printf("x^%d",i); elseif(A.a[i]==-1) printf("-x^%d",i); else printf("%dx^%d",A.a[i],i); } for(++i;i<=A.len;i++) { if(A.a[i]==0); elseif(A.a[i]==1) printf("+x^%d",i); elseif(A.a[i]==-1) printf("-x^%d",i); elseif(A.a[i]>1) printf("+%dx^%d",A.a[i],i); elseif(A.a[i]<-1) printf("-%dx^%d",-A.a[i],i); } } 6.6一元多项式运算系统实现 6.6.1主菜单系统 程序源代码: voidMenu() { printf("\n"); printf("************一元多项式的基本运算系统************\n"); printf("1、一元多项式顺序存储的子系统请按1\n"); printf("2、一元多项式链式存储的基本运算请按2\n"); printf("3、退出系统请按3\n"); printf("************************************************\n"); printf("\n"); printf("请输入你想进行的操作号: \n"); intn; scanf("%d",&n); while(n! =1&&n! =2&&n! =3) { printf("对不起,你的输入不正确,请重新输入! \n"); scanf("%d",&n); } switch
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 一元 多项式 加减乘除