收藏 分享(赏)

多项式类的设计与实现(MFC).doc

上传人:精品资料 文档编号:8498587 上传时间:2019-06-30 格式:DOC 页数:32 大小:620.50KB
下载 相关 举报
多项式类的设计与实现(MFC).doc_第1页
第1页 / 共32页
多项式类的设计与实现(MFC).doc_第2页
第2页 / 共32页
多项式类的设计与实现(MFC).doc_第3页
第3页 / 共32页
多项式类的设计与实现(MFC).doc_第4页
第4页 / 共32页
多项式类的设计与实现(MFC).doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、封 皮题目:班级:姓名:学号:日期:课 程 设 计 任 务 书学院 专业学生姓名 学号设计题目 多项式类的设计与实现内容及要求:开发多项式类 Polynomial,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如:2x 4的指数为 4,系数为 2。请开发一个完整的 Polynomial 类,包括构造函数、析构函数以及“get”函数(读取值)和“set”函数(设置值) 。该类还要提供以下重载的运算符:(1) 重载加法运算符,将两个多项式相加。(2) 重载加法运算符,将两个多项式相减。(3) 重载赋值运算符,将一个多项式赋给另外一个多项式。(4) 重载加法运算符*,将两个多项式相乘

2、。(5) 编写一个主函数测试多项式类的上述功能。进度安排:第 17 周:分析题目,查阅课题相关资料,进行类设计、算法设计;第 18 周:程序的设计、调试与实现;第 19 周:程序测试与分析,撰写课程设计报告,进行答辩验收。指导教师(签字):年 月 日学院院长(签字)年 月 日目 录1 需求分析 .- 1 -2 算法基本原理 .- 1 -3 类设计 .- 2 -4 详细设计 .- 2 -4.1 类的接口设计 .- 2 -4.2 类的实现 .- 3 -4.3 主函数设计 .- 12 -5 DOS 界面程序运行结果及分析 .- 14 -5.1 程序运行结果 .- 14 -5.2 运行结果分析 - 1

3、5 -6 基于 MFC 的图形界面程序开发 .- 15 -6.1 基于 MFC 的图形界面程序设计 .- 15 -6.2 程序测试 .- 27 -6.3 MFC 程序编写总结 .- 29 -7 参考文献 .- 29 - 1 -1 需求分析(1) 开发多项式类 Polynomial,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如:2x 4的指数为 4,系数为 2。请开发一个完整的 Polynomial 类,包括构造函数、析构函数以及“get”函数(读取值)和“set”函数(设置值) 。(2)多项式的定义:n 个单项式的代数和叫多项式。(3)程序测试数据:P1:2x+3x2+2x

4、4+3x2P2:3x2+2x3(1)2 算法基本原理设有 2 个多项式 p1,p2P1:2x+3x2+2x4+3x2P2:3x2+2x3实现多项式 p1 和 p2 的计算,关键是对 p1 和 p2 的指数和系数进行加减生的操作,我们可以先编辑一个基类 Polynominal。通过链表和重载运算符的方法来实现。(1)多项式即个个单项式的和,我们可以把一个多项式分解成一项一项来看,每一项用链表的一个节点表示,每个节点包括一个单项式的系数、指数和指向该节点类型的一个指针。(2)用 Polynominal 创建对象 p1、p2、p3,通过调用 Create(c1,e1,size1)函数来构建多项式。(

5、3)通过重载+、-、*以及=运算符,对多项式进行操作。(4)通过 p1.Print()来显示结果。- 2 -3 类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是多项式运算。可以定义一个多项式类 Polynominal。(1)该类包括私有数据成员 Node *head,Node 是构造的节点类型的结构体,包括系数、指数和指向该节点类型的一个指针。(2)成员函数包括 Polynominal()/构造函数, Polynominal(const Polynominal /读取指数为 e 的项 ,返回其指针, void set(double c,int e);/设置指数为 e 的项的系数为c

6、, void Create(double *c,int *e,int n);/创建多项式,friend Polynominal operator +(Polynominal a,Polynominal b);/重载+运算符, friend Polynominal operator -(Polynominal a,Polynominal b);/重载-运算符, friend Polynominal operator *(Polynominal a,Polynominal b);/重载*运算符,friend ostreamif (p) delete p;p=q;head=NULL;Node* ge

7、t(int e);/读取指数为 e 的项,返回其指针void set(double c,int e);/设置指数为 e 的项的系数为 cvoid Create(double *c,int *e,int n);/创建多项式friend Polynominal operator +(Polynominal a,Polynominal b);/重载+运算符friend Polynominal operator -(Polynominal a,Polynominal b);/重载-运算符friend Polynominal operator *(Polynominal a,Polynominal b)

8、;/重载*运算符friend ostream/指数double coef;/系数Node *next;void Polynominal:Copy(const Polynominal p=a.head;s=head=0;while(p)t=new Node;if (head=0) head=t;t-coef=p-coef;t-exp=p-exp;p=p-next;if(s) s-next=t;s=t;if (s) s-next=0;Polynominal:Polynominal(const Polynominalvoid Polynominal:Create(double *c,int *e,i

9、nt n)/创建多项式if (ncoef=c0;head-exp=e0;Node *q,*p=head;for (int i=1;icoef=ci;q-exp=ei;p-next=q;p=q;p-next=0;Node* Polynominal:get(int e)/读取指数为 e 的项Node *p=head;while (p)if (p-exp=e) return p;p=p-next;return p;/没有找到,返回空指针void Polynominal:set(double c,int e)/将指数为 e 系数为 c 的项加入多项式(原多项式无指数为 e 的项 )Node *q,*p

10、,*t;t=new Node;t-coef=c;t-exp=e;- 6 -if (head=0)head=t;head-next=0;return;if (ehead-exp)t-next=head;head=t;/插入头部return;p=head;while (p p=p-next;if (p)/新的项插入 p 所指结点前t-next=p;q-next=t;else/插入尾部q-next=t;t-next=0;Polynominal operator +(Polynominal a,Polynominal b)/重载+运算符Polynominal temp;Node *p,*q,*s,*t

11、;- 7 -double x;s=new Node;temp.head=s;/先增加一个头结点p=a.head;q=b.head;while (p if (x!=0.0)t=new Node;t-exp=p-exp;t-coef=x;s-next=t;s=t;p=p-next;q=q-next;else t=new Node;if(p-expq-exp)t-coef=p-coef;t-exp=p-exp; p=p-next;elset-coef=q-coef;t-exp=q-exp;q=q-next;- 8 -s-next=t;s=t;if (q) p=q;/p 恒指向余下的项while (p

12、)t=new Node;t-coef=p-coef;t-exp=p-exp;s-next=t;s=t;p=p-next;s-next=0; /链表尾标记s=temp.head;temp.head=s-next;delete s; /删除多余的头结点return temp;Polynominal operator -(Polynominal a,Polynominal b)/重载-运算符Polynominal temp;Node *p,*q,*s=0,*t;/在此处添加代码,完成此函数(模仿上述重载“+“的函数)double x;s=new Node;temp.head=s;/先增加一个头结点p

13、=a.head;q=b.head;while (p if (x!=0.0)t=new Node;t-exp=p-exp;t-coef=x;s-next=t;s=t;p=p-next;q=q-next;else t=new Node;if(p-expq-exp)t-coef=p-coef;t-exp=p-exp; p=p-next;elset-coef=-q-coef;t-exp=q-exp;q=q-next;s-next=t;s=t;if (q) p=q;/p 恒指向余下的项while (p)- 10 -t=new Node;t-coef=p-coef;t-exp=p-exp;s-next=t

14、;s=t;p=p-next;s-next=0; /链表尾标记s=temp.head;temp.head=s-next;delete s; /删除多余的头结点return temp;Polynominal operator *(Polynominal a,Polynominal b)/重载*运算符Polynominal temp;Node *p,*q,*s;int e;double c;p=a.head;while (p)q=b.head;while (q)c=p-coef*q-coef;e=p-exp+q-exp;s=temp.get(e);/查 temp 中有无指数为 e 的项if (s)/

15、temp 中无指数为 e 的项s-coef+=c;else/temp 中无指数为 e 的项temp.set(c,e);q=q-next;p=p-next;- 11 -return temp;ostreamdelete p;p=s;Copy(a);return *this;void Polynominal:Print(ostreamint e;if (head)e=head-exp;- 12 -oscoef;if (e1) osnext;while (p)e=p-exp;if (p-coef!=0.0)/系数非零if (p-coef0.0) oscoef;else oscoef;if (e1)

16、osnext;ossize1;coutc1i;coute1i;coutsize2;coutc2i;coute2i;Polynominal p1,p2,p3;p1.Create(c1,e1,size1);/创建多项式 p1p2.Create(c2,e2,size2);/创建多项式 p2coutnext=f(m_expn2,m_coef2);d2=d2-next;elseh2=f(m_expn2,m_coef2);d2=h2;m_screen2.Format(“%s“,show(h2);UpdateData(false); 编写显示的消息处理函数,具体代码如下:CString show(node

17、*h)/显示函数node *t=h;- 20 -CString e,c,w,u,x,v;while(t)/多项式的显示if(t-coef=0)/多项式的项系数等于 0 的情况v=v;else if(t-coef0)/多项式的项系数大于 0 的情况w.Format(“%s“,“+“);c.Format(“%g“,t-coef);x.Format(“%s“,“X“);u.Format(“%s“,“);e.Format(“%d“,t-expn);if(t-coef=1)if(t-expn=1)if(h=t)/该项是否是显示的第一位v=v+x;elsev=v+w+x;else if(t-expn=0)

18、if(h=t)v=v+c;elsev=v+w+c;elseif(h=t)v=v+x+u+e;- 21 -elsev=v+w+x+u+e;elseif(t-expn=0)if(h=t)v=v+c;elsev=v+w+c;else if(t-expn=1)if(h=t)v=v+c+x;elsev=v+w+c+x;elseif(h=t)v=v+c+x+u+e;elsev=v+w+c+x+u+e;else if(t-coefcoef);x.Format(“%s“,“X“);- 22 -u.Format(“%s“,“);e.Format(“%d“,t-expn);if(t-coef=-1)if(t-ex

19、pn=0)v=v+c;else if(t-expn=1)v=v+w+x;elsev=v+w+x+u+e;elseif(t-expn=0)v=v+c;else if(t-expn=1)v=v+c+x;elsev=v+c+x+u+e;t=t-next;if(v=“)v=“0“;return v; 编写加,减法运算的消息处理函数,具体代码如下:node *add(node *p1,node *p2)/多项式加法运算node *h,*q1,*q2,*t,*k;- 23 -q1=p1;q2=p2;h=k=new node;k-next=p1;while(q1 q1=q1-next;k=k-next;t=

20、q2;q2=q2-next;delete t;else if(q1-expnq2-expn)/第一项的指数比第二项指数大的情况k-next=q2;t=q2-next;q2-next=q1;k=k-next;q2=t;else if(q1-expnexpn)/第一项的指数比第二项指数小的情况q1=q1-next;k=k-next;if(q2)k-next=q2;t=h;h=h-next;- 24 -delete t;return h; 编写乘法运算处理函数,具体代码如下:node *multiply(node *p1,node *p2)node *i,*j,*k,*s,*l,*m,*n;/乘法算

21、法i=p1;j=p2;m=j;/保存 j 的头结点k=f(0,0);/保存 k 为头结点while(i)/创建乘法计算结果链表,形成头结点为 k 的链表 j=m;while(j)/乘法计算算法,并实现升序排序 l=f(0,0);/新计算结果保存在一个单独结点中,用于对之前生成的链表进行对比,形成升序排列l-coef=(i-coef)*(j-coef);l-expn=(i-expn)+(j-expn);n=k ;s=k-next;/s 用于对链表的遍历, n 为 s 前驱while(s)if(l-expn=s-expn)s-coef+=l-coef;delete l;break;else if(

22、l-expnexpn)n-next=l;- 25 -l-next=s;break;elsen=n-next;s=s-next;if(s=NULL)n-next=l;j=j-next;i=i-next;return k-next; 编写构造多项式具体代码如下:struct nodeint expn;float coef;node *next;/结点结构体node *f(int a,float b)node *p=new node;- 26 -p-coef=b;p-expn=a;p-next=NULL;return p;/创建结点node *copy(node *p)/复制链表的函数node *h

23、,*d,*q,*k,*s;h=f(0,0);/创建头结点,留空,为了能得到与新创建的结点对比的结点(即是 k)的前驱q=p;while(q)d=f(q-expn,q-coef);/创建新结点s=h;k=s-next;/s 是前驱,k 是与 d 做比较的while(k)if(k-expn=d-expn)k-coef+=d-coef;delete d;break;else if(k-expnexpn)k=k-next;s=s-next;else if(k-expnd-expn)s-next=d;d-next=k;break;if(!k)- 27 -s-next=d;q=q-next;return h-next;6.2 程序测试运行程序后,首先出现的界面如图 8 所示。图 8 程序初始运行界面单击添加按钮后,可将多项式在界面上显示出来,如图 9 所示。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报