#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;
}