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

下载本文档

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

文档简介

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

2、函数测试多项式类的上述功能。进度安排:第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运行结果分析- 15 -6 基于MFC的图形界面程序开发- 15 -6.1 基于MFC的图形

3、界面程序设计- 15 -6.2 程序测试- 27 -6.3 MFC程序编写总结- 29 -7 参考文献- 29 -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+2x

4、3实现多项式p1和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(const Polynominal &)/拷贝构造函数,Polynominal()/析构函数Node* get(int e);/读取指数为e的项,返回其指针,void set(double c,int e);/设置指数为e的项的系数为c, void Create(double *c,int *e,int n);/创建多项式,fr

6、iend 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 Polynominal& a);Polynominal& oper

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

8、构造函数 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的项的系数为c void Create(double *c,int *e,int n);/创建多项式 friend Polynominal operator +(Polynominal a,Polynominal b);/重载+运算符 friend Polynomin

9、al 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(ostream& os = cout) const; void Cop

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

11、clude <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 Node; if (head=0) head=t; t->coef=p->coef

12、; 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 head=new Node;/创建头结点 head->coef=c0;

13、 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(double c,int e)/将指数为e系数

14、为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->next=t; else/插

15、入尾部 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; else t=new Node; if(p->exp>q->exp) t->coef=p->coef; t->exp=p->exp; p=p->next; else 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-&g

17、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; /在此处添加代码,完成此函数(模仿上述重载"+"的函数) dou

18、ble 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->exp; t->coef=x; s->next=t; s=t; p=p->next; q=q->next; else t=new Node; if(p->exp>q->exp) t->coef=p->

19、coef; t->exp=p->exp; p=p->next; else 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;

20、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)/temp中无指数为e的项 s->coef+=c; else/te

21、mp中无指数为e的项 temp.set(c,e); q=q->next; p=p->next; return temp;ostream& 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

22、; p=s; Copy(a); return *this;void Polynominal:Print(ostream& os) const/显示多项式 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" else os << "f(x)=0" << endl

23、; return; p=head->next; while (p) e=p->exp; if (p->coef!=0.0)/系数非零 if (p->coef>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;通过类的成员函数实现对多项式的运算,构造和析构函数

24、主要是实现初始化以及销毁,其它函数则主要是实现功能。4.3 主函数设计/主函数int main()int e1MAXSIZE,e2MAXSIZE,size2,size1,i;double c1MAXSIZE,c2MAXSIZE;cout<<"-多项式计算器-"<<endl;cout<<" 请输入多项式P1的项数:"cin>>size1;cout<<" 请输入多项式P1的系数:"for(i=0;i<size1;i+)cin>>c1i;cout<<&

25、quot; 请输入多项式p1的指数"for(i=0;i<size1;i+)cin>>e1i;cout<<" 请输入多项式P2的项数:"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,s

26、ize1);/创建多项式p1 p2.Create(c2,e2,size2);/创建多项式p2 cout<<"多项式p1为" p1.Print(); cout<<endl;/显示多项式p1 cout<<"多项式p2为" p2.Print(); cout<<endl;/显示多项式p2 p3 = p1 + p2; cout<<"多项式p1+p2为"<< p3<<endl;/显示多项式的和 p3 = p1 - p2; cout<<"多项式

27、p1-p2为"<< p3<<endl;/显示多项式的差 p3 = p1*p2; cout<<"多项式p1*p2为"<<p3<<endl;/显示多项式的积 return 0;在程序的主函数部分,对算法进行了验证。首先,输入了多项式的系数指数项数,接着定义三个对象p1,p2,p3,在定义过程中调用构造函数,进行初始化并动态分配了内存。调用Print()显示多项式,通过调用重载运算符实现操作,最后系统自动调用析构函数清理。5 DOS界面程序运行结果及分析5.1 程序运行结果程序运行结果如图2所示。图2 程序运行

28、结果通过计算对运行结果进行检测,经检测结果正确无误。5.2运行结果分析整个程序采用的是链表和动态内存分配方式。将多项式的运算抽象到一个类Polynominal中,由该类生成三个对象p1,p2,,p3,同时由系统调用构造函数初始化,调用Creat()构造多项式,调用重载的运算符,实现加减乘的操作,由于涉及对象传值,调用拷贝构造函数。6 基于MFC的图形界面程序开发MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序与DOS界面程序的主要不同点是:MFC图形界面程序与DOS界面程序的输入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过cin,cout等I

29、/O流实现,而MFC的图形程序界面采用标准Windows窗口和控件实现输入输出,因此必须在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。6.1 基于MFC的图形界面程序设计(1)界面设计首先在VC中建立MFC AppWizard(exe)工程,名称为一元稀疏多项式运算,并在向导的Step1中选择 Single document,即建立基于对话框的应用程序,如下图45所示。图4 建立MFC AppWizard(exe)工程图5 建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6所示。图6 方程组求解程序界面设计图6所示的界面中

30、包含了3个Group Box(分组框),4个Static Text控件, 5个Button控件,和9个Edit Box控件,控件的基本信息列表如下表1所示。表1 控件基本信息控件类别控件ID控件Caption说明Static TextIDC_STATIC项系数项指数项系数项指数BottonIDC_addmenber1添加IDC_addmenber2添加IDC_add加法运算IDC_sub减法运算IDC_multiply乘法运算Edit BoxIDC_EDIT1显示多项式p1IDC_EDIT4显示多项式p2IDC_EDIT7显示加法运算结果IDC_EDIT8显示减法运算结果IDC_EDIT9显示

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

32、ID成员变量类型成员变量名称IDC_EDIT1CStringm_screen1IDC_EDIT2floatm_coef1I IDC_EDIT3intm_expn1IDC_EDIT4CStringm_screen2IDC_EDIT5floatm_coef2IDC_EDIT6intm_expn2IDC_EDIT7CStringm_screen3IDC_EDIT8CStringm_screen4IDC_EDIT9CStringm_screen5下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的控制台应用程序的代码,并将其作必要的改写,具体改写的步骤与内容如下。 建立名为一元稀疏多项式计算的MF

33、C工程。 将对话框资源中的默认对话框利用工具箱改造。 设置控件对应的成员变量。 编写添加按钮的响应函数,具体代码如下: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)/显示函数no

34、de *t=h;CString e,c,w,u,x,v;while(t)/多项式的显示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->exp

35、n);if(t->coef=1)if(t->expn=1)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; else v=v+w+c+x+u+e;else i

36、f(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=0)v=v+c;else if(t->expn=1)v=v+w+x;elsev=v+w+

37、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;q1=p1;q2=p2;h=k=new node; k->next=p1;while(q1 && q2)if(q1->expn=q2->e

38、xpn)/指数相同的情况q1->coef=q1->coef+q2->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

39、(q2)k->next=q2;t=h;h=h->next;delete 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->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

温馨提示

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

评论

0/150

提交评论