一元稀疏多项式简单计算器.docx
- 文档编号:23097013
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:16
- 大小:278.86KB
一元稀疏多项式简单计算器.docx
《一元稀疏多项式简单计算器.docx》由会员分享,可在线阅读,更多相关《一元稀疏多项式简单计算器.docx(16页珍藏版)》请在冰豆网上搜索。
一元稀疏多项式简单计算器
数据结构课程设计
系别
计算机与通信工程学院
专业
计算机科学与技术
班级学号
姓名
指导教师
成绩
2012年7月12日
一、需求分析
1、问题描述:
(需求分析和背景意义)
设计一个一元稀疏多项式简单计算器.
2、基本要求:
(设计阶段,概要设计和详细设计)
一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式;
(2)输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列;
(3)多项式a和b相加,建立多项式a+b;(4)多项式a和b相减,建立多项式a-b.
3、测试数据:
(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)
(6x-3-x+4.4x-2-1.2x9)-(-6x-3+5.4x2-x2+7.8x15)
(1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
(x+x3)+(-x-x3)=0
(x+x100)+(x100+x200)=(x+2x100+x200)
(x+x2+x3)+0=x+x2+x3
互换上述测试数据中的前后两个多项式
4、实现提示:
用带表头结点的单链表存储多项式
5、选做内容:
(1)计算多项式在x处的值.
(2)求多项式a的导函数a′.
(3)多项式a和b相乘,建立乘积多项式ab.
(4)多项式的输出形式为类数学表达式.例如,多项式-3x8+6x3-18的输出形式为-3x∧8+6x∧3-18,x15+(-8)x7-14的输出形式为x∧15-8x∧7-14.注意,系数值为1的非零次项的输出形式中略去系数1,如项1x8的输出形式为x8,项-1x3的输出形式为-x3.
(5)计算器的仿真界面.
二、详细设计
本程序采用VS2010编写,开始创建了一个工程,本程序的文件有:
头文件:
define.h用以定义全局变量
function.h用以声明函数
源文件:
function.cpp用以定义函数
main.cpp主函数
下面罗列每个文件主要代码
define.h
#ifndefDEFINE_H
#defineDEFINE_H
#include
usingnamespacestd;
#include
structlinklistmultinomial
{
floata;
inte;
structlinklistmultinomial*next;
};
typedefstructlinklistmultinomial*linklist,node;
#endif
function.h
#ifndefFUNCTION_H
#defineFUNCTION_H
#include"define.h"
voidwelcome();
voidgoodbye();
linklistcreatelinklist(linklisthead,intn);
voidinsert(linklistp,linklisthead);
voidprintlinklist(linklisthead);
voidaddlinklist(linklistpa,linklistpb);
voidsublinklist(linklistpa,linklistpb);
voiddlinklist(linklistpa);
voidcalclinklista(linklistpd,intx);
voidmenu();
#endif
function.cpp
#include"define.h"
//欢迎界面
voidwelcome()
{
cout<<"\n\n\n\n\n";
cout<<"*********************************************************************\n\n"< cout<<"一元稀疏多项式计算器\n\n"< cout<<"制作者: 王雨辰学号: 4100113\n\n"< cout<<"*********************************************************************\n\n\n\n\n\n\n"; cout<<"请输入请求\n\n"< cout<<"1.进入计算器0.退出\n\n"< } //结束界面 voidgoodbye() { system("cls"); cout<<"\n\n\n\n\n"< cout<<"*********************************************************************\n\n"< cout<<"谢谢使用,再见\n\n"< cout<<"*********************************************************************\n\n\n\n\n\n\n"; } //创建链表后按照次方从大到小插入 voidinsert(linklistp,linklisthead) { if(p->a==0)free(p); else { linklistp1,p2; p1=head; p2=p1->next; while(p2&&p2->e>p->e) { p1=p2; p2=p2->next; } if(p2&&p2->e==p->e) { p2->a=p2->a+p->a; free(p); if(p2->a==0){p1->next=p2->next;free(p2);} } else { p->next=p2; p1->next=p; } } } //创建链表 linklistcreatelinklist(linklisthead,intn) { linklistp; inti; p=head=(linklist)malloc(sizeof(node)); head->next=NULL; for(i=1;i<=n;i++) { p=(linklist)malloc(sizeof(node)); cout<<"请输入第"< cin>>p->a; cout<<"请输入第"< cin>>p->e; insert(p,head); } returnhead; } //输出函数 voidprintlinklist(linklisthead)s { linklistp=head->next; if(! p)cout<<"0"; else//处理首项,若系数为正,省略+ { if(p->a==1) { if(p->e==0)cout<<"1"; elsecout<<"x^"< } else if(p->a==0); else if(p->a<0) { if(p->e==0)cout< elsecout< } else { if(p->e==0)cout< elsecout< } p=p->next; } while(p) { if(p->a==1) { if(p->e==0)cout<<"+1"; elsecout<<"+x^"< } else if(p->a==-1) { if(p->e==0)cout<<"-1"; elsecout<<"-x^"< } else if(p->a==0); else if(p->a<0) { if(p->e==0)cout< elsecout< } else { if(p->e==0)cout<<'+'< elsecout<<'+'< } p=p->next; } cout< } //a+b voidaddlinklist(linklistpa,linklistpb) { linklistpc; linklistp1,p2,p3,p; p3=pc=(linklist)malloc(sizeof(node)); p1=pa->next; p2=pb->next; if(! (p1||p2))p3->next=NULL; else { while(p1||p2) { p=p3->next=(linklist)malloc(sizeof(node)); if(p1==NULL){p->a=p2->a;p->e=p2->e;p2=p2->next;} elseif(p2==NULL){p->a=p1->a;p->e=p1->e;p1=p1->next;} else { if(p1->e==p2->e) { p->a=p1->a+p2->a;p->e=p1->e;p1=p1->next;p2=p2->next; } elseif(p1->e>p2->e){p->a=p1->a;p->e=p1->e;p1=p1->next;} elseif(p1->e } if(p->a==0)free(p); elsep3=p; } p3->next=NULL; } printlinklist(pc); } //a-b voidsublinklist(linklistpa,linklistpb) { linklistpc; linklistp1,p2,p3,p; p3=pc=(linklist)malloc(sizeof(node)); p1=pa->next; p2=pb->next; if(! (p1||p2))p3->next=NULL; else { while(p1||p2) { p=p3->next=(linklist)malloc(sizeof(node)); if(p1==NULL){p->a=p2->a;p->e=p2->e;p2=p2->next;} elseif(p2==NULL){p->a=p1->a;p->e=p1->e;p1=p1->next;} else { if(p1->e==p2->e){p->a=p1->a-p2->a;p->e=p1->e;p1=p1->next;p2=p2->next;} elseif(p1->e>p2->e){p->a=p1->a;p->e=p1->e;p1=p1->next;} elseif(p1->e } if(p->a==0)free(p); elsep3=p; } p3->next=NULL; } if(pc->next->next==NULL&&pc->next->a==0)//若a-b=0,输出0 cout<<"0"< elseprintlinklist(pc); } //对a求导 voiddlinklist(linklistpa) { linklistpd; linklistp1,p4; p1=pa->next; p4=pd=(linklist)malloc(sizeof(node)); while(p1! =NULL) { p4->next=(linklist)malloc(sizeof(node)); p4=p4->next; if(p1->e==0){p4->a=0;p4->e=0;} elseif(p1->e==1){p4->a=p1->a;p4->e=0;} else{p4->e=p1->e-1;p4->a=p1->a*p1->e;} p1=p1->next; } p4->next=NULL; printlinklist(pd); } //计算多项式在x处的值 voidcalclinklista(linklistpe,intx) { intsum=0,t,i; linklistp5; for(p5=pe->next;p5;p5=p5->next) { t=1; for(i=p5->e;i! =0;) { if(i<0){t/=x;i++;}//指数小于0,进行除法 else{t*=x;i--;}//指数大于0,进行乘法 } sum+=p5->a*t; } cout< } //菜单 voidmenu() { intm,n,q=1,x; linklistpa=0,pb=0; cout<<"请输入多项式a的项数"< cin>>m; pa=createlinklist(pa,m); cout<<"请输入多项式b的项数"< cin>>n; pb=createlinklist(pb,n); cout<<"*********************************************************************\n\n"< cout<<"功能表\n\n"< cout<<"1.输出多项式a2.输出多项式b"< cout<<"3.输出a+b4.输出a-b"< cout<<"5.输出a的导数6.计算多项式a在x处的值"< cout<<"7.计算多项式b在x处的值0.返回主菜单\n\n"< cout<<"*********************************************************************\n\n\n\n\n\n\n"; while(q! =0) { cout<<"请输入命令"< cin>>q; switch(q) {case1: printlinklist(pa);break; case2: printlinklist(pb);break; case3: addlinklist(pa,pb);break; case4: sublinklist(pa,pb);break; case5: dlinklist(pa);break; case6: cout<<"输入x"< case7: cout<<"输入x"< case0: q=0;break; default: cout<<"输入错误,请重新输入"< } } 三、调试分析 在这个程序写完后的调试过程中,出现了以下问题: 1、printlinklist函数刚开是测试会出现首项系数为正,带加号的情况,加了个选择后解决此问题。 2、addlinklist,sublinklist函数当做完后结果为0的情况出现不显示的情况,原因是没有及时释放节点,于是加上了free(p)。 3、calclinklista要分清指数是正是负。 通过本次课程设计我更加了解了单链表是怎样应用的,并学会将数据插入链表,删除链表中的数据等等…… 四、用户手册 开始界面 然后根据提示输入多项式 然后根据功能表来选择 五、测试结果 (2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7) (1+x+x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5) (x+x100)+(x100+x200)=(x+2x100+x200) (x+x2+x3)+0=x+x2+x3 以上结果经过测试运行皆正确
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 一元 稀疏 多项式 简单 计算器
![提示](https://static.bdocx.com/images/bang_tan.gif)