本类也可以采用模板化,将构造函数进行模板处理
#include <iostream>
#include <cmath> //包含abs函数取绝对值
using namespace std;
class Rational
{
public:
template <class T1,class T2>
Rational(T1 numerztor, T2 denominator = 1.0);//含两个参数的构造函数,设置为模板函数,包含(int,int)(double,double)(int,double)(double,int)简化代码
template <class T>//含有一个参数的构造函数 ,设置为模板函数,包含(int)(double)简化代码
Rational(T);
Rational();//空构造函数
void Simplify();//化简
friend int LCM(int, int);//求最小公倍数,方便通分,计算
friend const Rational operator+(const Rational R1,const Rational R2);//重载+,设置为常友元函数,参量均用const修饰
friend const Rational operator-(const Rational R1, const Rational R2);
friend const Rational operator*(const Rational R1, const Rational R2);
friend int GCD(int, int);//求最大公约数,方便化简
friend istream& operator>>(istream &in, Rational&R1);//重载输入符号函数,设置为友元
friend ostream& operator<<(ostream &out,Rational&R1);//重载输出符号函数,设置为友元
friend const Rational operator/(const Rational R1, const Rational R2);
template<class T>
Rational const operator=(T const);//重载=,类成员函数,设置为常函数,右参数可以为Rational,int,double,简化代码
Rational operator++();//重载前置++,
Rational operator++(int);//重载后置++
Rational operator!();//重载!去倒数
double Double();//分数转换为小数
private:
int Denominator; //分母
int Numerator;//分子
};
void Rational::Simplify()
{
int temp = GCD(this->Denominator, this->Numerator);
this->Denominator /= temp;
this->Numerator /= temp;
if (this->Denominator*this->Numerator >= 0)//识别正负
{
this->Denominator = abs(this->Denominator);
this->Numerator = abs(this->Numerator);
}
else
{
this->Denominator = abs(this->Denominator);
this->Numerator = -abs(this->Numerator);//解决负号异常问题
}
}
int LCM(int LCM1 = 1, int LCM2 = 1)//求最小公倍数
{
return (LCM1*LCM2) / GCD(LCM1, LCM2);
}
int GCD(int LCM1 = 1, int LCM2 = 1)//求最大公约数
{
if (LCM1<LCM2)
{
int temp = LCM1;
LCM1 = LCM2;
LCM2 = temp;
}
int mod = 0;
while (LCM2 != 0)
{
mod = LCM1%LCM2;
LCM1 = LCM2;
LCM2 = mod;
}
return LCM1;
}
double Rational::Double()//转化为实数
{
return (double)(this->Numerator)/(this->Denominator);
}
Rational Rational::operator!()
{
int temp = this->Denominator;
this->Denominator = this->Numerator;
this->Numerator = temp;
return *this; //返回对象本身
}
template <class T>
Rational const Rational::operator=(T const t)
{
Rational temp(t); //通过构造函数建立临时对象
this->Denominator = temp.Denominator;
this->Numerator = temp.Numerator;
return *this;
}
Rational Rational::operator++()
{
this->Numerator += this->Denominator; //前置++
return *this; //返回对象本身
}
Rational Rational::operator++(int) //后置++
{
Rational temp(this->Numerator,this->Denominator); //把对象记录下来建立临时对象
*this=*this+1; //将对象+1
return temp; //返回临时对象
}
const Rational operator*(const Rational R1, const Rational R2)
{
Rational temp;
temp.Denominator = R1.Denominator*R2.Denominator;
temp.Numerator = R1.Numerator*R2.Numerator;
return temp;
}
const Rational operator/(Rational R1, Rational R2)
{
return R1*(!R2);
}
const Rational operator+(const Rational R1,const Rational R2)
{
Rational temp;
temp.Denominator = LCM(R1.Denominator, R2.Denominator);
temp.Numerator = R1.Numerator*(temp.Denominator / R1.Denominator) + R2.Numerator*(temp.Denominator / R2.Denominator);
return temp;
}
const Rational operator-(const Rational R1,const Rational R2)
{
Rational temp;
temp.Denominator = LCM(R1.Denominator, R2.Denominator);
temp.Numerator = R1.Numerator*(temp.Denominator / R1.Denominator) - R2.Numerator*(temp.Denominator / R2.Denominator);
return temp;
}
istream& operator >> (istream &in, Rational&R1)
{
char c;
in >> R1.Numerator;
in >> c;
in >> R1.Denominator;
return in;
}
ostream& operator<<(ostream &out,Rational &R1) //与类中函数声明
{
R1.Simplify(); //化简分数
if (R1.Denominator == 0)
out << "分数输出错误分母为零!";//解决分母为零的异常
else if (R1.Denominator == 1)//简化分母为1,直接输出
out << R1.Numerator;
else if (R1.Numerator == 0) //分子为1
out << 0;
else
out << " " << R1.Numerator << "/" << R1.Denominator << " ";
return out;
}
Rational::Rational()
{
this->Denominator = 1;
this->Numerator = 0;
}
template <class T>
Rational::Rational(T numerztor) //单参量
{
this->Denominator = 1;
while (numerztor!=int(numerztor))//判断条件是否为有小数
{
numerztor *= 10;
this->Denominator *= 10;
}
this->Numerator = numerztor;
}
template <class T1,class T2>
Rational::Rational(T1 numerztor, T2 denominator ) //默认构造函数使分数为零 加1.0 重定义
{
if (denominator == 0)
{
cout << "输入错误分母不能为0!" << endl;
return; //直接退出构造
}
int i = 1;
while (numerztor != int(numerztor))
{
numerztor *= 10;
i *= 10;//记录倍数
}
int j = 1;
while (denominator != int(denominator))
{
denominator *= 10;
j *= 10;
}
if (i > j)
{
this->Numerator = int(numerztor);
this->Denominator = int(denominator*(i / j));
}
else
{
this->Numerator = int(numerztor*(i / j));
this->Denominator = int(denominator);
}
}
//主函数测试Rational类
void main()
{
Rational r1, r2(3), r3(2.5), r4(3, -4), r5(0.6, 1.2);//各种构造函数
int i = 4;
double d = 3.3;
cout << "各种类别的构造函数以及重载<<运算符的测试的测试";
cout << "r1:" << r1 << " r2:" << r2 << " r3:" << r3 << " r4:" << r4 << " r5:" << r5<<" i:"<<i<<" d:"<<d << endl;
cout << "有理数之间的+ - / *运算测试" << endl;
cout << "加法测试" << endl;
r1 = r3 + r2;
cout << "r1 = r3 + r2,r1:" << r1 << endl;
r1 = r2 + i;
cout << "r1 = r2 + i,r1:" << r1 << endl;
r1 = r2 + d;
cout << "r1 = r2 + d,r1:" << r1 << endl;
cout << "减法测试" << endl;
r1 = r5 - r4;
cout << "r1 = r5 - r4,r1:" << r1 << endl;
r1 = i - r4;
cout << "r1 = i-r4,r1:" << r1 << endl;
r1 = r5 - d;
cout << "r1 = r5 - d,r1:" << r1 << endl;
cout << "乘法测试" << endl;
r1 = r4*r3;
cout << "r1 = r4*r3,r1:" << r1 << endl;
r1 = r4*i;
cout << "r1 = r4*i,r1:" << r1 << endl;
r1 = r4*d;
cout << "r1 = r4*d,r1:" << r1 << endl;
cout << "除法测试" << endl;
r1 = r3 / r5;
cout << "r1 = r3 / r5,r1:" << r1 << endl;
r1 = r4 / i;
cout << "r1 = r4 / i,r1:" << r1 << endl;
r1 = d / r5;
cout << "r1 = d / r5,r1:" << r1 << endl;
cout << "+-*/运算后值不变" << endl;
cout << " r2:" << r2 << " r3:" << r3 << " r4:" << r4 << " r5:" << r5 << " i:" << i << " d:" << d << endl;
cout << "前置++测试" << endl;
cout << "r3:" << r3;
cout << "++r3:" << ++r3;
cout << " r3:" << r3 << endl;
cout << "后置++测试" << endl;
cout << "r3:" << r3;
cout << "r3++:" << r3++;
cout << " r3:" << r3 << endl;
cout << "对==符号的重载" << endl;
r1 = 2;
cout << "r1 = 2,r1=" << r1 << endl;
r1 = 3.6;
cout << "r1 = 3.6,r1=" << r1 << endl;
cout << "对!重载取倒数" << endl;
cout << "!r4:" << !r4 << endl;
cout << "对>>重载测试,请输入:" << endl;
cin >> r1;
cout << "您输入r1是:" << r1 << endl;
cout << "转化为小数:" << r1.Double() << endl;
}