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

下载本文档

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

文档简介

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

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

3、系数和一个指数.例如:2x4的指数为4,系数为2.请开发一个完整的 Polynomial类,包括构造函数、析构函数以及“ get函数(读取值)和“ set 函数(设置值).(2)多项式的定义:n个单项式的代数和叫多项式.(3)程序测试数据:P1:2x+3xA2+2xA4+3xA2P2:3xA2+2xA3(1)2算法根本原理设有2个多项式p1,p2P1:2x+3xA2+2xA4+3xA2P2:3xA2+2xA3实现多项式p1和p2的计算,关键是对p1和p2的指数和系数进行加减生的操作, 我们可以先编辑一个基类 Polynominal 0通过链表和重载运算符的方法来实现.(1)多项式即个个单项式的

4、和,我们可以把一个多项式分解成一项一项来看, 每一项用链表的一个节点表示,每个节点包括一个单项式的系数、指数和指向该 节点类型的一个指针.(2)用 Polynominal 创立对象 p1、p2、p3,通过调用 Create(c1,e1,size1) 函 数来构建多项式.(3)通过重载+、-、*以及=运算符,对多项式进行操作.(4)通过p1.Print() 来显示结果.3类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是多项式运算.可以定义一个多项式类 Polynominal 0(1)该类包括私有数据成员Node*head, Node是构造的节点类型的结构体, 包括系数、指数和指向该节

5、点类型的一个指针(2)成员函数包括 Polynominal()/ 构造函数, Polynominal(const Polynominal &)/拷贝构造函数,Polynominal()/ 析构函数 Node* get(inte);/读取指数为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 Po

6、lynominal 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

7、;/显示函数 void Copy(const Polynominal&a)/复制函数对以上进行总结,该程序只包含一个类即Polynomina ,对多项式的所有操作都抽象在该类中.4详细设计程序主要分为三个局部:类声明、类实现、主函数.4.1 类的接口设计/类的声明class Polynominal ( public:Polynominal() head=0; / 构造函数Polynominal(const Polynominal &);/ 拷贝构造函数 Polynominal() Node *q,*p;p=head;while (p)/删除链表 q=p->next;if

8、(p) delete p;p=q;)head=NULL;)Node* get(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 operato

9、r *(Polynominal a,Polynominal b);/重载*运算符friend ostream& operator<<(ostream& os, const Polynominal& a);Polynominal& operator =(Polynominal a);/重载=运算符void Print(ostream& os = cout) const;void Copy(const Polynominal &a);void Addr()cout<<"链表头指车+值为:"<<h

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

11、XSIZE 15 struct 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;t->exp=p->exp;p=p->next;if(s) s->next=t;s=t;)if (s) s->next

12、=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;head->exp=e0;Node *q,*p=head;for (int i=1;i<n;i+)(q=new Node;q->coef=c

13、i;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,*t;t=new Node;t->coef=c;t->exp=e;if (head=0)(

14、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/插入尾部(q->next=t;t->next=0;)重载+运算符Polynominal operator +(Polynominal a,Polynominal b)/ (Poly

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

16、->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->coef=p->coef;t->exp=p->exp;s->next=t;s=t;p=p->next;)s->next=0; /链表尾标记s=temp.head;te

17、mp.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=a.head;q=b.head;while (p && q)(if (p->exp=q->exp)(x=p->coef-q-&

18、gt;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->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;)

19、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 *(Polynominal a,Polynominal b)/重载* 运算符(Polynominal temp;Node *p,*q,*s;int e;

20、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;)ostream& operator<<(ostream& os, const Polynominal&

21、; 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/显示多项式Node* p;int e; if (head) e=head->exp;os<<&

22、quot;f(x)="<<head->coef;if (e>1) os<<"xAH<<e;if (e=1) os<<"x") else os << "f(x)=0" << endl; return;)p=head->next;while (p)(e=p->exp;if (p->coef!=0.0)/系数非零(if (p->coef>0.0) os<<'+'<<p->coef;e

23、lse os<<p->coef;if (e>1) os<v"xA"vve;if (e=1) os<<"x")p=p->next;)os<<endl;)通过类的成员函数实现对多项式的运算,构造和析构函数主要是实现初始化 以及销毁,其它函数那么主要是实现功能.4.3 主函数设计/主函数int main()(int e1MAXSIZE,e2MAXSIZE,size2,size1,i;double c1MAXSIZE,c2MAXSIZE;cout<<" 多项式计算器"vv

24、endl;cout<<"请输入多项式P1的项数:";cin>>size1;coutvv"请输入多项式P1的系数:";for(i=0;i<size1;i+)(cin>>c1i;p1p2显小多项式的和显示多项式的差显示多项式的积cout<<"请输入多项式pl的指数"for(i=0;i<size1;i+)(cin>>e1i;)cout<<"请输入多项式P2的项数:cin>>size2;cout<<"请输入多项式p2

25、的系数;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);/创立多项式p2.Create(c2,e2,size2);/创立多项式cout<<"多项式p1为";p1.Print();cout<<endl;/显示多项式p1cout<<"多项式p2为";p2.Pri

26、nt();cout<<endl;/显示多项式p2p3 = p1 + p2;cout<<"多项式 p1+p2 为"<< p3<<endl;/p3 = p1 - p2;cout<<"多项式 p1-p2 为"<< p3<<endl;/p3 = p1*p2;cout<<"多项式 p1*p2 为"<<p3<<endl;/ return 0;在程序的主函数局部,对算法进行了验证.首先,输入了多项式的系数指数项数,接着定义三个对象

27、 pl, p2, p3,在定义过程中调用构造函数,进行初始 化并动态分配了内存.调用Print()显示多项式,通过调用重载运算符实现操作, 最后系统自动调用析构函数清理.5 DOS界面程序运行结果及分析5.1 程序运行结果程序运行结果如图2所示.图2程序运行结果通过计算对运行结果进行检测,经检测结果正确无误.5.2 运行结果分析整个程序采用的是链表和动态内存分配方式.将多项式的运算抽象到一个类 Polynominal中,由该类生成三个对象 pl, p2, , p3,同时由系统调用构造函数初始化,调用 Creat()构造多项式,调用重 载的运算符,实现加减乘的操作,由于涉及对象传值,调用拷贝构造

28、函数.6基于MFC勺图形界面程序开发MFC勺图形界面程序设计可在上述类设计的根底上进行改造,MFC勺图形界面程序与DO以面程序的主要不同点是:MFCS形界面程序与DOS面程序的输 入输出方式不同,DOS界面程序采用字符交互式实现数据输入输出,主要通过 cin , cout等I/O流实现,而MFC勺图形程序界面采用标准 Windows窗口和控件 实现输入输出,因此必须在MFC1的框架下参加上面所设计的矩阵和方程组类, 并通过图形界面的输入输出改造来完成.6.1基于MFC的图形界面程序设计(1)界面设计首先在VC中建立MFC AppWizard(exe)工程,名称为一元稀疏多项式运算,并在向导的S

29、tepl中选择Single document:,即建立基于对话框的应用程序,如下列图45所示.图 4 建立 MFC AppWizard(exe)工程图5建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图 6所示.图6方程组求解程序界面设计图6所示的界面中包含了 3个Group Box(分组框),4个Static Text控件,5个Button控件,和9个Edit Box控件,控件的根本信息列表如下表 1所示 表1控件根本信息控件类别控件ID控件Caption说明StaticTextIDC_STATIC项系数项指数项系数项指数BottonIDC_addmenber1

30、添加IDC_addmenber2添加IDC_add加法运算IDC_sub减法运算IDC_multiply乘法运算Edit BoxIDC_EDIT1显示多项式p1IDC_EDIT4显示多项式p2IDC_EDIT7显示加法运算结果IDC_EDIT8显示减法运算结果IDC_EDIT9显示乘法运算结果IDC_EDIT2输入每一项的系数IDC_EDIT3输入每一项的指数IDC_EDIT5输入每一项的系数IDC_EDIT6输入每一项的指数GroupBoxIDC_STATIC一元多项式EJ,丁 一蜂 *Kwt ga MFWIVndW1Jl iiQ 9 1 % f d4 可, Hp CiC flAlMQi 邺

31、口 p aH CLlCtfD喻曰-J j f IjI * T1 IP 1 M一fJdC 口 AijMMT-Dlfel*QI Mi TOUT Mx inOmu J Mh = 口 M. _i%mqIiUK 口 lh*为+- -a R(2)IDC代码设计为了能够将对话控件建立MembeVariableS询 Ctrl+w 键进入 MFC ClassWizard 界面,选择 Memberr ,im*- mJ 工(Afiid7所示.Variables选项卡可显示.成员!ObiSJOI.面,、如图囹国"w#r图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下面是编写代码的重要阶段,可以借鉴在设计基于DO阴面的限制台应用程 序的代码,并将其作必要的改写,具体改写的步骤与内容如下. 建立名为一元稀疏多项式计算的 M

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

34、数(node *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","A");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;) else(if(h=t) v=v+x+u+e;elsev=v+w+x+u+e; ) else(if(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;) else(if(h=t)v=v+c+x+u+e;else

36、v=v+w+c+x+u+e; )else if(t->coef<0)/多项式系数小于0的情况(w.Format("%s","-");c.Format("%g",t->coef);x.Format("%s","X");u.Format("%s","A");e.Format("%d,t->expn);if(t->coef=-1)(if(t->expn=0)v=v+c;else if(t->expn=1)v=v

37、+w+x;elsev=v+w+x+u+e;) else(if(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)

38、(if(q1->expn=q2->expn)/指数相同的情况(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

39、=q1->next;k=k->next;)if(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);/新计算结果保存在一个单独结点中,用于对之前生成的

40、链表进行比照,形成升序排列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;) else ( n=n->next; s=s->next;) if(s=NULL) ( n->next=l;) j=j-&

温馨提示

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

评论

0/150

提交评论