C++语言对有理数的封装Rational

本类也可以采用模板化,将构造函数进行模板处理

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

 

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值