版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/课程设计任务书学院信息科学和工程专业电子信息科学和技术学生姓名学号设计题目1.分数类的设计和实现2.生命游戏1.分数类的设计和实现建立用于完成分数形式运算的类RationalNumber。编写一个测试该类的程序。用整数变量表示类的私有数据(即分子和分母)。给类供应一个能够对所声明的对象初始化的构造函数。为了能够在不供应初始化值的状况下也能对对象初始化,构造函数中应当包含默认的值。构造函数还应当以最简分数的形式存储数据,即2/4应当在对象中存储成分子为1、分母为2的形式。公有成员函数应当有以下功能:1.两个有理数相加,以最简形式保存结果;2.两个有理数相减,以最简形式保存结果;3.两个有理数相乘,以最简形式保存结果;4.两个有理数相除,以最简形式保存结果;5.以a/b的形式输出有理数(a是分子,b是分母);6.以浮点形式输出有理数。2.生命游戏生命游戏其实是一个零玩家游戏。它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。假如相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,假如四周活细胞过少,这个细胞会因太孤寂而死去。1.假如一个细胞四周有3个细胞为生(一个细胞四周共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变)。2.假如一个细胞四周有2个细胞为生,则该细胞的生死状态保持不变;3.其它状况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)进度支配:第17周:分析题目,查阅课题相关资料,进行类设计、算法设计;第18周:上机调试程序,程序测试和分析,撰写课程设计报告,准备答辩。指导老师(签字):年月日学院院长(签字)年月日目录PARTI 11需求分析 12算法基本原理 12.1加法 12.2减法 22.3乘法 22.4除法 23类设计 24详细设计 34.1类的接口设计 34.2类的实现 44.3主函数设计 95运行结果和分析 105.1程序运行结果 105.2运行结果分析 12PARTII 126基于MFC的图形界面程序开发 126.1基于MFC的图形界面程序设计 12(1)界面设计 12(2)代码设计 146.2测试程序 226.3MFC程序编写总结 237参考文献 24PARTI1需求分析(1)有理数可分为整数和分数也可分为三种,一;正数,二;0,三;负数。除了无限不循环小数以外的实数统称有理数。在数学上有理数的运用相当广泛,所以一款简易的有理数计算器可以大大节约时间,而且不会因为人为误差导致计算结果出错。(2)依照它们的序列,有理数具有一个序拓扑。有理数是实数的(稠密)子集,因此它同时具有一个子空间拓扑。接受度量,有理数构成一个度量空间,这是它的第三个拓扑。幸运的是,全部三个拓扑一样并将有理数转化到一个拓扑域。有理数是非局部紧致空间的一个重要的实例。这个空间也是完全不连通的。有理数不构成完备的度量空间;实数是它的完备集。(3)程序测试数据选择若干种有代表性的数据来进行测试,通过临界数据的测试来推断系统的正确性。2算法基本原理2.1加法有理数的加法和小学的加法大有不同,小学的加法不涉及到符号的问题,而有理数的加法运算总是涉及到两个问题:一是确定结果的符号;二是求结果的确定值。在进行有理数加法运算时,首先推断两个加数的符号:是同号还是异号,是否有0。从而确定用那一条法则。在应用过程中,确定要牢记"先符号,后确定值",娴熟以后就不会出错了。多个有理数的加法,可以从左向右计算,也可以用加法的运算定律计算。法则1.同号相加,取相同符号,并把确定值相加。2.确定值不等的异号加减,取确定值较大的加数符号,并用较大的确定值减去较小的确定值。互为相反数的两个数相加得0。3.一个数同0相加,仍得这个数。定律Ⅰ.同号相加,取相同符号,并把确定值相加。Ⅱ.确定值不相等的异号两数加减,取确定值较大的符号,并用较大的确定值减去较小的确定值。互为相反数的两个数相加得0。Ⅲ.一个数同0相加,仍得这个数。Ⅳ.相反数相加结果确定得0。2.2减法有理数减法法则:减去一个数,等于加上这个数的相反数。其中:两变:减法运算变加法运算,减数变成它的相反数。一不变:被减数不变。可以表示成:a-b=a+(-b)。2.3乘法1.两数相乘,同号为正,异号为负,并把确定值相乘。例;(-5)×(-3)=15(-6)×4=-242.任何数字同0相乘,都得0.例;0×1=03.几个不等于0的数字相乘,积的符号由负因数的个数确定。当负因数有奇数个数时,积为负;当负因数有偶数个数时,积为正。并把其确定值相乘。例;(-10)×〔-5〕×(-0.1)×(-6)=积为正数,而(-4)×(-7)×(-25)=积为负数4.几个数相乘,有一个因数为0时,积为0.例;3×(-2)×0=05.乘积为1的两个有理数互为倒数(reciprocal)。例如,—3和—1/3,—3/8和—8/3。2.4除法1.除以一个数等于乘以这个数的倒数。(留意:0没有倒数)2.两数相除,同号为正,异号为负,并把确定值相除。3.0除以任何一个不等于0的数,都等于0。4.0在任何条件下都不能做除数。3类设计从上面的算法分析可以看到,本设计面临的计算问题的关键是设计一个有理数运算类。这个类必需能将用户给定的2个整数表达成有理数,同时必需进行合法性检测。同时须要为类设计4个方法,分别来运算加法,减法,乘法和除法,为了使有理数运算看起来更符合自然,所以必需利用C++的重载技术,来对相应的4种运算符进行重载,并且还须要设计一个方法来满意有理数分数形式和小数形式的转换。要从用户输入创建一个有理数,为类设计了一个带有默认参数的构造函数来满意需求。依据以上的分析,设计出CRationalNumber类。如图3.1所示。图3.1CRationalNumber类UML图形表示4详细设计整个程序分为三个独立的文档,RationalNumber.h文件中为有理数类CRationalNumber的申明,RationalNumber.cpp文件中包括有理数类的成员函数实现文件;main.cpp文件包括程序的入口函数和测试数据。4.1类的接口设计//RationalNumber.h文件,实现类的声明classCRationalNumber{public: CRationalNumber(intnt=0,intdt=1);//带有默认参数的构造函数声明 virtual~CRationalNumber(); public: intnumtor;//分子 intdentor;//分母 CRationalNumberoperator+(CRationalNumber&rn);//加号运算符重载函数声明 CRationalNumberoperator-(CRationalNumber&rn);//减号运算符重载函数声明 CRationalNumberoperator*(CRationalNumber&rn);//乘号运算符重载函数声明 CRationalNumberoperator/(CRationalNumber&rn);//除号运算符重载函数声明 floatConvertFloat();//将有理数转换成浮点数};ostream&operator<<(ostream&,RationalNumber&);//重载流插入运算符,使分数以(a/b)形式输出函数声明类CRationalNumber设计了一个带有默认构造参数的构造函数,便利用户构造有理数。同时设计了4个重载函数,可以让运用者像运用一般整数那样对有理数运算进行操作,大大的提高了运用简洁性。4.2类的实现//RationalNumber.cpp文件,类实现#include"stdafx.h"#include"RationalCompute.h"#include"RationalNumber.h"////////////////////////////////////////////////////////////////////////Construction/Destruction//////////////////////////////////////////////////////////////////////CRationalNumber::CRationalNumber(intnt,intdt) //带有默参数构造函数的定义{ inttemp,num,n,d; n=nt; d=dt; if(n<d) {temp=n; n=d; d=temp;} while(d!=0) //求分子和分母的最大公约数 {num=n%d; n=d; d=num; } numtor=nt/n;//构造函数以最简分数的形式存储数据 dentor=dt/n;}CRationalNumber::~CRationalNumber(){}CRationalNumberCRationalNumber::operator+(CRationalNumber&rn)//加号运算符重载函数的定义{ CRationalNumbertemp; temp.numtor=this->numtor*rn.dentor+rn.numtor*this->dentor; temp.dentor=this->dentor*rn.dentor; inttemp1,num,n,d; n=temp.numtor; d=temp.dentor; if(n<d)//求分子和分母的最大公约数 {temp1=n; n=d; d=temp1; } while(d!=0) {num=n%d; n=d; d=num; } temp.numtor=temp.numtor/n; temp.dentor=temp.dentor/n; return(temp);}CRationalNumberCRationalNumber::operator-(CRationalNumber&rn)//减号运算符重载函数的定义{ CRationalNumbertemp; temp.numtor=this->numtor*rn.dentor-rn.numtor*this->dentor; temp.dentor=this->dentor*rn.dentor; inttemp1,num,n,d; n=temp.numtor; d=temp.dentor; if(n<d)//求分子和分母的最大公约数 {temp1=n; n=d; d=temp1;} while(d!=0) {num=n%d; n=d; d=num; } temp.numtor=temp.numtor/n; temp.dentor=temp.dentor/n; return(temp);}CRationalNumberCRationalNumber::operator*(CRationalNumber&rn)//乘号运算符重载函数的定义{CRationalNumbertemp; temp.numtor=this->numtor*rn.numtor; temp.dentor=this->dentor*rn.dentor; inttemp1,num,n,d; n=temp.numtor; d=temp.dentor; if(n<d)//求分子和分母的最大公约数 {temp1=n; n=d; d=temp1;} while(d!=0) {num=n%d; n=d; d=num; } temp.numtor=temp.numtor/n; temp.dentor=temp.dentor/n; return(temp);}CRationalNumberCRationalNumber::operator/(CRationalNumber&rn)//除号运算符重载函数的定义{ CRationalNumbertemp; temp.numtor=this->numtor*rn.dentor; temp.dentor=this->dentor*rn.numtor; inttemp1,num,n,d; n=temp.numtor; d=temp.dentor; if(n<d)//求分子和分母的最大公约数 {temp1=n; n=d; d=temp1;} while(d!=0) {num=n%d; n=d; d=num; } temp.numtor=temp.numtor/n; temp.dentor=temp.dentor/n; return(temp);}//将有理数转换成浮点数floatCRationalNumber::ConvertFloat(){ //分母为0,返回-1。表示错误。 if(dentor==0) return-1; floattemp; temp=float(this->numtor)/float(this->dentor); return(temp);}ostream&operator<<(ostream&output,RationalNumber&rn)//重载流插入运算符的定义,使分数以(a/b)形式输出{ if(rn.dentor==0)//分母是0输出error cout<<"error!"<<endl; else{ if(rn.numtor>0&&rn.dentor<0) output<<-rn.numtor<<"/"<<-rn.dentor; else output<<rn.numtor<<"/"<<rn.dentor; returnoutput; }}在类的构造函数中,对用户输入的数据进行了求最大公约数处理,使输入数据看起来最简洁化。而且在全部的运算操作中都对错误的数据(如分母为0)的状况进行了处理。由于运算符<<比较特殊,所以没有将<<重载符放入类的成员函数中,而是作为全局函数来处理,避开和cout<<的冲突。4.3主函数设计//main.cpp主函数#include"RationalNumber.h"intmain(){ cout<<".oO欢迎运用有理数计算器Oo.请依据提示输入运算数据!"<<endl;intn1,n2,m1,m2;cout<<"\n\n请输入第一个分数的分子和分母:"<<endl;cin>>n1>>n2;cout<<"请输入其次个分数的分子和分母:"<<endl;cin>>m1>>m2;RationalNumberrn1(n1,n2);//定义类的对象rn1并指定分子和分母值RationalNumberrn2(m1,m2);//定义类的对象rn2并指定分子和分母值 RationalNumberrn3,rn4,rn5,rn6;//定义类的对象rn3,rn4,rn5,rn6不指定分子和分母,用默认参数对其初始化//调用以浮点形式输出分数函数 rn3=rn1+rn2;//调用加号重载函数 rn4=rn1-rn2;//调用减号重载函数 rn5=rn1*rn2;//调用乘号重载函数 rn6=rn1/rn2;//调用除号重载函数 cout<<rn1<<"加"<<rn2<<"等于:"<<rn3<<"或者";//调用流插入运算符,使分数以(a/b)形式输出 rn3.showfloat();//调用以浮点形式输出分数函数 cout<<rn1<<"减"<<rn2<<"等于:"<<rn4<<"或者";//调用流插入运算符,使分数以(a/b)形式输出 rn4.showfloat();//调用以浮点形式输出分数函数 cout<<rn1<<"乘"<<rn2<<"等于:"<<rn5<<"或者";//调用流插入运算符,使分数以(a/b)形式输出 rn5.showfloat();//调用以浮点形式输出分数函数 cout<<rn1<<"除"<<rn2<<"等于:"<<rn6<<"或者";//调用流插入运算符,使分数以(a/b)形式输出 rn6.showfloat();//调用以浮点形式输出分数函数 cout<<"计算完成,请按随意键退出系统!"<<endl; getchar(); getchar();return0;}在程序的主函数部分,选择了让用户输入操作数据的方式来互动,当用户依据提示来输入相应的数据后,程序会自动运算出每组数据的全部操作结果,假如用户输入数据有错误,则会显示出错误信息。5运行结果和分析5.1程序运行结果当输入正确无误的数据后,程序运行结果如图5.1所示。图5.1程序运行结果从图2中可以看出,当输入正确的数据后,系统能正确无误的计算出有理数相加,相减,相乘,相除的结果,并能正确转换成小数形式。当输入有误的数据,如分母为0的时候,程序运行结果如图5.2所示。图5.2程序运行结果(错误数据源)从图5.2中可以看出,当输入错误的数据后,程序会检测出错误数据源,证明白程序的健壮性。当输入的数据分子和分母最大公约数不为1的状况下,程序运行结果如图5.3所示:图5.3程序运行结果(有公约数)5.2运行结果分析首先当向程序输入正确的数据源后,程序能精确快速的计算出4则运算的结果,当向程序输入分母为0的错误的数据后,程序也同样能够识别。当向程序中输入的分子分母有最大公约数,并且最大公约数不为1的状况下,说明分数可以化简,程序也能很好的识别并给出正确的结果。从运行结果来分析,设计的有理数类完全满意于需求PARTII6基于MFC的图形界面程序开发6.1基于MFC的图形界面程序设计MFC的图形界面程序设计可在上述类设计的基础上进行改造,MFC的图形界面程序和DOS界面程序的主要不同点是:MFC图形界面程序和DOS界面程序的输入输出方式不同,DOS界面程序接受字符交互式实现数据输入输出,主要通过cin,cout等I/O流实现,而MFC的图形程序界面接受标准Windows窗口和控件实现输入输出,因此必需在MFC类的框架下加入上面所设计的矩阵和方程组类,并通过图形界面的输入输出改造来完成。(1)界面设计首先在VC中建立MFCAppWizard(exe)工程,名称为RationalCompute,并在向导的Step1中选择Dialogbased,即建立基于对话框的应用程序,如下图6.1所示图6.1建立MFCAppWizard(exe)工程在弹出的MFCAppWizard对话框中,选择单文档应用程序,其他运用默认值如图6.2,点击完成。图6.2选择文档类型建立应用程序工程骨架,点击确定。如图6.3图6.3建立工程骨架此程序已经具备了常见的程序外观,如标题栏,菜单栏,工具栏,状态栏和视图区,程序的框架已经构建起来了。可以在VC++环境中看到AppWizard已经生成5个类,如图6.4图6.4,应用程序类视图(2)代码设计在CMyView类视图里添加画笔,画诞生命游戏中的游戏界面,定义时间函数,定义更新速度以及生命游戏的游戏规则,代码如下:voidCMyView::paint(CDC*p){ inta,b,i,j; for(i=0;i<20;i++) for(j=0;j<20;j++) { p->Ellipse(i*30,j*30,i*30+30,j*30+30); } CBrushc; c.CreateSolidBrush(RGB(0,255,0));p->SelectObject(c); srand((int)time(NULL)); for(intx=0;x<=200;x++) { a=(int)(20.0*rand()/(RAND_MAX+1.0)); b=(int)(20.0*rand()/(RAND_MAX+1.0)); m[a+1][b+1]=1; p->Ellipse(a*30,b*30,a*30+30,b*30+30); } floattime2; charstr[20]; time2=(float)(time1)/1000.0; sprintf(str,"更新速度:%.2f秒",time2);p->TextOut(20,630,str,strlen(str)); DeleteObject(c); }voidCMyView::paint1(CDC*p){ inti,j; for(i=0;i<20;i++) {for(j=0;j<20;j++) { intnum=0; for(inti1=0;i1<3;i1++) {for(intj1=0;j1<3;j1++) { if(num1==1) {if(m[i+i1][j+j1]==1) num++;else;} else {if(m1[i+i1][j+j1]==1) num++;else;} } } if(num1==1) {if(m[i+1][j+1]==1) num--;else;} else {if(m1[i+1][j+1]==1) num--;else;} if(num==3) { CBrushc; c.CreateSolidBrush(RGB(0,255,0));p->SelectObject(c); p->Ellipse(i*30,j*30,i*30+30,j*30+30); if(num1==1) {m1[i+1][j+1]=1; } else {m[i+1][j+1]=1; } DeleteObject(c); } elseif(num==2) { if(num1==1) {m1[i+1][j+1]=m[i+1][j+1]; } else {m[i+1][j+1]=m1[i+1][j+1]; } /*HBRUSHc; if(m[i+1][j+1]==1) { c=CreateSolidBrush(RGB(0,255,0));::SelectObject(hdc,c); } else { c=CreateSolidBrush(RGB(255,255,255));::SelectObject(hdc,c); }::Ellipse(hdc,i*30,j*30,i*30+30,j*30+30); ::DeleteObject(c);*/ } else { CBrushc; c.CreateSolidBrush(RGB(255,255,255));p->SelectObject(c); p->Ellipse(i*30,j*30,i*30+30,j*30+30); if(num1==1) {m1[i+1][j+1]=0; } else {m[i+1][j+1]=0; } DeleteObject(c); } } } if(num1==1) num1=0; else num1=1;}voidCMyView::OnDraw(CDC*pDC){ CMyDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); paint(pDC); //TODO:adddrawcodefornativedatahere}///////////////////////////////////////////////////////////////////////////////CMyViewdiagnostics#ifdef_DEBUGvoidCMyView::AssertValid()const{ CView::AssertValid();}voidCMyView::Dump(CDumpContext&dc)const{ CView::Dump(dc);}CMyDoc*CMyView::GetDocument()//non-debugversionisinline{ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc))); return(CMyDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CMyViewmessagehandlersvoidCMyView::OnTimer(UINTnIDEvent){ CDC*p; p=GetDC();paint1(p); CView::OnTimer(nIDEvent);}voidCMyView::OnFileNew(){SetTimer(1,time1,NULL); }voidCMyView::OnFileOpen(){KillTimer(1); }voidCMyView::OnM1(){CDC*p;p=GetDC();K
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 广东电信规划设计院2026届校招备考题库及一套答案详解
- 上师大附中嘉定新城分校2026学年教师招聘与实习生招募备考题库(第二批次)及一套参考答案详解
- 2025年云南水务投资股份有限公司宁洱县污水处理厂招聘备考题库及一套参考答案详解
- 2025年天峨县消防救援大队关于招录政府专职消防员的备考题库及参考答案详解1套
- 2025年西安交通大学电信学部管理辅助人员招聘备考题库及一套答案详解
- 南京市第二医院(南京市公共卫生医疗中心)2026年公开招聘卫技人员备考题库及一套完整答案详解
- 2025年初中语文、初中数学、初中物理、高中物理教师招聘备考题库及答案详解一套
- 2025年恒丰银行合肥分行社会招聘备考题库及完整答案详解1套
- 2025年保定市博物馆招聘备考题库含答案详解
- 2025年武汉某初级中学招聘骨干教师6人备考题库有答案详解
- 郑伯克段于鄢-2
- TCSUS-智能水表技术标准
- TSG特种设备安全技术规范TSGD-202工业管道安全技术规程
- 利用EXCEL画风机特性曲线-模版
- 人体工效评估程序
- 西南大学PPT 04 实用版答辩模板
- 国家开放大学电大《政治学原理》形考任务1及4网考题库答案
- 管理百年智慧树知到答案章节测试2023年
- 国家开放大学《刑法学(1)》形成性考核作业1-4参考答案
- 工艺美术专业课程配套练习二
- 2022“博学杯”全国幼儿识字与阅读大赛选拔试卷
评论
0/150
提交评论