分数类的设计与实现.docx
《分数类的设计与实现.docx》由会员分享,可在线阅读,更多相关《分数类的设计与实现.docx(29页珍藏版)》请在冰豆网上搜索。
分数类的设计与实现
.
课程设计任务书
学院
信息科学与工程
专业
电子信息科学与技术
学生姓名
学号
设计题目
生命游戏2.1.分数类的设计与实现
分数类的设计与实现1.。
编写一个测试该类的程序。
用整建立用于完成分数形式运算的类RationalNumber
。
给类提供一个能够对所声明的对象初始化的构数变量表示类的私有数据(即分子和分母)构造函数中应该包含默认造函数。
为了能够在不提供初始化值的情况下也能对对象初始化,、应该在对象中存储成分子为1的值。
构造函数还应该以最简分数的形式存储数据,即2/42的形式。
公有成员函数应该有以下功能:
分母为两个有理数相加,以最简形式保存结果;1.2.两个有理数相减,以最简形式保存结果;两个有理数相乘,以最简形式保存结果;3.
4.两个有理数相除,以最简形式保存结果;
是分子;,b是分母)a/b5.以的形式输出有理数(a6.以浮点形式输出有理数。
2.生命游戏这个世界中的每个方格居生命游戏其实是一个零玩家游戏。
它包括一个二维矩形世界,一个细胞在下一个时刻生死取决于相邻八个方格中活着的或住着一个活着的或死了的细胞。
这个细胞会因为资源匮乏而在下一死了的细胞的数量。
如果相邻方格活着的细胞数量过多,个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。
,则该细胞为生(即该83个细胞为生(一个细胞周围共有个细胞)1.如果一个细胞周围有细胞若原先为死,则转为生,若原先为生,则保持不变)。
22.如果一个细胞周围有个细胞为生,则该细胞的生死状态保持不变;
其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)3.进度安排:
周:
分析题目,查阅课题相关资料,进行类设计、算法设计;第17周:
上机调试程序,程序测试与分析,撰写课程设计报告,准备答辩。
第18
指导教师(签字):
日月年
学院院长(签字)
年月日
专业.
.
PARTI.......................................................................................1
1需求分析...............................................................................1
2算法基本原理........................................................................1
2.1加法.................................................................................................1
2.2减法.................................................................................................2
2.3乘法.................................................................................................2
2.4除法.................................................................................................2
3类设计...................................................................................2
4详细设计...............................................................................3
4.1类的接口设计...................................................................................3
4.2类的实现..........................................................................................5
4.3主函数设计....................................................................................12
5运行结果与分析..................................................................14
5.1程序运行结果.................................................................................14
5.2运行结果分析.................................................................................16
PARTII.....................................................................................17
6基于MFC的图形界面程序开发..........................................17
6.1基于MFC的图形界面程序设计.....................................................17
(1)界面设计.............................................................................................17
专业.
.
(2)代码设计.............................................................................................20
6.2测试程序........................................................................................30
6.3MFC程序编写总结.........................................................................32
7参考文献.............................................................................33
专业.
.
PARTI
1需求分析
(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=-24
2.任何数字同0相乘,都得0.例;0×1=0
3.几个不等于0的数字相乘,积的符号由负因数的个数决定。
当负因数有奇数个数时,积为负;当负因数有偶数个数时,积为正。
并把其绝对值相乘。
例;(-10)×〔-5〕×(-0.1)×(-6)=积为正数,而(-4)×(-7)×(-25)=积为负数
4.几个数相乘,有一个因数为0时,积为0.例;3×(-2)×0=0
5.乘积为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所示。
专业.
.
类CRationalNumber图形表示图3.1UML详细设计4
类数为有理文的文档,RationalNumber.h件中个序整个程分为三独立文件中包括有理数类的成员函数实现RationalNumber.cppCRationalNumber的申明,文件包括程序的入口函数和测试数据。
文件;main.cpp4.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文件,类实现
#includestdafx.h
#includeRationalCompute.h
#includeRationalNumber.h
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
CRationalNumber:
:
CRationalNumber(intnt,intdt)
//带有默参数构造函数的定义{
inttemp,num,n,d;
n=nt;
d=dt;
if(n{temp=n;
n=d;
专业.
.
d=temp;}
while(d!
=0)//求分子和分母的最大公约数
{num=n%d;
n=d;
d=num;
}
numtor=nt/n;
//构造函数以最简分数的形式存储数据
dentor=dt/n;
}
CRationalNumber:
:
~CRationalNumber()
{
}
CRationalNumber:
:
operator+(CRationalNumberCRationalNumber
//加号运算符重载函数的定义&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//求分子和分母的最大公约数
{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);
}
CRationalNumber:
:
operator-(CRationalNumberCRationalNumber
&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//求分子和分母的最大公约数
{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);
}
CRationalNumber:
:
operator*(CRationalNumberCRationalNumber
专业.
.
&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(nn=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//求分子和分母的最大公约数
{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<<else{
if(rn.numtor>0&&rn.dentor<0)
output<<-rn.numtor<<\/<<-rn.dentor;
专业.
.
else
output<returnoutput;
}
}
在类的构造函数中,对用户输入的数据进行了求最大公约数处理,使输入数据看起来最简洁化。
而且在所有的运算操作中都对错误的数据(如分母为0)的情况进行了处理。
由于运算符<<比较特殊,所以没有将<<重载符放入类的成员函数中,而是作为全局函数来处理,避免与cout<<的冲突。
4.3主函数设计
//main.cpp主函数
椣据畬敤尠RationalNumber.h
intmain()
{
cout<<.oO欢迎使用有理数计算器Oo.请根据提示输入运算数据!
<intn1,n2,m1,m2;
cout<<\
\n请输入第一个分数的分子与分母:
<cin>>n1>>n2;
潣瑵?
请输入第二个分数的分子与分母:
<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<<//调用流插入运算符,使分数以(a/b)形式输出
rn3.showfloat();
//调用以浮点形式输出分数函数
cout<<//调用流插入运算符,使分数以(a/b)形式输出
rn4.showfloat();
//调用以浮点形式输出分数函数
cout<<//调用流插入运算符,使分数以(a/b)形式输出
rn5.showfloat();
专业.
.
//调用以浮点形式输出分数函数
cout<<//调用流插入运算符,使分数以(a/b)形式输出
rn6.showfloat();
//调用以浮点形式输出分数函数
cout<<--------计算完成,请按任意键退出系统!
<getchar();
getchar();
return0;
}
在程序的主函数部分,选择了让用户输入操作数据的方式来互动,当用户根据提示来输入相应的数据后,程序会自动运算出每组数据的所有操作结果,如果用户输入数据有错误,则会显示出错误信息。
5运行结果与分析
5.1程序运行结果