一元多项式的运算 实验报告和代码.docx
- 文档编号:2127822
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:12
- 大小:24.27KB
一元多项式的运算 实验报告和代码.docx
《一元多项式的运算 实验报告和代码.docx》由会员分享,可在线阅读,更多相关《一元多项式的运算 实验报告和代码.docx(12页珍藏版)》请在冰点文库上搜索。
一元多项式的运算实验报告和代码
一.问题描述:
设Pn(x)和Qm(x)分别两个一元多项式。
试编写程序实现一元多项式的加法运算。
二.需求分析:
1.本程序需要基于线性表的基本操作来实现一元多项式的加法,也可以用数组实现。
2.两个多项式都有键盘输入相应的系数和指数。
3.
//第一个多项式为9x15+7x8+5x3+3x
输入
4//表示第一个多项式的项数
9,15(回车)//表示9x15
7,8(回车)
5,3(回车)
3,1(回车)
输出
9x^15+7x^8+5x^3+3x^1
//第二个多项式为-7x8+6x3+2
输入
3//表示第二个多项式的项数
6,3(回车)//表示9x15
-7,8(回车)
2,0(回车)
输出
-7x^8+6x^3+2x^0
求和结果
9x^15+11x^3+3x^1+2x^0
三.概要设计
抽象数据类型:
为实现上述程序的功能,应以整数存储用户的输入,以及计算的结果。
实现多项式的运算,利用数组的方式需开辟一个二维数组,利用链表的方式须创造两个链表。
算法的基本思想:
数组实现:
定义一个结构体数组,p存储系数,q存储指数。
分别输出两次输入的多项式。
将两次输入的多项式的指数按从大到小的顺序进行排列,同时相应的系数要进行交换。
输出时如果进行判断。
如果当前该项与下一项的的系数相同,将两项系数相加后输出,并跳过下一项。
如果不相等,直接输出。
输出时需注意的问题:
当系数为0时,该项不输出
当系数为负数时,不要再在前面输出+。
链表实现:
定义一个结构体,分别用exp,coef来存储系数和指数,同时在结构体里面定义一个该结构类型指针。
对输入的第一个多形式和第二个多项式分别构建一个链表(
按指数的大小)
输出时,通过比较两个链表当前位置的指数大小,相同,系数相加后输出,两个链表同时向前推进。
如果其中一个大,只输出较大项,同时将其推进。
程序的流程:
(1)输入模块:
完成两个多项式的输入。
(2)处理模块:
将多项式按其指数大小进行排列。
(3)输出模块:
输出合并后的多项式。
四.详细设计:
算法的具体步骤:
数组方法
structcode{
intp,q;
}a[1000],b[1000];//结构体数组,可以用二维数组代//替
for(i=0;i for(j=i+1;j if(a[j].q>a[i].q){ temp=a[j].q;//指数排序 a[j].q=a[i].q; a[i].q=temp; temp=a[j].p;//系数跟着变化 a[j].p=a[i].p; a[i].p=temp; } } //对输入的指数进行排序,相应的系数跟着变化 cout< if(a[i].p>0) elseif(a[i].p<0) cout< cout<<'+'< for(i=0;i {a[n+i].q=b[i].q; a[n+i].p=b[i].p; }//将两个多项式的指数,系数存储到一个数组 for(i=0;i for(j=i+1;j if(a[j].q>a[i].q){ temp=a[j].q; a[j].q=a[i].q; a[i].q=temp; temp=a[j].p; a[j].p=a[i].p; a[i].p=temp; } } //按指数由大到小进行排列 if(a[0].q! =a[1].q){ cout< j=1; } else{ cout< j=2; } //进行合并同类项的操作,如果该项与下一项的指数相等,//则系数相加。 否则,只输出该项 for(i=j;i if(a[i].q! =a[i+1].q){ if(a[i].p>0) cout<<"+"< if(a[i].p<0) //负号相当于减号 cout< } else{ if((a[i].p+a[i+1].p)>0) cout<<"+"< elseif((a[i].p+a[i+1].p)<0) cout< i++; } } if(a[m+n-1].q! =a[m+n-2].q) {if(a[i].p>0) cout<<"+"< elseif(a[i].p<0) cout< } //对第一项与最后一项做特殊处理,以免输出多余的运算//符,同时,当系数为0,则不输出该项 循环链表的方法: structcode{ floatcoef;//存系数 intexpn;//存指数 code*next; }List; voidCreate(List*L,intn){ for(inti=n;i>0;i--) { p=newList[sizeof(code)];//每次都要new一个 cin>>p->coef; cin>>p->expn; p->next=L->next; L->next=p; } } voidpaixu(LinkList*head)//将链表中的元素按降幂排列 { 类似于数组的冒泡排序法。 } voidprint(List*L) { 打印多项式的函数,特别注意负数的输出,当系数为零时的输出 } ListList(List*La,List*Lb) { 将两个链表合成一个 } 再用输出函数输出即可 算法的时空分析: 算法复杂度为O((m+n)^2); 五.调试分析: 调试的主要内容是观察链表的每一元素是否按降幂排列。 判断什么时候跳出while循环。 六.测试结果: 七.实验心得: 1.对于多项式的运算的,运算符的输出很重要,一开始多输出一个‘+’,并且当为负数时会输出+--。 还有当系数为0时的输出都没有专门考虑。 和周围的同学交流一下算法,相互探讨了出现的问题,和解决的方法。 讨论中改掉很多不足。 使代码更加完善。 2.这次用链表的来做这道题目让我收获很大。 对链表的构建更加的熟练。 对链表向前推进把握的更加准确。 在调试代码,检验的时候,遇到很大的阻碍,但解决问题后,自己明白了很多。 3.通过本次试验,我发现自己分析问题不是很全面,忽略掉一些细节。 以后分析问题时要仔细考虑,认真分析,避免在细节上犯错误。 附: #include usingnamespacestd; structcode{ intp,q; }a[1000],b[1000]; intmain(){ inti,j,n,m,temp; while(cin>>n){ for(i=0;i cin>>a[i].p>>a[i].q; for(i=0;i for(j=i+1;j if(a[j].q>a[i].q){ temp=a[j].q; a[j].q=a[i].q; a[i].q=temp; temp=a[j].p; a[j].p=a[i].p; a[i].p=temp; } } } cout< for(i=1;i if(a[i].p>0) cout<<'+'< elseif(a[i].p<0) cout< } cout< cin>>m; for(i=0;i cin>>b[i].p>>b[i].q; for(i=0;i for(j=i+1;j if(b[j].q>b[i].q){ temp=b[j].q; b[j].q=b[i].q; b[i].q=temp; temp=b[j].p; b[j].p=b[i].p; b[i].p=temp; } } } cout< for(i=1;i if(b[i].p>0) cout<<"+"< elseif(b[i].p<0) cout< } cout< for(i=0;i {a[n+i].q=b[i].q; a[n+i].p=b[i].p; } for(i=0;i for(j=i+1;j if(a[j].q>a[i].q){ temp=a[j].q; a[j].q=a[i].q; a[i].q=temp; temp=a[j].p; a[j].p=a[i].p; a[i].p=temp; } } if(a[0].q! =a[1].q){ cout< j=1; } else{ cout< j=2; } for(i=j;i if(a[i].q! =a[i+1].q){ if(a[i].p>0) cout<<"+"< if(a[i].p<0) cout< } else{ if((a[i].p+a[i+1].p)>0) cout<<"+"< elseif((a[i].p+a[i+1].p)<0)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元多项式的运算 实验报告和代码 一元 多项式 运算 实验 报告 代码