#ifndef RATIONAL_H
#define RATIONAL_H
#include<iosfwd>
class Rational{
public:
int mNum;
int mDen;
public:
Rational(int numerator = 0,int denominator = 1);
Rational operator-()const;
friend Rational operator+(const Rational&,
const Rational&);
friend Rational operator-(const Rational&,
const Rational&);
friend Rational operator*(const Rational&,
const Rational&);
friend Rational operator/(const Rational&,
const Rational&);
friend std::ostream& operator<<(std::ostream&,const Rational&);
friend std::istream&
operator>>(std::istream&,Rational&);
Rational& operator+=(const Rational&);
Rational& operator-=(const Rational&);
Rational& operator*=(const Rational&);
Rational& operator/=(const Rational&);
friend bool operator<(const Rational&,
const Rational&);
friend bool operator>(const Rational&,
const Rational&);
friend bool operator<=(const Rational&,
const Rational&);
friend bool operator>=(const Rational&,
const Rational&);
friend bool operator==(const Rational&,
const Rational&);
friend bool operator!=(const Rational&,
const Rational&);
};

#endif // RATIONAL_H




#include<Rational.h>
#include<cassert>
#include<iostream>
using namespace std;

Rational::Rational(int numerator, int denominator):mNum(numerator),mDen(denominator)
{

}

Rational operator+(const Rational& r1,const Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
int den = r1.mDen*r2.mDen;
int num = r1.mNum*r2.mDen+r2.mNum*r1.mDen;
return Rational(num,den);
}

Rational operator-(const Rational& r1,const Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
int den = r1.mDen*r2.mDen;
int num = r1.mNum*r2.mDen-r2.mNum*r1.mDen;
return Rational(num,den);
}

Rational operator*(const Rational& r1,const Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
int den = r1.mDen*r2.mDen;
int num = r1.mNum*r2.mDen*(r2.mNum*r1.mDen);
return Rational(num,den);
}

Rational operator/(const Rational& r1,const Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
int den = r1.mDen*r2.mDen;
int num = r1.mNum*r2.mDen/(r2.mNum*r1.mDen);
return Rational(num,den);
}

std::ostream& operator<<(std::ostream& os,const Rational& r)
{
assert(r.mDen!=0);
os << r.mNum << "," << r.mDen;
return os;
}

std::istream& operator>>(std::istream& is,const Rational& r)
{
assert(r.mDen!=0);
is >> r.mDen >> r.mNum;
}

Rational& Rational::operator+=(const Rational& r)
{
assert(this->mDen!=0);assert(r.mDen!=0);
this->mDen = this->mDen*r.mDen;
this->mNum = this->mNum*r.mDen+r.mNum*this->mDen;
return *this;
}

Rational& Rational::operator-=(const Rational& r)
{
assert(this->mDen!=0);assert(r.mDen!=0);
this->mDen = this->mDen*r.mDen;
this->mNum = this->mNum*r.mDen-r.mNum*this->mDen;
return *this;
}

Rational& Rational::operator*=(const Rational& r)
{
assert(this->mDen!=0);assert(r.mDen!=0);
this->mDen = this->mDen*r.mDen;
this->mNum = this->mNum*r.mDen*(r.mNum*this->mDen);
return *this;
}

Rational& Rational::operator/=(const Rational& r)
{
assert(this->mDen!=0);assert(r.mDen!=0);
this->mDen = this->mDen*r.mDen;
this->mNum = this->mNum*r.mDen/(r.mNum*this->mDen);
return *this;
}

bool operator<(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
return num1<num2;
}

bool operator>(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
bool t = r1<r2;
return num1>num2;
}

bool operator<=(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
return num1<=num2;
}

bool operator>=(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
return num1<num2;
}

bool operator==(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
return num1==num2;
}

bool operator!=(const Rational& r1,Rational& r2)
{
assert(r1.mDen!=0);assert(r2.mDen!=0);
double num1 = r1.mNum/r1.mDen;
double num2 = r2.mNum/r2.mNum;
return num1!=num2;
}

int main()
{
Rational r1(6),r2(3),r3;
r3=r1-r2;
cout << r3 << endl;
r3=r1+r2;
cout << r3 << endl;
r3=r1*r2;
cout << r3 << endl;
r3=r1/r2;
cout << r3 << endl;
r3+=r1;
cout << r3 << endl;
r3-=r1;
cout << r3 << endl;
r3*=r1;
cout << r3 << endl;
r3/=r1;
cout << r3 << endl;
bool b;
b = r3<r1;
cout << b << endl;
b = r3>r1;
cout << b << endl;
//cin >> r3; error

}