#ifndef CLASS_H
#define CLASS_H

#include <iostream>

using namespace std;

class Rational {

    //TODO 实现输入、输出、加法、乘法四个运算符重载函数,以友元函数形式实现
    friend istream & operator>>(istream &in,Rational &obj);
    friend ostream & operator<<(ostream &os,Rational &obj);
    friend Rational operator+(const Rational &r1,const Rational &r2);
    friend Rational operator*(const Rational &r1,const Rational &r2);

private:
    int num;
    int den;

    void ReduceFraction();

public:

    //TODO 定义单参数的构造函数
    Rational(double d) {
        den = 1;
        int i = 0;
        while (i < 5 && d > (int) d) {
            den *= 10;
            d *= 10;
            i++;
        }
        num = d;
        ReduceFraction();
    }

    // 带默认值的构造函数
    Rational(int n = 0, int d = 1) : num(n), den(d) { ReduceFraction(); }

    //TODO 定义double类型转换函数,必须是成员函数
    operator double () const{return (double(num)/den );}
};

#endif
#include "class.h"

// TODO 实现Rational类
Rational operator+(const Rational &r1,const Rational &r2){
    Rational tmp;
    tmp.num=r1.num*r2.den+r2.num*r1.den;
    tmp.den=r1.den*r2.den;
    tmp.ReduceFraction();
    return tmp;

}

Rational operator*(const Rational &r1,const Rational &r2){
    Rational tmp;
    tmp.num=r1.num*r2.num;
    tmp.den=r1.den*r2.den;
    tmp.ReduceFraction();
    return tmp;

}

istream & operator>>(istream &in,Rational &obj){
    in>>obj.num>>obj.den;
    obj.ReduceFraction();
    return in;
}

ostream & operator<<(ostream &os,Rational &obj){
    os<<obj.num<<'/'<<obj.den;
    return os;
}

void Rational::ReduceFraction() {
    int tmp = (num>den)?den:num;
    for (; tmp >1 ; --tmp) {
        if(num%tmp==0&&den%tmp==0)
        {
            num/=tmp;
            den/=tmp;
            break;
        }
    }
}
#include "class.h"

int main() {

	Rational r1, r2;
	cin >> r1 >> r2;   //实现输入运算符重载
	cout << "r1= " << r1 <<endl<< "r2= " << r2<<endl;
	Rational r3, r4;
	r3 = r1 + r2;     //实现+运算符重载
	cout << "r3= " << r3<<endl;       //实现输出运算符重载

	r4 = r1 * r2;     //实现*运算符重载
	cout << "r4= " << r4<<endl;

	Rational r5;
	r5 = 2.0 + (double) r1;    //定义单参数构造函数,精确到5位(已写好)
    // 或者 r5 = (Rational)2.0 + r1;
	cout << "r5= " << r5<<endl;

	double x;
	x = 1.2 + (double) r1;     //需要定义类型转换函数
    // 或者 x = (Rational)1.2 + r1;
	cout << "x= " << x;

	return 0;
}