云南大学软件学院一元稀疏多项式计算器.docx
- 文档编号:9227611
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:24
- 大小:116.99KB
云南大学软件学院一元稀疏多项式计算器.docx
《云南大学软件学院一元稀疏多项式计算器.docx》由会员分享,可在线阅读,更多相关《云南大学软件学院一元稀疏多项式计算器.docx(24页珍藏版)》请在冰点文库上搜索。
云南大学软件学院一元稀疏多项式计算器
(本实验项目方案受“教育部人才培养模式创新实验区(X3108005)”项目资助)
实验难度:
A□B□C□
序号
学号
姓名
成绩
1
20111120
2
20111120
指导教师:
(签名)
学 期:
2012秋季学期
任课教师:
实验题目:
一元稀疏多项式计算器
小组长:
联系电话:
电子邮件:
完成提交时间:
2012年11月10日
云南大学软件学院2012学年秋季学期
《数据结构实验》成绩考核表
学号:
20111120姓名:
本人承担角色:
算法设计整体流程控制
评分项目
评分指标
分值
得分
实验构思(10%)
1.实验目的明确
5
2.实验内容理解透彻、对实验所涉及到的知识点分析到位
5
实验设计(15%)
1.有对基本数据结构的抽象数据类型定义
5
2.实验方案设计完整,数据结构、算法选择合理
5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图
5
实验实现(25%)
1.代码编写规范、风格统一、注释清楚易读
5
2.程序运行正常,测试结果正确
15
3.界面友好、易于操作、有较强的容错性
5
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
5
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
5
个人工作量(30%)
1.个人完成工作量
15
2.个人技术水平
10
3.团队合作精神
5
实验运作(10%)
1.有一定用户群
5
2.应用前景分析
5
综合得分:
(满分100分)
指导教师:
年月日
云南大学软件学院2010学年秋季学期
《数据结构实验》成绩考核表
学号:
20111120姓名:
本人承担角色:
函数实现整体流程控制
评分项目
评分指标
分值
得分
实验构思(10%)
1.实验目的明确
5
2.实验内容理解透彻、对实验所涉及到的知识点分析到位
5
实验设计(15%)
1.有对基本数据结构的抽象数据类型定义
5
2.实验方案设计完整,数据结构、算法选择合理
5
3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图
5
实验实现(25%)
1.代码编写规范、风格统一、注释清楚易读
5
2.程序运行正常,测试结果正确
15
3.界面友好、易于操作、有较强的容错性
5
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
5
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
5
个人工作量(30%)
1.个人完成工作量
15
2.个人技术水平
10
3.团队合作精神
5
实验运作(10%)
1.有一定用户群
5
2.应用前景分析
5
综合得分:
(满分100分)
指导教师:
年月日
(下面的内容由学生填写,格式统一为,字体:
楷体,行距:
固定行距18,字号:
小四,个人报告按下面每一项的百分比打分。
难度A满分70分,难度B满分90分)
一、【实验构思(Conceive)】(10%)
多项式计算器的呈现方式是用控制台程序呈现,;多项式的加减乘以及求导的函数中利用链表保存头结点以及循环结构保存和输出数据;还有利用一个简单的降序排列的函数,在输出时更加明了。
二、【实验设计(Design)】(20%)
在头文件中申明变量,源文件中创建指数和系数的指针的头结点,并为此申请空间。
首先考虑指数为0,1和系数为0,1时的特殊情况的表示;然后利用SORT函数对输出时进行降序排列;其次就是加减乘以及求导函数的实现;最后是一个输出界面的设计。
三、【实现描述(Implement)】(30%)
//--------函数原型说明--------
typedefstructNode
{
doublexishu;
intzhishu;//数据域
//intdata;
structNode*pnext;//指针域
}Node,*pNode;
pNodephead=(pNode)malloc(sizeof(Node));//创建头节点
pNodecreat_list(void);创建链表
voidtraverse_list(pNodephead);//遍历链表
pNodesort(pNodephead);//对链表进行降序排列
pNodeadd(pNodephead1,pNodephead2);//两个多项式相加
pNodehebing(pNodephead)//合并同类项
pNodemulti(pNodephead1,pNodephead2);//多项式相乘
pNodesub(pNodephead1,pNodephead2);//多项式相减
//多项式求导没有声明和定义函数,而是直接卸载程序里了
//------关键操作的实现-------
1.对链表的声明和定义和对创建函数的定义。
#include"stdafx.h"
#include"cpxNum.h"
typedefstructNode
{
doublexishu;
intzhishu;//数据域
//intdata;
structNode*pnext;//指针域
}Node,*pNode;
pNodecreat_list(void)
{
intlen;
inti;
//intval;
intzhishu;
doublexishu;
pNodephead=(pNode)malloc(sizeof(Node));//分配了一个不存在有效数据的头结点
pNodeptail=phead;
ptail->pnext=NULL;
if(phead==NULL)
{
cout<<"分配失败< exit(-1); } cout<<"请输入想输入多项式的项数"< cin>>len; for(i=0;i { cout<<"请? 输º? 入¨? 第̨²"< 项? 的Ì? 系¦Ì数ºy的Ì? 值¦Ì"< cin>>xishu; cout<<"请? 输º? 入¨? 第̨²"< 项? 的Ì? 指? 数ºy的Ì? 值¦Ì"< cin>>zhishu; pNodepnew=(pNode)malloc(sizeof(Node)); if(pnew==NULL) { cout<<"分¤? 配? 失º¡ì败㨹"< exit(-1); } pnew->xishu=xishu; pnew->zhishu=zhishu; ptail->pnext=pnew; pnew->pnext=NULL; ptail=pnew; } phead->zhishu=len; returnphead; } 2.对多项式遍历,排序,同类项合并的定义 1.多项式的遍历 //将多项式分为第一项和其余项两部分考虑,另外考虑指数=0,指数=1,系数=1,系数=0等情况。 voidtraverse_list(pNodephead) { pNodep=phead->pnext; if(p->zhishu==0) cout< else{ if(p->zhishu==1) cout<<"("< else{ if(p->xishu==1) cout<<"x"<<"^"< else {if(p->xishu==0) cout<<"0"; else cout<<"("< } } } p=p->pnext; while(p) {if(p->zhishu==0) cout<<"+"< else{ if(p->zhishu==1) cout<<"x+"<<"("< else{ if(p->xishu==1) cout<<"+"<<"x"<<"^"< else {if(p->xishu==0) cout<<"+0"; else cout<<"+"<<"("< } } } p=p->pnext; } cout< return; } 2.排序操作。 //通过冒泡排序对多项式进行降序排列。 pNodesort(pNodephead) { inti,j; floatxishu; intzhishu; pNodep,q,f; f=phead; intlen=phead->zhishu; for(i=0,p=phead->pnext;i { for(j=i+1,q=p->pnext;j { if(p->zhishu { xishu=p->xishu; zhishu=p->zhishu; p->xishu=q->xishu; p->zhishu=q->zhishu; q->xishu=xishu; q->zhishu=zhishu; } } } returnf; } 3.合并排序 //通过检查将同类型合并,在加法,减法和乘法函数中会用到 pNodehebing(pNodephead) { pNoder,q,p,Q; for(q=phead->pnext;q! =NULL;q=q->pnext)//合? 并¡é同ª? 类¤¨¤项? for(p=q->pnext,r=q;p! =NULL;) if(q->zhishu==p->zhishu)//指? 数ºy相¨¤等̨¨系¦Ì数ºy相¨¤加¨® { q->xishu=q->xishu+p->xishu; r->pnext=p->pnext; Q=p;p=p->pnext; deleteQ;//释º¨ª放¤? p } else { r=r->pnext; p=p->pnext; } returnphead; } 3.多项式的加,减,乘,求导,x代入值的实现 1.多项式的加法 //创建一个新链表存储新的多项式,开始对phead1和phead2进行扫描,指数相同就相加。 pNodeadd(pNodephead1,pNodephead2) { pNodep1,p2,pTail,pnew; pNodephead3=(pNode)malloc(sizeof(Node)); pTail=phead3; pTail->pnext=NULL; sort(phead1); sort(phead2); p1=phead1->pnext; p2=phead2->pnext; inti=0; while(p1&&p2) { if(p1->zhishu>=p2->zhishu) { if(p1->zhishu==p2->zhishu) { pnew=newNode; pnew->xishu=p1->xishu+p2->xishu; pnew->zhishu=p1->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p1=p1->pnext; p2=p2->pnext; } else { pnew=newNode; pnew->xishu=p1->xishu; pnew->zhishu=p1->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p1=p1->pnext; } } else { pnew=newNode; pnew->xishu=p2->xishu; pnew->zhishu=p2->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p2=p2->pnext; } } if(p1==NULL) { pTail->pnext=p2; } if(p2==NULL) pTail->pnext=p1; returnphead3; } 2.多项式的减法 //道理与多项式加法相同,但是指数相同时,系数相减。 pNodesub(pNodephead1,pNodephead2)//减? 法¤¡§函¡¥数ºy { pNodep1,p2,pTail,pnew; pNodephead3=(pNode)malloc(sizeof(Node)); pTail=phead3; pTail->pnext=NULL; sort(phead1); sort(phead2); p1=phead1->pnext; p2=phead2->pnext; while(p1&&p2) { if(p1->zhishu>=p2->zhishu) { if(p1->zhishu==p2->zhishu) { pnew=newNode; pnew->xishu=p1->xishu-p2->xishu; pnew->zhishu=p1->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p1=p1->pnext; p2=p2->pnext; } else { pnew=newNode; pnew->xishu=p1->xishu; pnew->zhishu=p1->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p1=p1->pnext; } } else { pnew=newNode; pnew->xishu=-(p2->xishu); pnew->zhishu=p2->zhishu; pTail->pnext=pnew; pnew->pnext=NULL; pTail=pnew; p2=p2->pnext; } } if(p1==NULL) { pTail->pnext=p2; } if(p2==NULL) pTail->pnext=p1; returnphead3; } 3.多项式乘法 //相当于加法的多次操作。 进行嵌套循环解决此问题 pNodemulti(pNodephead1,pNodephead2)//乘? 法¤¡§函¡¥数ºy { inti,j;//i,j分¤? 别Àe保À¡ê存ä? 了¢? 两¢? 个? 链¢¡ä表À¨ª的Ì? 长¡è度¨¨ pNodep1,p2,pTail; pNodephead3=(pNode)malloc(sizeof(Node)); pTail=phead3; pTail->pnext=NULL; p1=phead1->pnext; while(p1){ p2=phead2->pnext; while(p2){ pNodeq=(pNode)malloc(sizeof(Node)); q->xishu=p1->xishu*p2->xishu; q->zhishu=p1->zhishu+p2->zhishu; q->pnext=phead3->pnext; phead3->pnext=q; phead3=q; p2=p2->pnext; } p1=p1->pnext; } returnpTail; } 4.多项式求导 //不停扫描多项式,对其进行求导运算,直至p=NULL phead=creat_list(); p=phead->pnext; while(p! =NULL) { p->xishu=p->xishu*p->zhishu; p->zhishu=p->zhishu-1; p=p->pnext; } 5.x赋值求结果。 p=phead1->pnext; cout<<"请? 输º? 入¨? x的Ì? 值¦Ì"< cin>>x; sum=0.0; y=1.0; while(p) { for(;p->zhishu>0;p->zhishu--) { y=y*x; } sum=sum+y*(p->xishu); p=p->pnext; y=1.0; } cout<<"结¨¢果? 值¦Ì为a"< cout< 四、【测试结果(Testing)】(10%) 加法测试: 正确 减法测试: 正确 乘法测试: 正确 求导测试: 正确 四、【实验总结】(10%) (本部分应包括: 自己在实验中完成的任务,注意组内的任意一位同学都必须独立完成至少一项接口的实现;对所完成实验的经验总结、心得) 1.实验时,一个小组的同学应该由一人操作,其他人一起来写程序,这样可以避免由于不同的同学的编程风格的差异而导致一些很难发现的错误,从而浪费很多不必要的时间 2.实验之前一定要想好算法,不要盲目的直接就敲程序,这样不仅会使效率低下还会使程序极易出现难以察觉的逻辑错误,最好在敲程序之前画流程图将算法分析清楚,确保无误后再敲程序 3.同学间的交流很重要,不同小组的同学也应该多交流,这样不仅可以大家之间互相取长补短,共同进步,还可以避免很多错误的出现 五、【项目运作描述(Operate)】(10%) (本部分应包括: 项目的成本效益分析,应用效果等的分析。 ) 这个实验花时间比较长,在做实验的过程中我们也遇到了很多困难,为一个bug而纠结了很久,但是通过和同学的交流讨论,我们发现并解决了问题。 在克服困难的过程中,我们学到了很多的东西,也积累了很多的经验,可以为以后的学习和实验中打下基础。 我们的程序基本实现了实验指导上的要求,但是对于健壮性的考虑还不够,我们一定会在以后的实验中,好好努力,尽最大的努力将程序完善 六、【代码】(10%) (本部分应包括: 完整的代码及充分的注释。 注意纸质的实验报告无需包括此部分。 格式统一为,字体: Georgia,行距: 固定行距12,字号: 小五) intmain() { intchoose; doublex,sum,y; pNodephead1=NULL; pNodephead2=NULL; pNodep,p2,phead,phead3=NULL; //pNodecreat_list(void); cout<<"********************************************************************************"< cout<<"欢? 迎®-使º1用®? 我¨°们? 的Ì? 多¨¤项? 式º? 计? 算? 器¡Â"< cout<<"请? 选? 择? 你? 想? 要°a的Ì? 操¨´作Á¡Â"< cout<<"1.加¨®法¤¡§运? 算? 2.减? 法¤¡§运? 算? "< cout<<"3.乘? 法¤¡§运? 算? 4.求¨®导Ì? 运? 算? "< cin>>choose; switch(choose) { case1: phead1=creat_list(); //phead2=creat_list(); sort(phead1); phead2=creat_list(); sort(phead2); cout<<"整? 理¤¨ª后¨®的Ì? 第̨²一°? 个? 多¨¤项? 式º? : êo"< traverse_list(phead1); cout<<"整? 理¤¨ª后¨®的Ì? 第̨²二t个? 多¨¤项? 式º? : êo"< traverse_list(phead2); //add(phead1,phead2); phead1=add(phead1,phead2); //sort(phead1); phead1=hebing(phead1); cout<<"最Á? 终? 的Ì? 结¨¢果? : êo"< traverse_list(phead1); break; case2: phead1=creat_list(); //phead2=creat_list(); sort(phead1); phead2=creat_list(); sort(phead2); cout<<"整? 理¤¨ª后¨®的Ì? 第̨²一°? 个? 多¨¤项? 式º? : êo"< traverse_list(phead1); cout<<"整? 理¤¨ª后¨®的Ì? 第̨²二t个? 多¨¤项? 式º? : êo"< traverse_list(phead2); phead1=sub(phead1,phead2); phead1=hebing(phead1); cout<<"最Á? 终? 的Ì? 结¨¢果? : êo"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 云南大学 软件 学院 一元 稀疏 多项式 计算器
![提示](https://static.bingdoc.com/images/bang_tan.gif)