c++分数计算器含源码.docx
《c++分数计算器含源码.docx》由会员分享,可在线阅读,更多相关《c++分数计算器含源码.docx(11页珍藏版)》请在冰豆网上搜索。
c++分数计算器含源码
一、实验设计方案
1、实验内容与目的(简单介绍实验内容,说明实验目的)
实验目的:
设计一个分数计算器:
1)实现输入>>,输出<<,+,-,*,/运算符的重载;2)实现分子分母的约分与规格化。
实验内容:
你的具体选择(要详细)
实现分数计算器的屏幕输入和输出:
1)输入采用文件(input.txt)输入,可以有任意个二元分数表达式,表达式之间的分隔符自定义;2)输出到文件(output.txt)
——————————————————————————————————————
2、实验准备工作(阐述解决问题所涉及的算法思想,至少要画一个算法流程图来说明)
以下为循环计算二元分数计算式的流程图:
在实验中还需要面对六个运算符重载,通过运算符重载,我们可以简单的使用分数计算,而不需要关心它的结构,运算符重载,我们根据基本的数学定理,将加减乘除包装,并重载了输入输出运算符,这样,在输入输出时便可直接输出用户方便接收的格式。
——————————————————————————————————————
二、实验步骤、测试与结果分析
1、源程序的设计(在此附上源程序(cpp文件)清单)
#include
#include
#include
usingnamespacestd;
//-------------------------------创建分数类------------------------------------
classFraction
{
private:
intnume;//分子
intdeno;//分母
intGcf(intm,intn);//辅助函数,返回m和n最大公因数
public:
Fraction(intn=1,intd=1);
virtual~Fraction(){}
voidReduction();//约分
intGetNume()const{returnnume;}//返回分子
intGetDeno()const{returndeno;}//返回分母
voidSetNume(intn);//设置分子
voidSetDeno(intd);//设置分母
Fractionoperator+(constFraction&a)const;//重载加法符+
Fractionoperator-(constFraction&a)const;//重载加法符-
Fractionoperator*(constFraction&a)const;//重载加法符*
Fractionoperator/(constFraction&a)const;//重载加法符/
};
ostream&operator<<(ostream&out,constFraction&a);//重载输出运算符<<
istream&operator>>(istream&in,Fraction&a);//重载输入运算符>>
//---------------------------------最大公因数函数------------------------------
intFraction:
:
Gcf(intm,intn)
{
if(n==0)returnm;//如果n=0,m为最大公因数
elsereturnGcf(n,m%n);//否者辗转相除
}
//------------------------------------约分函数---------------------------------
voidFraction:
:
Reduction()
{
if(deno<0)//若分母小于0,将符号提前
{
nume=-nume;
deno=-deno;
}
intf=Gcf(abs(nume),deno);
nume=nume/f;//实现约数
deno=deno/f;
}
//----------------------------------构造函数-----------------------------------
Fraction:
:
Fraction(intn,intd):
nume(n),deno(d)
{
if(deno==0)cout<<"分母为0"<Reduction();//约分
}
//----------------------------------设置分母函数-------------------------------
voidFraction:
:
SetNume(intn)
{
nume=n;
Reduction();
}
//----------------------------------设置分子函数-------------------------------
voidFraction:
:
SetDeno(intd)
{
if(d==0)cout<<"分母为0"<deno=d;
Reduction();
}
//----------------------------------重载运算符+--------------------------------
FractionFraction:
:
operator+(constFraction&a)const
{
Fractionresult;
result.nume=this->nume*a.deno+this->deno*a.nume;//求和的分子
result.deno=this->deno*a.deno;//求和的分母
result.Reduction();//约分
returnresult;//返回和
}
//----------------------------------重载运算符---------------------------------
FractionFraction:
:
operator-(constFraction&a)const
{
Fractionresult;
result.nume=this->nume*a.deno-this->deno*a.nume;//求差的分子
result.deno=this->deno*a.deno;//求差的分母
result.Reduction();//约分
returnresult;//返回差
}
//----------------------------------重载运算符*--------------------------------
FractionFraction:
:
operator*(constFraction&a)const
{
Fractionresult;
result.nume=this->nume*a.nume;//求积的分子
result.deno=this->deno*a.deno;//求积的分母
result.Reduction();//约分
returnresult;//返回积
}
//----------------------------------重载运算符/--------------------------------
FractionFraction:
:
operator/(constFraction&a)const
{
if(a.nume==0)cout<<"除数为0"<Fractionresult;
result.nume=this->nume*a.deno;//求商的分子
result.deno=this->deno*a.nume;//求商的分母
result.Reduction();//约分
returnresult;//返回商
}
//----------------------------------重载运算符<<--------------------------------
ostream&operator<<(ostream&out,constFraction&a)
{
out<returnout;//返回输出流
}
//----------------------------------重载运算符>>--------------------------------
istream&operator>>(istream&in,Fraction&a)
{
charch;//接收字符
intm,n;//定义分子和分母
in>>m;//输入分子
in>>ch;//输入/
if(ch!
='/')cout<<"非法字符"<in>>n;//输入分母
if(n==0)cout<<"分母为0"<a.SetNume(m);//设置分子
a.SetDeno(n);//设置分母
a.Reduction();//约分
returnin;//返回输入流
}
intmain(void)
{
Fractionobj1,obj2,result;//定义两个分数和结果
charindex,ch;//定义符号
ifstreaminfile("input.txt",ios:
:
in);//以输入的方式打开文件
if(!
infile)//若文件打开失败
{
cout<<"打开文件input.txt失败!
"<exit
(1);
}
ofstreamoutfile("output.txt",ios:
:
app);//以输出的方式打开文件
if(!
outfile)//若文件打开失败
{
cout<<"打开文件output.txt失败"<exit
(1);
}
outfile<<"---------------------本次计算结果如下--------------------"<for(;;)//无限次循环直到求解完成
{
infile>>obj1;//输入第一个分数
infile>>index;//输入需要执行的操作符号
infile>>obj2;//输入第二个分数
infile>>ch;//选择继续或者计算结果
if(index=='+')result=obj1+obj2;//加法
elseif(index=='-')result=obj1-obj2;//减法
elseif(index=='*')result=obj1*obj2;//乘法
elseif(index=='/')result=obj1/obj2;//除法
else
{
system("PAUSE");
return0;
}
cout<<"正在计算"<ofstreamoutfile("output.txt",ios:
:
app);
if(!
outfile)
{
cout<<"打开文件output.txt失败"<exit
(1);
}
outfile<//输出结果到output.txt
cout<<"计算完成,结果保存在output.txt中"<if(ch==';')continue;//若遇到";",继续执行
elseif(ch=='=')//若遇到"=",计算结果
{
outfile<<"-------------------------谢谢使用------------------------"<break;
}
outfile.close();//文件输出流关闭
}
infile.close();//文件输出流关闭
system("PAUSE");
return0;
}
——————————————————————————————————————
2、实验现象及结论(应用文字和程序运行的截图说明程序测试现象,并解释结果)
input.txt输入截图如下:
Jcsy.exe执行截图如下:
output.txt输出截图如下:
input.txt输入截图如下:
jcsy.exe执行截图如下:
Output.txt输出截图如下:
——————————————————————————————————————
3、实验总结(是否成功解决问题,总结实验中最有价值的内容,程序能够在哪些方面进一步改善,自我评价成败得失)
试验中,我们按照从简单到复杂的方法,一步一个脚印编写代码,使得程序不易发生错误,并且容易更正,编写出来的程序代码简洁明朗,效率较高;
通过对例题的学习,我们最终将正确的代码编写出,并在不断地修改之下做到方便用户使用的要求;
编码的速度有一个从慢到快的过程,在本次试验中,我们的速度依然比较慢,这看出我们平时编码比较少,缺乏熟练度,并对算法了解不深入;
但是我们的代码看起来仍然有些凌乱,效率还没有带到真正的高效,每次运行都需要等待几秒钟。
再以后我们将通过练习基础功,简化程序代码,实现简单代码完善功能的理想。
1.编码要尽量使程序简单,采用最切实可靠的算法,实现封装,不同部分的代码应分工明确,最后由主函数统一调用;
2.编写完成后先自己检查一遍代码,然后由机器检测,找出错误的根源,从不同角度思考如何解决问题;
3.测试时应尽可能输入各种可能情况的数据以确保程序准确无误。
4.应避免任何可能的漏洞,使代码的可用性和可靠性增强。
5.试验中,我按照从简单到复杂的方法,一步一个脚印编写代码,使得程序不易发生错误,并且容易更正,编写出来的程序代码简洁明朗,效率较高;
6.通过对例题的学习,我最终将正确的代码编写出,并在不断地修改之下做到方便用户使用的要求;
7.编码的速度有一个从慢到快的过程,在本次试验中,我的速度依然比较慢,这看出我平时编码比较少,缺乏熟练度,并对算法了解不深入;
8.但是我的代码看起来仍然有些凌乱,效率还没有带到真正的高效,每次运行都需要等待几秒钟。
再以后我将通过练习基础功,简化程序代码,实现简单代码完善功能的理想。
本次试验中,我们先将书上的代码编译通过,通过讨论,认为书上检查异常的方式不便于理解,于是直接采用输出到dos窗口的方式,所以没有使用到utility.h头文件,同时,由于我们电脑上安装的编译系统不方便对.h文件进行调试修改,所以我们采用的cpp文件,在一个cpp文件中写下所有代码。
对于txt文件输出的格式,我们做的稍微人性化,界面简洁,容易区分