c++分数计算器含源码.docx

上传人:b****6 文档编号:7405703 上传时间:2023-01-23 格式:DOCX 页数:11 大小:83.56KB
下载 相关 举报
c++分数计算器含源码.docx_第1页
第1页 / 共11页
c++分数计算器含源码.docx_第2页
第2页 / 共11页
c++分数计算器含源码.docx_第3页
第3页 / 共11页
c++分数计算器含源码.docx_第4页
第4页 / 共11页
c++分数计算器含源码.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

c++分数计算器含源码.docx

《c++分数计算器含源码.docx》由会员分享,可在线阅读,更多相关《c++分数计算器含源码.docx(11页珍藏版)》请在冰豆网上搜索。

c++分数计算器含源码.docx

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文件输出的格式,我们做的稍微人性化,界面简洁,容易区分

 

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

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1