/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生
* All rights reserved.
* 作 者: 田庆
* 完成日期: 2012 年 4 月 11 日
* 版 本 号:
* 对任务及求解方法的描述部分
* 输入描述:
* 问题描述: 实现分数中的运算符重载,用于计算分数之间的加减乘除化简,求反比较等运算
* 程序输出:
* 程序头部的注释结束
*/
#include <iostream>
using namespace std;
int gcd(int x,int y); //求最大公约数
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
CFraction(int nu=0,int de=1):nume(nu),deno(de){}
void simplify();
void display();
CFraction operator+(const CFraction &c); //两个分数相加,结果要化简
CFraction operator-(const CFraction &c); //两个分数相减,结果要化简
CFraction operator*(const CFraction &c); //两个分数相乘,结果要化简
CFraction operator/(const CFraction &c); //两个分数相除,结果要化简
CFraction operator+(); //取正一目运算
CFraction operator-(); //取反一目运算
bool operator>(const CFraction &c);
bool operator<(const CFraction &c);
bool operator==(const CFraction &c);
bool operator!=(const CFraction &c);
bool operator>=(const CFraction &c);
bool operator<=(const CFraction &c);
};
//化简(使分子分母没有公因子)
void CFraction::simplify()
{
int n=gcd(nume,deno);
nume/=n;
deno/=n;
if (deno<0) // 将分母转化为正数
{
deno=-deno;
nume=-nume;
}
}
//求最大公约数;
int gcd(int x,int y)
{
int r;
while(y!=0)
{
r=x%y;
x=y;
y=r;
}
return x;
}
//显示分数
void CFraction::display()
{
cout<<"("<<nume<<"/"<<deno<<")"<<endl;
}
// 分数相加
CFraction CFraction::operator+(const CFraction &c)
{
CFraction t;
t.nume=nume*c.deno+c.nume*deno;
t.deno=deno*c.deno;
t.simplify();
return t;
}
// 分数相减
CFraction CFraction:: operator-(const CFraction &c)
{
CFraction t;
t.nume=nume*c.deno-c.nume*deno;
t.deno=deno*c.deno;
t.simplify();
return t;
}
// 分数相乘
CFraction CFraction:: operator*(const CFraction &c)
{
CFraction t;
t.nume=nume*c.nume;
t.deno=deno*c.deno;
t.simplify();
return t;
}
// 分数相除
CFraction CFraction:: operator/(const CFraction &c)
{
CFraction t;
t.nume=nume*c.deno;
t.deno=deno*c.nume;
t.simplify();
return t;
}
// 分数取正号
CFraction CFraction:: operator+()
{
return *this;
}
// 分数取负号
CFraction CFraction:: operator-()
{
CFraction x;
x.nume=-nume;
x.deno=-deno;
return x;
}
// 分数比较大小
bool CFraction::operator>(const CFraction &c)
{
int this_nu,c_nu,com_de;
this_nu=nume*c.deno; // 计算分数通分后的分子,同分母为deno*c.deno
c_nu=c.nume*deno;
com_de=deno*c.deno;
if (this_nu>c_nu&&com_de>0||this_nu<c_nu&&com_de<0) return true; // 将通分后的分子比较大小
return false;
}
// 分数比较大小
bool CFraction::operator<(const CFraction &c)
{
int this_nu,c_nu,com_de;
this_nu=nume*c.deno;
c_nu=c.nume*deno;
com_de=deno*c.deno;
if ((this_nu-c_nu)*com_de<0) return true;
return false;
}
// 分数比较大小
bool CFraction::operator==(const CFraction &c)
{
if (*this!=c)
return false;
else
return true;
}
// 分数比较大小
bool CFraction::operator!=(const CFraction &c)
{
if (*this>c || *this<c)
return true;
else
return false;
}
// 分数比较大小
bool CFraction::operator>=(const CFraction &c)
{
if (*this<c)
return false;
else
return true;
}
// 分数比较大小
bool CFraction::operator<=(const CFraction &c)
{
if (*this>c)
return false;
else
return true;
}
int main()
{
CFraction x(7,8),y(-5,15),s;
cout<<"俩分数分别为:"<<endl;
cout<<"x=7/8"<<endl;
cout<<"y=-5/15"<<endl;
s=+x+y;
cout<<"分数相加即+x+y=";
s.display();
cout<<endl;
s=x-y;
cout<<"分数相减即x-y=";
s.display();
cout<<endl;
s=x*y;
cout<<"分数相乘即x*y=";
s.display();
cout<<endl;
s=x/y;
cout<<"分数相除即x/y=";
s.display();
cout<<endl;
s=-x+y;
cout<<"分数相减取负即-x+y=";
s.display();
cout<<endl;
cout<<"x和y比较大小得: ";
cout<<"(7,8)";
if (x>y) cout<<"大于";
if (x<y) cout<<"小于";
if (x==y) cout<<"等于";
y.display();
cout<<endl;
system("pause");
return 0;
}
小结:对于分数的运算符重载和time类中的差不多,就是此外又巩固了一下求最大公约数的函数。