分数计算器
C++语言实习报告
题 目: 分数计算器 指导教师: ____ 院 系: 班 级: 姓 名 学 号: ___ 完成时间:
目 录
一、设计的任务要求…………………………………………………………..1 二、程序综述…………………………………………………………………..1
1(程序设计基本思路………………………………………....................1
2(主要程序功能设计……………………………………………………1 三、程序设计流程图…………………………………………………………..4 四、程序清单…………………………………………………………………..5 五、结束语……………………………………………………………………..13 六、参考文献…………………………………………………………………..15
一、设计的任务要求
)该程序是分数计算器,程序的一些算术功能没有完成,请编写函数,将程(1
序完成,要求界面提示清楚,便于操作。
(2)程序的很多逻辑功能没有完成,如大于、小于以及分数与整数的逻辑比较,请编写函数,将程序完成,要求界面提示清楚,便于操作。
二、程序综述
随着科学的进步和科技的发展,计算机的应用可以说是家喻户晓,但是随着计算机应用领域的不断扩大,计算机已经深入到社会和生活的各个领域,而对于我们21世纪的青年来说,在社会主义发展的新阶段,更应该了解和掌握时代的脉搏,通晓计算机的知识和识别计算机的语言,在掌握了C++语言的概念和语法后,能熟悉掌握面向对象程序设计的编程方法及各种编程技巧,并能够利用简洁的语句编写出高效、完整,以解决在生活中各个方面遇到的具体问题,且为程序语言的软件编程奠定基础,也是在C语言程序的基础之上,使我对计算机语言有了更进一步的理解,和更深一步的认知。同时通过用C++程序设计语言的应用,可以让我们提高学生的C++编程水平,让我们能够学有所获,灵活的运用所学知识,来实现机器语言。
1(程序设计基本思路
若想完成程序设计首先需要定义一个分数类即CFraction,并设置分子和分母,以及将分数转换为对应的小数、返回分数的绝对值、分子分母的约分和置换功能,在执行计算器功能时,需要进行四则混合运算和逻辑运算,由于是特殊的函数成员对象之间相互运算,所以需要使用运算符重载功能。故有:
在设计四则混合运算时:
const CFraction&operator+=(int num); //重载+=运算符
const CFraction&operator-=(int num); //重载-=运算符
const CFraction&operator*=(int num); //重载*=运算符
在设计逻辑运算时:
(幂)运算符重载 CFraction operator^(const CFraction&basetra,int exp); //
bool operator==(const CFraction&leftfra,const CFraction&rightfra); //逻辑运算符 bool operator!=(const CFraction&leftfra,const CFraction&rightfra);
bool operator>=(const CFraction&leftfra,const CFraction&rightfra);
ostream&operator<<(ostream&os,const CFraction&fra); //输出运算符重载
1
istream&operator>>(istream&is,CFraction&fra); //输入运算符重载 在进行分数运算的时候,由于分子不能为0,所以有:
void CFraction::Setnume(int newnume){nNume=newnume;}
void CFraction::Setdeno(int newdeno) { if(newdeno!=0)
nDeno=newdeno;
else
{ cout<<"错误:分母不可以为0 ~\n"<<"按任意键继续"; cin>>AnyChar;
abort();
}
}
2(主要程序功能设计:
该程序是分数计算器,所以要完成分数与分数之间的加、减、乘、除、乘幂等运算和分数与整数之间的加、减、乘、除、乘幂等运算,以及分数与分数,分数与整树之间的逻辑功能运算。
程序中涉及到的类的定义和主要运用函数的列举:
class CFraction //分数类定义
{
private:
int nNume; //分子
int nDeno; //分母 char AnyChar; //定义一个字符变量
public:
CFration(); //构造函数
CFration(int nume,int deno); //构造函数
int Getnume()const; //返回分子,const成员函数,不能修改数据成员 int Getdeno()const; //返回分母
double Decimal()const; //将分数转换为对应的小数
2
CFraction Absval()const; //返回分数的绝对值
void Setnume(int newnume); //设置分子
void Setdeno(int newdeno); //设置分母
void Simplify(); //约分
void Recip(); //分子分母置换
const CFraction&operator+=(int num); //重载+=运算符
const CFraction&operator-=(int num);
const CFraction&operator*=(int num);
CFraction(){ nNume=0; nDeno=1;} //默认构造函数(=0/1)
CFraction(int nume,int deno){nNume=nume;nDeno=deno;} };
四则混合运算程序模块:
由于是特殊的函数成员对象之间相互运算,所以需要使用运算符重载功能,以便
用来计算数据之间的大小。
CFraction operator+(const CFraction&leftfra,const CFraction&rightfra); CFraction operator+(const CFraction&leftfra,int rightnum); CFraction operator-(const CFraction&leftfra,const CFraction&rightfra); CFraction operator-(const CFraction&leftfra,int rightnum); CFraction operator*(const CFraction&leftfra,const CFraction&rightfra); CFraction operator*(const CFraction&leftfra,int rightnum); CFraction operator^(const CFraction&basetra,int exp); //(幂)运算符重载
逻辑运算程序模块:
由于是特殊的函数成员对象之间相互运算,所以需要使用运算符重载功能,以便
用来比较数据之间的大小。
bool operator==(const CFraction&leftfra,const CFraction&rightfra); //逻辑运算符
bool operator!=(const CFraction&leftfra,const CFraction&rightfra); bool operator>=(const CFraction&leftfra,const CFraction&rightfra); istream&operator>>(istream&is,CFraction&fra); //输入运算符重载
istream&operator>>(istream&is,CFraction&fra); //输入运算符重载
3
三、程序设计流程图 开始执行
[2]是否输入选择项
做逻辑[1]
运算 [2]
[1]是否做混合
运算
[1]加法
输入选择项 [2]减法
[3]乘法
输入选择项
[1]分数与分数 [2]分数与整数
最后输出结果
是否返回上一
级[1]或[2]
是否退出
[0]
结束
4
四、程序清单
#include
#include
#include
#include
using namespace std;
class CFraction //分数类定义
{
private:
int nNume; //分子
int nDeno; //分母 char AnyChar; //定义一个字符变量
public:
CFration(); //构造函数
CFration(int nume,int deno); //构造函数
int Getnume()const; //返回分子,const成员函数,不能修改数据成员 int Getdeno()const; //返回分母
double Decimal()const; //将分数转换为对应的小数 CFraction Absval()const; //返回分数的绝对值
void Setnume(int newnume); //设置分子
void Setdeno(int newdeno); //设置分母
void Simplify(); //约分
void Recip(); //分子分母置换
const CFraction&operator+=(int num); //重载+=运算符
const CFraction&operator-=(int num);
const CFraction&operator*=(int num);
CFraction(){ nNume=0; nDeno=1;} //默认构造函数(=0/1) CFraction(int nume,int deno){nNume=nume;nDeno=deno;}
};
5
int GCF(int x,int y); //求x、y的最大公因子
CFraction operator+(const CFraction&leftfra,const CFraction&rightfra); CFraction operator+(const CFraction&leftfra,int rightnum); CFraction operator-(const CFraction&leftfra,const CFraction&rightfra); CFraction operator-(const CFraction&leftfra,int rightnum); CFraction operator*(const CFraction&leftfra,const CFraction&rightfra); CFraction operator*(const CFraction&leftfra,int rightnum); CFraction operator^(const CFraction&basetra,int exp); //(幂)运算符重载
bool operator==(const CFraction&leftfra,const CFraction&rightfra); //逻辑运算符
bool operator!=(const CFraction&leftfra,const CFraction&rightfra); bool operator>=(const CFraction&leftfra,const CFraction&rightfra); ostream&operator<<(ostream&os,const CFraction&fra); //输出运算符重载
istream&operator>>(istream&is,CFraction&fra); //输入运算符重载
int CFraction::Getnume()const{return nNume;}
int CFraction::Getdeno()const{return nDeno;}
double CFraction::Decimal()const{return double(nNume)/double(nDeno);} CFraction CFraction::Absval()const
{ CFraction returnValue(abs(nNume),abs(nDeno));
return returnValue;
}
void CFraction::Setnume(int newnume){nNume=newnume;}
void CFraction::Setdeno(int newdeno)
{ if(newdeno!=0)
nDeno=newdeno;
else
{ cout<<"错误:分母不可以为0 ~\n"<<"按任意键继续";
cin>>AnyChar;
abort();
}
6
}
void CFraction::Simplify()
{ int r=GCF(nNume,nDeno); nNume/=r;
nDeno/=r;
}
void CFraction::Recip()
{ int temp=nNume;
nNume=nDeno;
nDeno=temp;
}
const CFraction& CFraction::operator+=(int rightnum)
{ CFraction newrhs(rightnum,1); return(*this+newrhs);
}
const CFraction& CFraction::operator-=(int rightnum)
{ CFraction newrhs(rightnum,1); return(*this-newrhs);
}
const CFraction& CFraction::operator*=(int rightnum)
{ CFraction newrhs(rightnum,1); return(*this*newrhs);
}
int GCF(int x,int y) //辗转相除求x、y的最大公约数
{ int r=x%y;
if(r==0)
return y;
else
return GCF(y,r);
7
}
CFraction operator+(const CFraction&leftfra,const CFraction&rightfra)
{ CFraction sum;
int
newnum=(leftfra.Getnume()*rightfra.Getdeno())+(rightfra.Getnume()*leftfra.Getdeno
());
int newden=(leftfra.Getdeno()*rightfra.Getdeno()); sum.Setnume(newnum);
sum.Setdeno(newden);
sum.Simplify();
return sum;
}
CFraction operator+(const CFraction&leftfra,int rightnum) { CFraction newrhs(rightnum,1);
return leftfra+newrhs;
}
CFraction operator-(const CFraction&leftfra,const CFraction&rightfra)
{ CFraction cha;
int
newnum=(leftfra.Getnume()*rightfra.Getdeno())-(rightfra.Getnume()*leftfra.Getdeno
());
int newden=(leftfra.Getdeno()*rightfra.Getdeno()); cha.Setnume(newnum);
cha.Setdeno(newden);
cha.Simplify();
return cha;
}
CFraction operator-(const CFraction&leftfra,int rightnum) { CFraction newrhs(rightnum,1);
return leftfra-newrhs;
8
}
CFraction operator*(const CFraction&leftfra,const CFraction&rightfra)
{ CFraction ji;
int newnum=(leftfra.Getnume()*rightfra.Getnume()); int newden=(leftfra.Getdeno()*rightfra.Getdeno()); ji.Setnume(newnum);
ji.Setdeno(newden);
ji.Simplify();
return ji;
}
CFraction operator*(const CFraction&leftfra,int rightnum) { CFraction newrhs(rightnum,1);
return leftfra*newrhs;
}
CFraction operator^(const CFraction&basefra,int exp) { CFraction returnValue;
returnValue.Setnume(pow(basefra.Getnume(),exp)); returnValue.Setdeno(pow(basefra.Getdeno(),exp)); return returnValue;
}
bool operator==(const CFraction&leftfra,const CFraction&rightfra) { return leftfra.Decimal()==rightfra.Decimal(); }
bool operator!=(const CFraction&leftfra,const CFraction&rightfra) { return leftfra.Decimal()!=rightfra.Decimal(); }
bool operator!=(const CFraction&leftfra,int rightnum) { return leftfra.Decimal()!=rightnum;
}
bool operator>=(const CFraction&leftfra,const CFraction&rightfra)
9
{ return leftfra.Decimal()>=rightfra.Decimal();
}
ostream&operator<<(ostream&os,const CFraction&fra)
{ CFraction temp=fra.Absval(); int numer=fra.Getnume();
int denom=fra.Getdeno();
if((!((numer>0&&denom>0)||(numer<0&&denom<0)))&&fra!=0)
os<<'-';
if(temp.Getnume()==0||temp.Getdeno()==1)
os<>(istream&is, CFraction&fra)//is为输入流,fra为待输入的分数 { int newnum,newden;
char slash=' ';
do
{ is>>newnum>>slash>>newden;
} while(slash!='/');
fra.Setnume(newnum);
fra.Setdeno(newden);
return is;
}//*********************************************//
int main()
{ CFraction f1;
CFraction f2;
int i,x=1,y=1,z=1;
while(x!=0)
{
10
cout<<"********按数字选择功能********\n";
cout<<"[1]四则运算&幂运算\n";
cout<<"[2]逻辑运算\n";
cout<<"[0]退出程序\n\n";
cin>>x;
y=1;
while(x==1&&y!=0)
{ cout<<"********按数字选择功能********\n";
cout<<"[1]加法\n";
cout<<"[2]减法\n";
cout<<"[3]乘法\n";
cout<<"[4]除法\n";
cout<<"[5]乘方\n";
cout<<"[0]返回上一级\n\n";
cin>>y;
if(y==1||y==2||y==3||y==4)
{ cout<<"********按数字选择功能********\n";
cout<<"[1]两个分数\n";
cout<<"[2]分数与整数\n";
cout<<"[0]返回上一级 \n\n";
cin>>z;
if(z==1)
{ cout<<"输入第1个分数:\t";
cin>>f1;
cout<<"\n输入第2个分数:\t";
cin>>f2;
f1.Simplify();
f2.Simplify();
cout<<'\n'<>f1;
cout<<"\n输入整数:\t";
cin>>i;
f1.Simplify();
if(y==1)cout<>f1;
cout<<"\n输入幂数:\t";
cin>>i;
f1.Simplify();
12
CFraction exp=f1^i;
cout<<"\n"<>f1;
cout<<"\n输入第2个分数:\t";
cin>>f2;
f1.Simplify();
f2.Simplify();
cout<<"\n用布尔型变量表示,1为真,0为假\n\n";
cout<=f2)
cout<="<
本文档为【分数计算器】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。