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

下载本文档

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

文档简介

/封皮题目:班级:姓名:学号:日期:课程设计任务书学院专业学生姓名学号设计题目多项式类的设计和实现内容及要求:开发多项式类Polynomial,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如:2x4的指数为4,系数为2。请开发一个完整的Polynomial类,包括构造函数、析构函数以及“get”函数(读取值)和“set”函数(设置值)。该类还要供应以下重载的运算符:重载加法运算符+,将两个多项式相加。重载加法运算符-,将两个多项式相减。重载赋值运算符=,将一个多项式赋给另外一个多项式。重载加法运算符*,将两个多项式相乘。编写一个主函数测试多项式类的上述功能。进度支配:第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:程序的设计、调试和实现;第19周:程序测试和分析,撰写课程设计报告,进行答辩验收。指导老师(签字):年月日学院院长(签字)年月日目录1需求分析 -1-2算法基本原理 -1-3类设计 -2-4详细设计 -2-4.1类的接口设计 -2-4.2类的实现 -3-4.3主函数设计 -12-5DOS界面程序运行结果及分析 -14-5.1程序运行结果 -14-5.2运行结果分析 -15-6基于MFC的图形界面程序开发 -15-6.1基于MFC的图形界面程序设计 -15-6.2程序测试 -27-6.3MFC程序编写总结 -29-7参考文献 -29-1需求分析(1)开发多项式类Polynomial,多项式的每一项用链表的结点表示,每项包含一个系数和一个指数。例如:2x4的指数为4,系数为2。请开发一个完整的Polynomial类,包括构造函数、析构函数以及“get”函数(读取值)和“set”函数(设置值)。(2)多项式的定义:n个单项式的代数和叫多项式。(3)程序测试数据:P1:2x+3x^2+2x^4+3x^2P2:3x^2+2x^3(1)2算法基本原理设有2个多项式p1,p2P1:2x+3x^2+2x^4+3x^2P2:3x^2+2x^3实现多项式p1和p2的计算,关键是对p1和p2的指数和系数进行加减生的操作,我们可以先编辑一个基类Polynominal。通过链表和重载运算符的方法来实现。(1)多项式即个个单项式的和,我们可以把一个多项式分解成一项一项来看,每一项用链表的一个节点表示,每个节点包括一个单项式的系数、指数和指向该节点类型的一个指针。(2)用Polynominal创建对象p1、p2、p3,通过调用Create(c1,e1,size1)函数来构建多项式。(3)通过重载+、-、*以及=运算符,对多项式进行操作。(4)通过p1.Print()来显示结果。3类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是多项式运算。可以定义一个多项式类Polynominal。(1)该类包括私有数据成员Node*head,Node是构造的节点类型的结构体,包括系数、指数和指向该节点类型的一个指针。(2)成员函数包括Polynominal()//构造函数,Polynominal(constPolynominal&)//拷贝构造函数,~Polynominal()//析构函数Node*get(inte);//读取指数为e的项,返回其指针,voidset(doublec,inte);//设置指数为e的项的系数为c,voidCreate(double*c,int*e,intn);//创建多项式,friendPolynominaloperator+(Polynominala,Polynominalb);//重载+运算符,friendPolynominaloperator-(Polynominala,Polynominalb);//重载-运算符,friendPolynominaloperator*(Polynominala,Polynominalb);//重载*运算符,friendostream&operator<<(ostream&os,constPolynominal&a);Polynominal&operator=(Polynominala);//重载=运算符,voidPrint(ostream&os=cout)const;//显示函数voidCopy(constPolynominal&a)//复制函数对以上进行总结,该程序只包含一个类即Polynomina,对多项式的全部操作都抽象在该类中。4详细设计程序主要分为三个部分:类声明、类实现、主函数。4.1类的接口设计//类的声明classPolynominal{public:Polynominal(){head=0;}//构造函数Polynominal(constPolynominal&);//拷贝构造函数~Polynominal(){Node*q,*p;p=head;while(p)//删除链表{q=p->next;if(p)deletep;p=q;}head=NULL;}Node*get(inte);//读取指数为e的项,返回其指针voidset(doublec,inte);//设置指数为e的项的系数为cvoidCreate(double*c,int*e,intn);//创建多项式friendPolynominaloperator+(Polynominala,Polynominalb);//重载+运算符friendPolynominaloperator-(Polynominala,Polynominalb);//重载-运算符friendPolynominaloperator*(Polynominala,Polynominalb);//重载*运算符friendostream&operator<<(ostream&os,constPolynominal&a);Polynominal&operator=(Polynominala);//重载=运算符voidPrint(ostream&os=cout)const;voidCopy(constPolynominal&a);voidAddr(){cout<<"链表头指针值为:"<<head<<endl;}private:Node*head;//链表头指针};在程序中,声明白个个运算符的重载,通过Node*get(inte);读取指数为e的项,返回其指针,通过voidset(doublec,inte)设置指数为e的项的系数为c,多项式的的系数、指数以及指针全部接受了动态内存支配技术,这些工作都是由构造函数和Create()函数完成,它们的清理工作在析构函数中完成。4.2类的实现//类实现#include<iostream.h>#include<cstdlib>#include<cmath>#defineMAXSIZE15structNode//链表结点{intexp;//指数doublecoef;//系数Node*next;};voidPolynominal::Copy(constPolynominal&a){//复制对象(公用函数)Node*t,*s,*p;p=a.head;s=head=0;while(p){t=newNode;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(constPolynominal&a)//复制构造函数{Copy(a);}voidPolynominal::Create(double*c,int*e,intn)//创建多项式{if(n<1)cout<<"错误:要创建多项式的项数必需大于零。\n";else{head=newNode;//创建头结点head->coef=c[0];head->exp=e[0];Node*q,*p=head;for(inti=1;i<n;i++){q=newNode;q->coef=c[i];q->exp=e[i];p->next=q;p=q;}p->next=0;}}Node*Polynominal::get(inte)//读取指数为e的项{Node*p=head;while(p){if(p->exp==e)returnp;p=p->next;}returnp;//没有找到,返回空指针}voidPolynominal::set(doublec,inte)//将指数为e系数为c的项加入多项式(原多项式无指数为e的项){Node*q,*p,*t;t=newNode;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//插入尾部{q->next=t;t->next=0;}}Polynominaloperator+(Polynominala,Polynominalb)//重载+运算符{Polynominaltemp;Node*p,*q,*s,*t;doublex;s=newNode;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=newNode;t->exp=p->exp;t->coef=x;s->next=t;s=t;}p=p->next;q=q->next;}else{t=newNode;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=newNode;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;deletes;//删除多余的头结点returntemp;}Polynominaloperator-(Polynominala,Polynominalb)//重载-运算符{Polynominaltemp;Node*p,*q,*s=0,*t;//在此处添加代码,完成此函数(仿照上述重载"+"的函数)doublex;s=newNode;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=newNode;t->exp=p->exp;t->coef=x;s->next=t;s=t;}p=p->next;q=q->next;}else{t=newNode;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=newNode;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;deletes;//删除多余的头结点returntemp;}Polynominaloperator*(Polynominala,Polynominalb)//重载*运算符{Polynominaltemp;Node*p,*q,*s;inte;doublec;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;}returntemp;}ostream&operator<<(ostream&os,constPolynominal&a){a.Print(os);returnos;}Polynominal&Polynominal::operator=(Polynominala)//重载=运算符{Node*s,*p;if(head){//若原多项式存在,先撤消它p=head;while(p){s=p->next;deletep;p=s;}}Copy(a);return*this;}voidPolynominal::Print(ostream&os)const//显示多项式{Node*p;inte;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;return;}p=head->next;while(p){e=p->exp;if(p->coef!=0.0)//系数非零{if(p->coef>0.0)os<<'+'<<p->coef;elseos<<p->coef;if(e>1)os<<"x^"<<e;if(e==1)os<<"x";}p=p->next;}os<<endl;}通过类的成员函数实现对多项式的运算,构造和析构函数主要是实现初始化以及销毁,其它函数则主要是实现功能。4.3主函数设计//主函数intmain(){ inte1[MAXSIZE],e2[MAXSIZE],size2,size1,i; doublec1[MAXSIZE],c2[MAXSIZE]; cout<<"多项式计算器"<<endl; cout<<"请输入多项式P1的项数:"; cin>>size1; cout<<"请输入多项式P1的系数:"; for(i=0;i<size1;i++) { cin>>c1[i]; } cout<<"请输入多项式p1的指数"; for(i=0;i<size1;i++) { cin>>e1[i]; } cout<<"请输入多项式P2的项数:"; cin>>size2; cout<<"请输入多项式p2的系数"; for(i=0;i<size2;i++) { cin>>c2[i]; } cout<<"请输入多项式p2的指数"; for(i=0;i<size2;i++) { cin>>e2[i]; } Polynominalp1,p2,p3; p1.Create(c1,e1,size1);//创建多项式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<<"多项式p1-p2为"<<p3<<endl;//显示多项式的差 p3=p1*p2; cout<<"多项式p1*p2为"<<p3<<endl;//显示多项式的积 return0;}在程序的主函数部分,对算法进行了验证。首先,输入了多项式的系数指数项数,接着定义三个对象p1,p2,p3,在定义过程中调用构造函数,进行初始化并动态支配了内存。调用Print()显示多项式,通过调用重载运算符实现操作,最终系统自动调用析构函数清理。5DOS界面程序运行结果及分析5.1程序运行结果程序运行结果如图2所示。图2程序运行结果通过计算对运行结果进行检测,经检测结果正确无误。5.2运行结果分析整个程序接受的是链表和动态内存支配方式。将多项式的运算抽象到一个类Polynominal中,由该类生成三个对象p1,p2,,p3,同时由系统调用构造函数初始化,调用Creat()构造多项式,调用重载的运算符,实现加减乘的操作,由于涉及对象传值,调用拷贝构造函数。6基于MFC的图形界面程序开发MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序和DOS界面程序的主要不同点是:MFC图形界面程序和DOS界面程序的输入输出方式不同,DOS界面程序接受字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面接受标准Windows窗口和控件实现输入输出,因此必需在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。6.1基于MFC的图形界面程序设计(1)界面设计首先在VC中建立MFCAppWizard(exe)工程,名称为一元稀疏多项式运算,并在向导的Step1中选择Singledocument,即建立基于对话框的应用程序,如下图4~5所示。图4建立MFCAppWizard(exe)工程图5建立基于对话框的应用程序将对话框资源中的默认对话框利用工具箱改造成如下界面,如图6所示。图6方程组求解程序界面设计图6所示的界面中包含了3个GroupBox(分组框),4个StaticText控件,5个Button控件,和9个EditBox控件,控件的基本信息列表如下表1所示。表1控件基本信息控件类别控件ID控件Caption说明StaticTextIDC_STATIC项系数项指数项系数项指数BottonIDC_addmenber1添加IDC_addmenber2添加IDC_add加法运算IDC_sub减法运算IDC_multiply乘法运算EditBoxIDC_EDIT1显示多项式p1IDC_EDIT4显示多项式p2IDC_EDIT7显示加法运算结果IDC_EDIT8显示减法运算结果IDC_EDIT9显示乘法运算结果IDC_EDIT2输入每一项的系数IDC_EDIT3输入每一项的指数IDC_EDIT5输入每一项的系数IDC_EDIT6输入每一项的指数GroupBoxIDC_STATIC一元多项式1IDC_STATIC一元多项式1IDC_STATIC运算结果(2)代码设计为了能够将对话框界面上的控件能够和代码联系起来,须要为各个控件建立MemberVariables,按Ctrl+w键进入MFCClassWizard界面,选择MemberVariables选项卡,可显示成员变量设置界面,如图7所示。图7成员变量设置界面通过该界面设置控件对应的成员变量,详细如表2所示。表2控件基本信息控件ID成员变量类型成员变量名称IDC_EDIT1CStringm_screen1IDC_EDIT2floatm_coef1IIDC_EDIT3intm_expn1IDC_EDIT4CStringm_screen2IDC_EDIT5floatm_coef2IDC_EDIT6intm_expn2IDC_EDIT7CStringm_screen3IDC_EDIT8CStringm_screen4IDC_EDIT9CStringm_screen5下面是编写代码的重要阶段,可以借鉴在设计基于DOS界面的限制台应用程序的代码,并将其作必要的改写,详细改写的步骤和内容如下。建立名为一元稀疏多项式计算的MFC工程。将对话框资源中的默认对话框利用工具箱改造。设置控件对应的成员变量。编写添加按钮的响应函数,详细代码如下:voidCMyDlg::Onaddmenber2(){ UpdateData(true); if(h2)//创建链表 { d2->next=f(m_expn2,m_coef2); d2=d2->next; } else { h2=f(m_expn2,m_coef2); d2=h2; } m_screen2.Format("%s",show(h2)); UpdateData(false);} 编写显示的消息处理函数,详细代码如下:CStringshow(node*h)//显示函数{ node*t=h; CStringe,c,w,u,x,v; while(t)//多项式的显示 { if(t->coef==0)//多项式的项系数等于0的状况 { v=v; } elseif(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) { if(h==t)//该项是否是显示的第一位 v=v+x; else v=v+w+x; } elseif(t->expn==0) { if(h==t) v=v+c; else v=v+w+c; } else { if(h==t) v=v+x+u+e; else v=v+w+x+u+e; } } else { if(t->expn==0) { if(h==t) v=v+c; else v=v+w+c; } elseif(t->expn==1) { if(h==t) v=v+c+x; else v=v+w+c+x; } else { if(h==t) v=v+c+x+u+e; else v=v+w+c+x+u+e; } } } elseif(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; elseif(t->expn==1) v=v+w+x; else v=v+w+x+u+e; } else { if(t->expn==0) v=v+c; elseif(t->expn==1) v=v+c+x; else v=v+c+x+u+e; } } t=t->next; } if(v=="") v="0"; returnv;}编写加,减法运算的消息处理函数,详细代码如下:node*add(node*p1,node*p2)//多项式加法运算{ node*h,*q1,*q2,*t,*k; q1=p1;q2=p2; h=k=newnode;k->next=p1; while(q1&&q2) { if(q1->expn==q2->expn)//指数相同的状况 { q1->coef=q1->coef+q2->coef; q1=q1->next; k=k->next; t=q2; q2=q2->next; deletet; } elseif(q1->expn>q2->expn)//第一项的指数比其次项指数大的状况 { k->next=q2; t=q2->next; q2->next=q1; k=k->next; q2=t; } elseif(q1->expn<q2->expn)//第一项的指数比其次项指数小的状况 { q1=q1->next; k=k->next; } } if(q2) k->next=q2; t=h; h=h->next; deletet; returnh;}编写乘法运算处理函数,详细代码如下: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; deletel; break; } elseif(l->expn<s->expn) { n->next=l; l->next=s; break; } else { n=n->next; s=s->next;

温馨提示

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

评论

0/150

提交评论