多项式类的设计与实现MFC_第1页
多项式类的设计与实现MFC_第2页
多项式类的设计与实现MFC_第3页
多项式类的设计与实现MFC_第4页
多项式类的设计与实现MFC_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

3、. .6.3 MFC程序编写总结 .7 参考文献 .1 需求分析(1) 开发多项式类 Polynomial ,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如: 2x4 的指数为 4,系数为 2。请开发一个完整的Polynomial 类,包括构造函数、析构函数以及“ get ”函数(读取值)和“ set ” 函数(设置值)。(2) 多项式的定义: n 个单项式的代数和叫多项式。(3) 程序测试数据 :P1:2x+3x2+2x4+3x2P2:3x2+2x3(1)2 算法基本原理设有 2 个多项式 p1,p2P1:2x+3x2+2x4+3x2P2:3x2+2x3实现多项式 p1 和

4、 p2 的计算,关键是对 p1 和 p2 的指数和系数进行加减生的操作,我们可以先编辑一个基类 Polynominal 。通过链表和重载运算符的方法来实现。( 1)多项式即个个单项式的和,我们可以把一个多项式分解成一项一项来看,每一项用链表的一个节点表示, 每个节点包括一个单项式的系数、 指数和指向该节点类型的一个指针。( 2)用 Polynominal 创建对象 p1、p2、 p3,通过调用 Create(c1,e1,size1) 函数来构建多项式。( 3)通过重载 +、 - 、 * 以及 =运算符,对多项式进行操作。( 4)通过 p1.Print() 来显示结果。3 类设计从上面的算法分析

5、可以看到,本设计面临的计算问题的关键是多项式运算。可以定义一个多项式类Polynominal 。(1)该类包括私有数据成员Node *head,Node是构造的节点类型的结构体,包括系数、指数和指向该节点类型的一个指针。( 2 )成员函数包括 Polynominal()/构 造函 数, Polynominal(constPolynominal &)/拷贝构造函数, Polynominal()/析构函数 Node* get(inte);/ 读取指数为 e 的项 , 返回其指针, void set(double c,int e);/设置指数为 e 的项的系数为 c, void Create

6、(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 ostream& operator<<(ostream&os, const P

7、olynominal&a);Polynominal&operator =(Polynominala);/重 载 = 运 算 符 , voidPrint(ostream& os = cout) const;/显示函数 void Copy(const Polynominal&a)/ 复制函数对以上进行总结,该程序只包含一个类即 Polynomina ,对多项式的所有操作都抽象在该类中。4 详细设计程序主要分为三个部分:类声明、类实现、主函数。4.1 类的接口设计/ 类的声明class Polynominalpublic:Polynominal() head=0; /

8、构造函数Polynominal(const Polynominal &);/拷贝构造函数Polynominal()Node *q,*p;p=head;while (p)/删除链表q=p->next;if (p) delete p;p=q;head=NULL;Node* get(int e);/读取指数为 e 的项 , 返回其指针void set(double c,int e);/设置指数为 e 的项的系数为void Create(double *c,int *e,int n);/创建多项式friend Polynominal operator +(Polynominal a,Po

9、lynominal b);/c重载+运算符friend Polynominal operator -(Polynominal a,Polynominal b);/重载- 运算符friend Polynominal operator *(Polynominal a,Polynominal b);/重载* 运算符friend ostream& operator<<(ostream& os, const Polynominal& a);Polynominal& operator =(Polynominal a);/ 重载 =运算符 void Print(o

10、stream& os = cout) const; void Copy(const Polynominal &a);void Addr()cout<<"链表头指针值为: "<<head<<endl;private:Node *head;/;链表头指针在程序中,声明了个个运算符的重载,通过e 的项 , 返回其指针,通过void set(double c,int e)Node* get(int e); 设置指数为读取指数为 e 的项的系数为 c,多项式的的系数、指数以及指针全部采用了动态内存分配技术,这些工作都是由构造函数和

11、Create() 函数完成,它们的清理工作在析构函数中完成。4.2 类的实现/ 类实现#include <iostream.h>#include <cstdlib>#include <cmath>#define MAXSIZE 15struct Node/链表结点int exp;/指数double coef;/系数Node *next;void Polynominal:Copy(const Polynominal &a) / 复制对象 ( 公用函数 ) Node *t,*s,*p; p=a.head;s=head=0; while(p)t=new N

12、ode;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 Polynominal& a)/复制构造函数Copy(a);void Polynominal:Create(double *c,int *e,int n)/创建多项式if (n<1)cout<<"错误:要创建多项式的项数必须大于零。n"else

13、head=new Node;/创建头结点head->coef=c0;head->exp=e0;Node *q,*p=head;for (int i=1;i<n;i+)q=new Node;q->coef=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

14、(double c,int e)/将指数为e 系数为c 的项加入多项式 ( 原多项式无指数为e 的项 )Node *q,*p,*t;t=new Node;t->coef=c;t->exp=e;if (head=0)head=t;head->next=0;return;if (e>head->exp)t->next=head;head=t;/插入头部return;p=head;while (p && e<p->exp)q=p;p=p->next;if (p)/ 新的项插入 p 所指结点前t->next=p;q->n

15、ext=t;else/插入尾部q->next=t;t->next=0;Polynominal operator +(Polynominal a,Polynominal b)/重载 +运算符Polynominal temp;Node *p,*q,*s,*t;double x;s=new Node;temp.head=s;/ 先增加一个头结点 p=a.head;q=b.head;while (p && q)if (p->exp=q->exp)x=p->coef+q->coef;if (x!=0.0)t=new Node;t->exp=p-&

16、gt;exp;t->coef=x;s->next=t;s=t;p=p->next;q=q->next;elset=new Node;if(p->exp>q->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)t=new Node;t->coef=p->coef;t-&

17、gt;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

18、=s;/ 先增加一个头结点 p=a.head;q=b.head;while (p && q)if (p->exp=q->exp)x=p->coef-q->coef;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;elset=new Node;if(p->exp>q->exp)t->coef=p->coef;t->exp=p->exp;p=p->next;else

19、t->coef=-q->coef;t->exp=q->exp;q=q->next;s->next=t;s=t;if (q) p=q;/p恒指向余下的项while (p)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 *(Polynomin

20、al 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)/temp中无指数为 e 的项s->coef+=c;else/temp中无指数为 e 的项temp.set(c,e);q=q->next;p=p->next;return temp;ostre

21、am& operator<<(ostream& os, const Polynominal& a)a.Print(os);return os;Polynominal& Polynominal:operator =(Polynominal a)/重载 =运算符Node *s,*p;if (head) / 若原多项式存在,先撤消它p=head;while (p)s=p->next;delete p;p=s;Copy(a);return *this;void Polynominal:Print(ostream& os) const/显示多项式

22、Node* p;int e;if (head)e=head->exp;os<<"f(x)="<<head->coef;if (e>1) os<<"x"<<e;if (e=1) os<<"x"elseos << "f(x)=0" << endl;return;p=head->next;while (p)e=p->exp;if (p->coef!=0.0)/系数非零if (p->coef>

23、0.0) os<<'+'<<p->coef;else os<<p->coef;if (e>1) os<<"x"<<e;if (e=1) os<<"x"p=p->next;os<<endl;通过类的成员函数实现对多项式的运算,构造和析构函数主要是实现初始化以及销毁,其它函数则主要是实现功能。4.3 主函数设计/ 主函数int main()int e1MAXSIZE,e2MAXSIZE,size2,size1,i;double c1MA

24、XSIZE,c2MAXSIZE;cout<<"-多项式计算器 -"<<endl;cout<<"请输入多项式P1的项数: "cin>>size1;cout<<"请输入多项式P1的系数: "for(i=0;i<size1;i+)cin>>c1i;cout<<"请输入多项式p1 的指数 "for(i=0;i<size1;i+)cin>>e1i;cout<<"请输入多项式P2的项数: "

25、;cin>>size2;cout<<"请输入多项式p2 的系数 "for(i=0;i<size2;i+)cin>>c2i;cout<<"请输入多项式p2 的指数 "for(i=0;i<size2;i+)cin>>e2i;Polynominal p1,p2,p3;p1.Create(c1,e1,size1);/创建多项式 p1p2.Create(c2,e2,size2);/创建多项式 p2cout<<"多项式 p1 为"p1.Print();cout&l

26、t;<endl;/ 显示多项式 p1cout<<"多项式 p2 为"p2.Print();cout<<endl;/ 显示多项式 p2p3 = p1 + p2;cout<<"多项式 p1+p2 为"<< p3<<endl;/显示多项式的和p3 = p1 - p2;cout<<"多项式 p1-p2 为"<< p3<<endl;/显示多项式的差p3 = p1*p2;cout<<"多项式 p1*p2 为"<

27、;<p3<<endl;/显示多项式的积return 0;在程序的主函数部分,对算法进行了验证。首先, 输入了多项式的系数指数项数,接着定义三个对象 p1,p2, p3,在定义过程中调用构造函数,进行初始化并动态分配了内存。 调用 Print() 显示多项式,通过调用重载运算符实现操作,最后系统自动调用析构函数清理。5 DOS 界面程序运行结果及分析5.1 程序运行结果程序运行结果如图2 所示。图 2 程序运行结果通过计算对运行结果进行检测,经检测结果正确无误。5.2 运行结果分析整个程序采用的是链表和动态内存分配方式。将多项式的运算抽象到一个类Polynominal中,由该类

28、生成三个对象p1,p2, , p3,同时由系统调用构造函数初始化,调用Creat()构造多项式,调用重载的运算符,实现加减乘的操作,由于涉及对象传值,调用拷贝构造函数。6 基于 MFC的图形界面程序开发MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与 DOS界面程序的主要不同点是:MFC图形界面程序与 DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin ,cout 等 I/O 流实现,而 MFC的图形程序界面采用标准 Windows窗口和控件实现输入输出,因此必须在 MFC类的框架下加入上面所设计的矩阵和方程组类,并通过

29、图形界面的输入输出改造来完成。6.1 基于 MFC 的图形界面程序设计( 1)界面设计首先在 VC中建立 MFC AppWizard(exe)工程,名称为一元稀疏多项式运算,并在向导的 Step1 中选择 Single document,即建立基于对话框的应用程序,如下图 45 所示。图 4 建立 MFC AppWizard(exe)工程图 5建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6 所示。图 6方程组求解程序界面设计图 6 所示的界面中包含了3 个 Group Box( 分组框 ) , 4 个 StaticText 控件,5 个 Button控件,和

30、 9 个 Edit Box控件,控件的基本信息列表如下表1 所示。表 1控件基本信息控件类控件ID控件 说明别Caption项系数StaticIDC_STATIC项指数Text项系数项指数IDC_addmenber1添加IDC_addmenber2添加BottonIDC_add加法运算IDC_sub减法运算IDC_multiply乘法运算IDC_EDIT1显示多项式 p1IDC_EDIT4显示多项式 p2Edit BoxIDC_EDIT7显示加法运算结果IDC_EDIT8显示减法运算结果IDC_EDIT9显示乘法运算结果IDC_EDIT2输入每一项的系数IDC_EDIT3输入每一项的指数IDC

31、_EDIT5输入每一项的系数IDC_EDIT6输入每一项的指数GroupBoxIDC_STATIC一元多项式1IDC_STATIC一元多项式1IDC_STATIC运算结果( 2)代码设计为了能够将对话框界面上的控件能够与代码联系起来,需要为各个控件建立Member Variables ,按 Ctrl+w键进入MFC ClassWizard 界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图7 所示。图 7 成员变量设置界面通过该界面设置控件对应的成员变量,具体如表2 所示。表 2控件基本信息控件 ID成员变量类成员变量名称型IDC_EDIT1CStringm_scre

32、en1IDC_EDIT2floatm_coef1I IDC_EDIT3intm_expn1IDC_EDIT4CStringm_screen2IDC_EDIT5floatm_coef2IDC_EDIT6intm_expn2IDC_EDIT7CStringm_screen3IDC_EDIT8CStringm_screen4IDC_EDIT9CStringm_screen5下面是编写代码的重要阶段, 可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。 建立名为一元稀疏多项式计算的MFC工程。 将对话框资源中的默认对话框利用工具箱改造。 设置控件对应的成

33、员变量。 编写添加按钮的响应函数,具体代码如下:void CMyDlg:Onaddmenber2() UpdateData(true);if(h2)/创建链表d2->next=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 *h)/显示函数node *t=h;CString e,c,w,u,x,v;while(t)

34、/多项式的显示if(t->coef=0)/多项式的项系数等于0 的情况v=v;else if(t->coef>0)/多项式的项系数大于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

35、)if(h=t)/该项是否是显示的第一位v=v+x;elsev=v+w+x;else if(t->expn=0)if(h=t)v=v+c;elsev=v+w+c;elseif(h=t)v=v+x+u+e;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->coef<0)/多项式系数小于0 的情况w.Form

36、at("%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=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(

37、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;q1=p1;q2=p2;h=k=new node;k->next=p1;while(q1 && q2)if(q1->expn=q2->expn)/指数相同的情况q1->coef=q1->coef+q2-&g

38、t;coef;q1=q1->next;k=k->next;t=q2;q2=q2->next;delete t;else if(q1->expn>q2->expn)/第一项的指数比第二项指数大的情况k->next=q2;t=q2->next;q2->next=q1;k=k->next;q2=t;else if(q1->expn<q2->expn)/第一项的指数比第二项指数小的情况q1=q1->next;k=k->next;if(q2)k->next=q2;t=h;h=h->next;delete

39、 t;return h; 编写乘法运算处理函数,具体代码如下:node *multiply(node *p1,node *p2)node *i,*j,*k,*s,*l,*m,*n;/乘法算法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->

40、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(l->expn<s->expn)n->next=l;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 ex

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论