/*
* 程序的版权和版本声明部分
* Copyright (c)2013, 在校学生
* All rightsreserved.
* 文件名称: 项目3.cpp
* 作 者:刘旺
* 完成日期:2014年3月21日
* 版本号: v1.0
*
* 输入描述:
* 问题描述:实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简)、
* 求反、比较(6种关系)的运算。可以从第5周项目2的代码开始工作。
* 程序输出:
* 问题分析:
*/
#include <iostream>
using namespace std ;
class CFraction
{
private:
int nume; // 分子
int deno; // 分母
public:
//构造函数及运算符重载的函数声明
CFraction():nume(0),deno(0){}
CFraction(int n, int d):nume(n),deno(d){}
CFraction operator+(CFraction &cp) ;
CFraction operator-(CFraction &cp) ;
CFraction operator*(CFraction &cp) ;
CFraction operator/(CFraction &cp) ;
void operator<(CFraction &cp) ;
void operator>(CFraction &cp) ;
void operator-() ;
void print() ; //显示
};
CFraction CFraction::operator+(CFraction &cp)
{
CFraction p ;
if(deno>cp.deno)
{
if(deno%cp.deno==0)
{
p.deno = deno ;
p.nume = (deno/cp.deno*cp.nume)+nume ;
}
else
{
p.deno = deno*cp.deno ;
p.nume = cp.nume*deno+nume*cp.deno ;
}
}
else if(deno < cp.deno)
{
if(cp.deno%deno==0)
{
p.deno = cp.deno ;
p.nume = (cp.deno/deno*nume)+cp.nume ;
}
else
{
p.deno = deno*cp.deno ;
p.nume = cp.nume*deno+nume*cp.deno ;
}
}
else
{
p.nume = nume+cp.nume ;
p.deno = deno ;
}
return p ;
}
CFraction CFraction::operator-(CFraction &cp)
{
CFraction p ;
if(deno>cp.deno)
{
if(deno%cp.deno==0)
{
p.deno = deno ;
p.nume = nume-(deno/cp.deno*cp.nume) ;
}
else
{
p.deno = deno*cp.deno ;
p.nume = nume*cp.deno-cp.nume*deno;
}
}
else if(deno < cp.deno)
{
if(cp.deno%deno==0)
{
p.deno = cp.deno ;
p.nume = (cp.deno/deno*nume)-cp.nume ;
}
else
{
p.deno = deno*cp.deno ;
p.nume = nume*cp.deno-cp.nume*deno ;
}
}
else
{
p.nume = nume-cp.nume ;
p.deno = deno ;
}
return p ;
}
CFraction CFraction::operator*(CFraction &cp)
{
CFraction p ;
p.nume = nume*cp.nume ;
p.deno = deno*cp.deno ;
return p ;
}
CFraction CFraction::operator/(CFraction &cp)
{
CFraction p ;
p.nume = nume*cp.deno ;
p.deno = deno*cp.nume ;
return p ;
}
void CFraction::print()
{
if(nume==0)
{
cout << nume << endl ;
}
else if(nume>=deno&&nume%deno==0)
{
cout << nume/deno << endl ;
}
else if(nume<deno&&deno%nume==0)
{
if(nume<0)
{
cout << "-1" << '/' << deno << endl ;
}
else
cout << '1' << '/' << deno << endl ;
}
else
{
cout << nume << '/' << deno << endl ;
}
}
void CFraction::operator>(CFraction &cp)
{
if(nume*cp.deno>deno*cp.nume)
{
cout << nume << '/' << deno << "大于" << cp.nume << '/' << cp.deno << endl ;
}
else if(nume*cp.deno==deno*cp.nume)
{
cout << nume << '/' << deno << "等于" << cp.nume << '/' << cp.deno << endl ;
}
else
{
cout << nume << '/' << deno << "小于" << cp.nume << '/' << cp.deno << endl ;
}
}
void CFraction::operator<(CFraction &cp)
{
if(nume*cp.deno>deno*cp.nume)
{
cout << nume << '/' << deno << "大于" << cp.nume << '/' << cp.deno << endl ;
}
else if(nume*cp.deno==deno*cp.nume)
{
cout << nume << '/' << deno << "等于" << cp.nume << '/' << cp.deno << endl ;
}
else
{
cout << nume << '/' << deno << "小于" << cp.nume << '/' << cp.deno << endl ;
}
}
void CFraction::operator-()
{
nume = -nume ;
}
int main()
{
CFraction rt(1,2) ;
CFraction ra(2,3) ;
CFraction d = rt + ra ;
cout << "1/2 + 2/3 = ";
d.print() ;
cout << "1/2 - 2/3 = ";
d = rt - ra ;
d.print() ;
d = rt * ra ;
cout << "1/2 * 2/3 = ";
d.print() ;
d = rt / ra ;
cout << "1/2 / 2/3 = ";
d.print() ;
rt > ra ;
-rt ;
cout << "1/2取反:" ;
rt.print() ;
return 0 ;
}