分数类的设计与实现.docx

上传人:李司机 文档编号:4327154 上传时间:2023-04-17 格式:DOCX 页数:23 大小:163.50KB
返回 下载 相关 举报
分数类的设计与实现.docx_第1页
第1页 / 共23页
分数类的设计与实现.docx_第2页
第2页 / 共23页
分数类的设计与实现.docx_第3页
第3页 / 共23页
分数类的设计与实现.docx_第4页
第4页 / 共23页
分数类的设计与实现.docx_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《分数类的设计与实现.docx》由会员分享,可在线阅读,更多相关《分数类的设计与实现.docx(23页珍藏版)》请在三一办公上搜索。

1、课程设计任务书学院信息科学和工程专业电子信息科学和技术学生姓名学号设计题目1.分数类的设计和实现2.生命游戏1 .分数类的设计和实现建立用于完成分数形式运算的类RationalNumMrt,编写一个测试该类的程序。用整数变量表示类的私有数据(即分子和分母)。给类供应一个能够对所声明的对歙初始化的构造函数。为了能够在不供应初始化值的状况下也能对对象初始化,构造函数中应当包含默认的值。构造函数还应当以最简分数的形式存储数据,即2/4应当在对象中存储成分子为1、分母为2的形式。公有成员函数应当有以下功能:1 .两个有理数相加,以俄筒形式保存结果;2 .两个有理数相减,以最筒形式保存结果:3 .两个有

2、理数相乘,以最简形式保存结果:4 .两个有理数相除,以最简形式保存结果:5 .以a/b的形式输出有理数(a是分子,b是分母):6 .以浮点形式输出有理数.2 .生命游戏生命游戏其实是一个零玩家游戏。它包括个二维矩形世界,这个世界中的每个方格居住着一个活着的或死r的细胞.一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数1.假如相邻方格活着的细胞数量过多,这个细胞会因为资源展乏而在下一个时刻死去:相反,假如四周活细胞过少,这个细胞会因太孤寂而死去。L假如个细胞四周有3个细胞为生(一个细胞四周共有8个细胞),则核细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)3 .

3、假如一个细胞四周有2个细胞为生,则该细胞的生死状态保持不变:4 .其它状况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)进度支配:第17周:分析题目,查阅课题相关资料,进行类设计、算法设计:第18周:上机调试程序,程序测试和分析,撰写课程设计报告,准备答辩。指导老师(签字);年月日学院院长(签字)年月日目录PARTIO1需求分析O2算法基本原理0123Ooo3类设计04详细设计14.1 类的接口设计14.2 类的实现14.3 主函数设计45运行结果和分析45.1 程序运行结果45.2 运行结果分析5PARTII56基于MFC的图形界面程序开发56.1 基于MFC的图形界

4、面程序设计5(1)界面设计5(2)代码设计66.2 测试程序106.3 MFC程序编写总结117参考文献112.2 戒法仃理数减法法则:减去一个数,等于加上这个数的相反数。其中:两变:减法运算变加法运算,减数变成它的相反数.一不变:被减数不变。可以表示成:a-b=a+(-b).2.3 乘法I.两数相乘,同号为正,异号为负,并把确定值相乘。例;(-5)(-3)=15(-64=-242,任何数字同O相乘,都得O.例;OXl=O3 .几个不等于0的数字相乘,积的符号由负因数的个数确定。当负因数有奇数个数时,积为负;当负因数仃偶数个数时,积为正。并把其确定值相乘。例:-10)X(-5)X(-0.1)(

5、-6)=积为正数,而(-7)X(-25)=积为负数4 .几个数相乘,有一个因数为。时,积为0.例:3X-2)0=05 .乘积为1的两个有理数互为倒数(reciprocal)。例如,一3和一1/3,3/8和-8/36 .4除法1 .除以一个数等于乘以这个数的倒数。(留意:。没有倒数)2 .两数相除,同号为正,异号为负,并把确定值相除。3 .0除以任何一个不等于0的数,都等于0。4 .0在任何条件下都不能做除数。3类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是设计一个有理数运算类.这个类必需能将用户给定的2个整数表达成有理数,同时必需进行合法性检测.同时须要为类设计4个方法,分别来运

6、算加法,减法,乘法和除法,为了使有理数运算看起来更符合自然,所以必需利用C+的重效技术,来对相应的4种运算符进行重教,并且还须要设计一个方法来满意有理数分数形式和小数形式的转换.要从用户输入创建一个有理数,为类设计了一个带有默认参数的构造函数来满意需求。依据以上的分析,设计出CRationaINumber类。如图3.1所示。PARTI1需求分析(1)有理数可分为整数和分数也可分为三种,一:正数,:0,三:负数.除了无限不循环小数以外的实数统称有理数。在数学上仃理数的运用相当广泛,所以款简易的仃理数计算器可以大大节约时间,而且不会因为人为误差导致计算结果出错.(2)依照它们的序列,有理数具有一个

7、序拓扑。有理数是实数的(倜密)子集,因此它同时具有一个子空间拓扑.接受度量,有理数构成一个度量空间,这是它的第三个拓扑。幸运的是,全部:个拓扑一样并将有理数转化到一个拓扑域。有理数是非局部紧致空间的一个重要的实例。这个空间也是完全不连通的。有理数不构成完备的度量空间:实数是它的完备集。(3)程序测试数据选择若干种有代表性的数据来进行测试,通过临界数据的测试来推断系统的正确性.2算法基本原理2.1加法有理数的加法和小学的加法大有不同,小学的加法不涉及到符号的问题,而有理数的加法运算总是涉及到两个问题:一是确定结果的符号:二是求结果的确定值.在进行有理数加法运算时,首先推断两个加数的符号:是I可号

8、还是异号,是否有0。从而确定用那一条法则.在应用过程中,确定要牢记先符号,后确定值”,娴熟以后就不会出错了。多个有理数的加法,可以从左向右计第,也可以用加法的运算定律计算。法则1 .同号相加,取相同符号,并把确定值相加。2 .确定值不等的异号加减,取确定值较大的加数符号,并用较大的确定值减去较小的确定值。互为相反数的两个数相加得0。3 .个数同0相加,仍得这个数。定律L同号相加,取相同符号,并把确定值相加.H.确定值不相等的异号两数加减,取确定值较大的符号,并用较大的确定值减去较小的确定值。互为相反数的两个数相加得0。ffl.一个数同0相加,仍得这个数.IV.相反数相加结果确定得0。加号运算符

9、重载函数声明CRationalNumberoperator-(CRationalNumber&rn):减号运算符重载函数声明CRationaINumberoperator*(CRationalNumber&rn);乘号运算符重载函数声明CRationaINumberoperalor(CRationalNumbcr&rn);除号运算符重载函数声明oatConvertFIoatO;将有理数转换成浮点数;ostreain&operator(ostream&,RaIionalNUrnber&);重载流插入运算符,使分数以(ab)形式输出函数声明类CRatiOnalNUmber设计了个带仃默认构造参数的

10、构造函数,便利用户构造仃理数,同时设计了4个承载函数,可以让运用者像运用一般整数那样对有理数运算进行操作,大大的提高了运用简洁性。4.2类的实现RationalNUnlber.cpp文件,类实现#includestdafx.h#inchideRationalCompute.h#includeRationaINuniberh/ConstructionZDestruction/CRationalNumber:CRationalNumber(intnt,intdt)带布默参数构造函数的定义(inttemp,num,n,d;n=nt;d=dt;CRatiOnalNumber+numtor:int-O+

11、dentor:int=1+CRatIonalNumber(intnt,intdt)void+CRationalNumber()+operator+(CRationa1Number&r)CRationalNumber+operator-(CRationa1NumberArn):CRationalNumber+operator*(CRationaINumberArn):CRationalNumber+operator/(CRationalNumber&rn):CRationalNumber+ConvertFloatO:float图3.1CRalionalNumberUML图形表示4详细设计整个程序

12、分为三个独立的文档,RationalNumbech文件中为有理数类CRationaINUmber的申明,RationaINumber.Cpp文件中包括有理数类的成於函数实现文件:main.cpp文件包括程序的入口函数和测试数据。4.1类的接口设计/RationaINumbeLh文件,实现类的声明classCRationalNumber(public:CRationaINumber(intnl=0.intdl=l);带有默认参数的构造函数声明virtual-CRationaINumberO;public:分子分母intnumtor;intdentor;CRationalNumberOPeralQ

13、r+(CRalionalNumber&rn);n=d;d=num;)temp.numtor=temp.numtorn:temp.dentor=temp.dentorn;return(temp);CRationalNumberCRationaINumber:operator-(CRationalNumber&rn)减号运算符重载函数的定义CRationaINumbertemp;temp.numtor=this-numtor*m.dentor-m.numtor*this-dentor;temp.dentor=this-dentor*m.dentor;inttempl,num.n.d;n=tenp.

14、numtor;d=tem.dentor;if(nd)H求分子和分母的最大公约数tempi=n;n=d;d=tempkwhile(d!=O)num=n%d;n=d;d=nurn;Itemp.numtor=temp.numtorn;tem.dentor=temp.dentorn;return(temp);CRationalNumberCRationalNumber:operator*(CRationalNumber&m)乘号运算符重载函数的定义CRalionalNumbertemp;if(nnumtor*m.dentor+m.numtor*this-dentor;(emp.dentor=this-

15、dentor*rn.dentor;inttempl,num.n,d;n=(enp.nuntor;d=temp.dentor;if(nnumtor)float(this-dentor);return(temp);OStreaoperator(ostream&output.RationalNumber&rn)重载流插入运算符的定义,使分数以(ab)形式输出(if(m.dentor=0)分母是0输出errorcout,error!0&rn.dentor0)output-m.numtor,7,-m.dentor;elseoutputm.numtor7rn.dentor;returnoutput:)在类

16、的构造函数中,对用户输入的数据进行了求垠大公约数处理,使输入数据看起来最简洁化。而且在全部的运算操作中都对错误的数据(如分母为0)的状况进行了处理.由于运克符比较特殊,所以没有将numtor*).nuntor;temp.dentor=this-dentor*rn.dentor;in(templ,nunn,d;n=temp.numtor;d=temp.dentor;if(nnumtor*.dentor;tenp.dentor=this-denlor*rn.nunor;inttempl.num.n,d;n=temp.numtor;d=temp.dentor:if(nd)/求分子和分母的最大公约数t

17、empl=n;n=d;d=tempkWhile(d!=0)4.3主函数设计调用以浮点形式输出分数函数coutrnl,除,m2等于:vrn6v或者/main.cpp主函数#includeRationaINumber.hintmain()cout,o欢迎运用有理数计算器Oo请依据提示输入运算数据!endl;intnl,n2,ml,m2;coutnn请输入第,个分数的分子和分母:n1n2;CoUl请输入其次个分数的分子和分母:mlm2;RationalNumberml(n1.n2):定义类的对象rnl并指定分子和分母值RationalNumber)2(ml,m2):定义类的对象m2并指定分子和分母值

18、调用流插入运算符,使分数以(ab)形式输出m6.showflat();调用以浮点形式输出分数函数cout计算完成.请按随意键退出系统!endl:gechar();getchar();return0;在程序的主函数部分,选择了让用户输入操作数据的方式来互动,当用户依据提示来输入相应的数据后,程序会自动运算出每组数据的全部操作结果,假如用户输入数据有错误,则会显示出错误信息。5运行结果和分析RationalNumberm3,m4,m5,rn6;定义类的对象rn3,m4,m5,rn6不指定分子和分母,用默认参数对其初始化调用以浮点形式输出分数函数5.1程序运行结果当输入正确无误的数据后,程序运行结果

19、如图5.I所示。rn3=m1+m2;rn4=ml-m2:rn5=ml*2;rn6=mlm2:调用加号重载函数调用减号重载函数调用乘号重载函数调用除号重载函数coutrnl力口rn2,等于:rn3或者调用流插入运算符,使分数以(ab)形式输出rn3.showfloat():调用以浮点形式输出分数函数coulml减,rn2H等于:,rn4,或者调用流插入运算符,使分数以(ab)形式输出rn4.showfloat();调用以浮点形式输出分数函数coulml乘m2等于:vm5v!CAboutDIg出,1:CChiIdFrameCMainFrame!CMy3App七CMy3Doc,,C而WlewHCjG

20、IobaIs图6.2选择文档类型建立应用程序工程骨架,点击确可以在VC+环境中看到AppWizard已经生成5个类,如图定。如图6.3Application:CMy3Ap in 生命游戏3.h and 生命游戏3.cppFrame: CMainFrame in MainFrm.h and MainFrm.cppMDIChiIdFrame: CChiIdFrame in ChildFrm.h and ChildFrm.cpp Document: CMy3Doc in 生命游戏3Doc.h and 生命济戏3Doc卬P View: CMy3Vicw in 生命潘53View.h and 生命液戏W

21、lCW.cppFeatures: Initial toolbar in main frame Initial status bar in main frame Printing and Print Preview support in view 3D Controls Uses shared DLL implementation MFC42.DLL ActiveX Controls support enabled Localizable text in:中文面体,中国1I 取辆图6.4,应用程序类视图(2)代码设计在CMyVieW类视图里添加画笔,画诞生命游戏中的游戏界面,定义时间函数,定义更

22、新速度以及生命游戏的游戏规则,代码如下:void CMyView:Paint(CDC *p)图6.3建立工程骨架inta.b,ij;for(i=0:i20;i+)应用程序向导将会包Applicationtypeof生MultipleDocumentWSn32Cl.I崎Re.I司Fil.IClasses;IobeCreateintnum=O;ibr(intiI=O;i13;i1+)for(intjl=OJlSelectObject(c);p-Ellipse(i*3Oj*3O.i*3O+3Oj*3O+3O);if(num1=1)(mli+l(j+l=l;)for(j=0Ellipse(i*3Oj*

23、3O,i*3O+3O,j*3O+3O);)CBrushc;c.CreateSolidBrush(RGB(0,255,0);p-SelectObject(c);srand(int)time(NULL);fbr(intx=0;xEllipse(a*3O,b*3O,a*3O+3O.b*3O+3O);Ifloattime2;charstr20;time2=(float)(time1)/1000.0;SPrinmStr,更新速度:%.2f秒time2);p-TextOut(20,630.str.strIen(str);DeleteObject(C);voidCMyView:paint1(CDC*p)in

24、tij;fbr(i=0;i20;i+)for(j=0uSelectObjecl(c);p-Ellipse(i*3Oj*3O,i*3O+3O,j*3O+3O);if(numl=l)(mli+lj+l=0;else(mi+lj+l=0;DeleteObject(C);if(numl=l)num1=0;elsenum1=1;voidCMyView:OnDraw(CDC*pDC)(CMyDoc*pDoc=GetDocumentO;ASSERT.VALID(pDoc);paint(pDC);/TODO:adddrawcodefornativedatahereCDC*p;p=GelDC();paintl(

25、p);CView:OnTimer(nIDEvent);)voidCMyView-OnFileNewOSetTimer(1,time1,NULL);voidCMyView:OnFileOpen()KiIITimer(I);voidCMyView:OnMl()CDC*p;p=GetDC();KillTimer(I);timel=timel10;floattime2;charstr20J;time2=(float)(time1)/1000.0;SPrintf(Str,更新速度:%.2f秒”,time2);p-TextOut(20.630,str.strlen(str);SetTlmer(l.time

26、!.NULL);HCMyViewdiagnostics#iRief_DEBUGvoidCMyView:AssertVaIidOconst(CView:AssertValidO;voidCMyView:Dump(CDumpContext&de)const(CVieW:DUmP(de);CMyDoc*CMyView:GetDocument()/non-debugversionisinline(ASSERT(m.pDocument-IsKindOf(RUNTIME-CLASS(CMyDoc);return(CMyDoc*)m-pDocument;)#endif/.DEBUGIllllllllllll

27、llllllimilllHHllllllllllllllllllllllllllllllllllllllllIIIIIIHCMyViewmessagehandlersvoidCMyView:OnTimer(UINTnIDEvent)6.2 测试程序游戏界面如下图6.5,此时游戏未起先,点击起先游戏,则游戏起先,玩家可通过暂停,加速,减速参和游戏,游戏界面上的细胞依据运动规律每秒更新一次,则形成了一幅时刻变更的图。变更中的生命游戏图如图6.6,6.7.图6.5游戏起先界面voidCMyVieW:0nM2()floatchar秒Iime2);p=GetDC();KillTimer(I);timel

28、=timel*10;time2;str20;time2=(floattimel)/1000.0;SPrintf(Su更新速度:%.2fp-TextOut(20.630,str,strlen(str);SetTimer(1.time!.NULL);些。MFC供应的对话框模板大大提高了用户体验的满意度和友好度,所以MFC必将为WindoWS程序员必学的类库。通过本次课程设计的开发,使我初步驾驭了windows程序设计的窍门,也了解了和传统限制台程序之前的差别,可以说C+是基础,会WindoWS编程才能写出更友好好用的应用软件来。通过面对对象的封装和设计实践,是我更进一步理解了什么是面对对象编程。由

29、于本课程设计要求的主要功能比较简洁,所以我信任这只是我学习中的一个小台阶,我将以此为基石,在今后的学习过程中不断总结和进步,写希望老师能赐予指责指正。7参考文献11徐士良.C常用算法程序集.北京:清华高校出版社,19952郑莉.董渊,张瑞丰.C+语言程序设计(第3版).北京:清华高校出版社.2007钱能Ci程序设计教程(其次版).北京:清华高校出版社,20074陈志泊,王春玲.面对对软的程序设计语言Y+.北京:人民邮电出版社,20025)李庆扬,王能超,易大义.数值分析.湖北:华中理工高校出版社.1986李爱华,程鑫面对对象程序设计C+语言清华高校出版社,2010马秀丽,刘志妩、李筠C语言程序

30、设计清华高校出版社,2008图6.7图6.66.3 MFC程序编写总结MFC程序和限制台程序最大的区分就是界面,由于MFC是个微软公司供应的类库(CIaSSlibraries),以C+类的形式封装了WindOWS的API,并且包含一个应用程序框架。其中包含的类SeWt-Oy包含大量句田岳M离爰柄封装类和二i,二二;二:二;二;二,:邙很多UO-(*(1卜,3Windows的博子::第X界及招;春X内建控件和川“2二:二3G二:二;二七二;组件的封装传_;二Xm二;类。所以传ah二&士4二;士;二统的限制台+xx+x程序只须要二士;士:二;;m;3七;学习c+就FtZ3Z:tx能编写,但IaM.MFC程序必需要先熟悉windows编程,这也是初学者最大的挑战。不熟悉windows编程可以说是对MFC程序无从下手,本系统接受的是MFC的对话框架构,相比于文本文档模式来讲,要简洁易懂

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号