# 第十三周项目1-分数类中的运算符重载（改进）

/*
*文件名称：zwj.cpp
*作    者：张伟晶
*完成日期：2016年6月2日
*版 本 号：v1.0
*
*问题描述：实现分数类中的运算符重载，加减乘除比较；在此基础上增加取正求反，求倒数运算,交换律
*输入描述：
*程序输出：
*/
#include<iostream>
#include<cmath>
using namespace std;
class CFraction
{
private:
int num;//分子
int deno;//分母
public:

//构造函数及运算符重载的声明
CFraction (int nu=0,int de=1):num(nu),deno(de){}
void huajian();

friend istream &operator>>(istream &in,CFraction &x);
friend ostream &operator<<(ostream &out,CFraction x);

///下面！！！
friend CFraction operator + (double d,const CFraction &c);
friend CFraction operator - (double d,const CFraction &c);
friend CFraction operator * (double d,const CFraction &c);
friend CFraction operator / (double d,const CFraction &c);

CFraction operator +(const CFraction &c);
CFraction operator -(const CFraction &c);
CFraction operator *(const CFraction &c);
CFraction operator /(const CFraction &c);

//分数比较大小
bool operator>(const CFraction &c);
bool operator<(const CFraction &c);
bool operator==(const CFraction &c);
//按位取反运算符
CFraction operator+();
CFraction operator-();
CFraction operator~();

///分数与整数
CFraction operator + (double &d);
CFraction operator - (double &d);
CFraction operator * (double &d);
CFraction operator / (double &d);

};
CFraction  operator + (double d,const CFraction &c)
{
CFraction n;
n.num=c.num+d*c.deno;
n.deno=c.deno;
return n;
}
CFraction operator - (double d,const CFraction &c)
{
CFraction n;
n.num=d*c.deno-c.num;
n.deno=c.deno;
return n;
}
CFraction operator * (double d,const CFraction &c)
{
CFraction n;
n.num=c.num*d;
n.deno=c.deno;
return n;
}
CFraction operator / (double d,const CFraction &c)
{
CFraction n;
n.num=c.deno*4;
n.deno=c.num;
return n;
}
/**************************   */
/*
CFraction operator+(double &d,CFraction &c)
{
CFraction n;
n.num=c.num+c.deno*d;
n.deno=c.deno;
return n;
}
*/
CFraction CFraction::operator+(double &d)
{
CFraction n;
n.num=num+d*deno;
n.deno=deno;
n.huajian();
return n;
}

CFraction CFraction::operator-(double &d)
{
CFraction n;
n.num=num-d*deno;
n.deno=deno;
n.huajian();
return n;
}
CFraction CFraction::operator*(double &d)
{
CFraction n;
n.num=num*d;
n.deno=deno;
n.huajian();
return n;
}
CFraction CFraction::operator/(double &d)
{
CFraction n;
n.num=num;
n.deno=deno*d;
n.huajian();
return n;
}
//重载函数的实现以及用于测试的main（）函数
void CFraction::huajian()
{

int k;
if(num>0)
k=2;
else
{
k=1;
num=-num;
}
int m,n,r=1;
m=num;
n=deno;
while(r=m%n)
{
m=n;
n=r;
}
num=num/n*pow(-1,k);
deno=deno/n;

}
/*
CFraction operator+(double &d,CFraction &c)
{
CFraction n;
n.num=c.num+c.deno*d;
n.deno=c.deno;
return n;
}
*/
// 重载输入运算符>>
istream &operator>>(istream &in,CFraction &x)
{
char ch;
while(1)
{
cin>>x.num>>ch>>x.deno;
if (x.deno==0)
cerr<<"分母为0, 请重新输入\n";
else if(ch!='/')
cerr<<"格式错误（形如m/n）! 请重新输入\n";
else
break;
}
return cin;
}

// 重载输出运算符<<
ostream &operator<<(ostream &out,CFraction x)
{
cout<<x.num<<'/'<<x.deno;
return cout;
}

CFraction CFraction::operator+(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno+c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator-(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno-c.num*deno;
w.huajian();
return w;
}
CFraction CFraction::operator*(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.num;
w.huajian();
return w;
}
CFraction CFraction::operator/(const CFraction &c)
{
CFraction w;
w.deno=deno*c.deno;
w.num=num*c.deno/c.num*deno;
w.huajian();
return w;
}
//比较大小
bool CFraction::operator>(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)>0)
return true;
else
return false;
}
bool CFraction::operator<(const CFraction &c)
{

int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)<0)
return true;
else
return false;
}
bool CFraction::operator==(const CFraction &c)
{
int m,n;
m=num*c.deno;
n=c.num*deno;
if((m-n)==0)
return true;
else
return false;
}
//按位取反
CFraction CFraction::operator+()
{
return *this;
}
CFraction CFraction ::operator-()
{
CFraction n;
n.num=-num;
n.deno=deno;
return n;
}
CFraction CFraction::operator~()
{
CFraction n;

if(num<0)
{
n.deno=-num;
n.num=-deno;
}
else
{
n.num=deno;
n.deno=num;
}
return n;
}
int main()
{
CFraction x,y,z;
cout<<"请输入x，y"<<endl;

cout<<"x:";
cin>>x;
cout<<"y:";
cin>>y;
cout<<"**********加减乘除**********"<<endl;
z=x+y;
cout<<"x+y="<<z<<endl;
z=x-y;
cout<<"x-y="<<z<<endl;
z=x*y;
cout<<"x*y="<<z<<endl;
z=x/y;
cout<<"x/y="<<z<<endl;
cout<<endl;

cout<<"**********比较大小**********"<<endl;
if(x>y) cout<<"x>y"<<endl;
if(x<y) cout<<"x<y"<<endl;
if(x==y) cout<<"x=y"<<endl;
cout<<endl;

cout<<"**********分数取正反倒数**********"<<endl;
cout<<+x<<endl;
cout<<-x<<endl;
cout<<~x<<endl;

cout<<"**********交换律**********"<<endl;
z=x+3;
cout<<"x+3="<<z<<endl;
z=x-3;
cout<<"x-3="<<z<<endl;
z=x*3;
cout<<"x*3="<<z<<endl;
z=x/3;
cout<<"x/3="<<z<<endl;
cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"<<endl;
z=4+x;
cout<<"4+x="<<z<<endl;
z=4-x;
cout<<"4-x="<<z<<endl;
z=4*x;
cout<<"4*x="<<z<<endl;
z=4/x;
cout<<"4/x="<<z<<endl;

return 0;
}


   friend CFraction operator + (double d,const CFraction &c);
friend CFraction operator - (double d,const CFraction &c);
friend CFraction operator * (double d,const CFraction &c);
friend CFraction operator / (double d,const CFraction &c);

#### 一个时钟类的运算符重载操作

2008年11月02日 15KB 下载

#### point类重载运算符

2011年12月09日 2KB 下载

#### 分数的加减乘除及化简c++

2010年01月18日 4KB 下载

#### 设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。

2015年07月15日 2KB 下载

#### 分数的运算符重载!!!!

2009年06月08日 1KB 下载

#### linux—unix课件\第十讲1-进程管理.ppt

2011年10月04日 368KB 下载

#### 分数-运算符重载

2015年07月14日 5KB 下载

#### 定义和使用分数类fraction

2013年01月06日 523KB 下载

#### c++自定义string类

2012年04月07日 24KB 下载

#### 【UI】第十三周 WorkShop产品设计

2018年06月26日 15:38