数据结构课程设计报告一元多项式加减乘除精.docx
- 文档编号:7305606
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:37
- 大小:229.48KB
数据结构课程设计报告一元多项式加减乘除精.docx
《数据结构课程设计报告一元多项式加减乘除精.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告一元多项式加减乘除精.docx(37页珍藏版)》请在冰豆网上搜索。
数据结构课程设计报告一元多项式加减乘除精
多项式想加减与乘与升降序
学院计算机科学与技术
专业信息安全
学号*********
学生姓名陶宝中
辅导教师姓名
2014年12月22日
一、设计目的与内容
了解数据结构的与算法的设计方法,独立分析和设计一元多项式加减与乘除的程序编码,通过程序编写掌握软件开发过程的问题分析,系统设计,程序编码,测试等基本方法和技能,提高综合运用所学理论知识和方法独立分析和解决问题的能力,通过这次实践将实验问题中的所涉及的对象在计算机中表示出来并对他们进行处理,掌握线除。
任务与分析
本课题主要的目的是分别采用顺序和动态存储结构实现一元多项式的加法、减法和乘法。
并将操作结果分别按升序和降序输出
程序的主要功能
一元多项式创建
建立一元多项式的顺序表和链式表,按程序提示输入每个项数据结束创建。
借助元素在存储器中的相对位置来表示数据元素之间的关系,顺序表中第i个位置表示一元多项式的第i项的系数为第i个位置存放的内容,指数为i-1。
创建一个一元多项式顺序表,对一元多项式的运算中会出现的各种情况进行分析,实现一元多项式的相加、相减、相乘操作。
用链表来表示只存储多项式中系数非零的项。
链表中的每一个结点存放多项式的一个term项结构和指向下一个节点的指针域,term又包括系数和指数两个域分别存放该项的系数、。
创建一元多项式链表,对一元多项式的运算中会出现的各种可能情况进行分析,实现一元多项式的相加、相减、相乘操作。
一元多项式的加法
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到和多项式中去。
一元多项式的减法
对于两个一元多项式中所有指数相同的项,对应系数相减,若其差不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,将其按减法规则复抄到差多项式中去。
一元多项式的乘法
将乘法运算分解为一系列的加法运算利用两个一元多项式相加的算法实现。
一元多项式项的指数比较
比较相邻两项的指数的大小。
按升序排列时,前面项的指数大于后面项的指数就交换其项的位置。
按降序序排列时,后面项的指数大于前面项的指数就交换其项的位置。
一元多项式运算结果升降排序
一元多项式运算结果选择调用降序或升序排序函数。
一元多项式的输出
将选择的运算操作结果输出。
一元多项式的销毁
销毁已建立的两个多项式,释放空间。
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(n) { case1: if(n==1) shunxu(); break; case2: if(n==2) link(); break; case3: if(n==3) printf("已成功退出该系统,谢谢你的使用! \n"); exit(-2); } } 6.6.2顺序子系统 程序源代码: voidMenushunxu() { printf("\n"); printf("********一元多项式顺序存储的基本运算********\n"); printf("1、更新两个多项式一元多项式请按1\n"); printf("2、两多项式相加得一新多项式请按2\n"); printf("3、两多项式相减得一新多项式请按3\n"); printf("4、两多项式相乘得一新多项式请按4\n"); printf("5、退出该子系统,返回主菜单请按5\n"); printf("6、退出该系统请按6\n"); printf("********************************************\n"); printf("\n"); return; } voidshunxu()//一元多项式顺序存储的实现 { PloyA,B,M; intn,m; printf("进入顺序存储一元多项式运算子系统\n"); printf("请输入多项式A: \n"); GetPloy(&A); printf("请输入多项式B: \n"); GetPloy(&B); printf("输出两个一元多项式A、B,降幂输出请按1,升幂输出请按2! \n"); cin>>m; while(m<1&&m>m) { printf("你输入的输出新创一元多项式的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 一元 多项式 加减乘除
![提示](https://static.bdocx.com/images/bang_tan.gif)