c++有理数类代码

本程序的作用

1.有理数的构造方法

2.有理数与有理数的四则运算

3.有理数的约分

4.有理数与double浮点数的四则运算

5.有理数与整型数int的四则运算

6.有理数的赋值运算,重载=运算符

7.有理数的输入cin>>

8.有理数的输出cout<<

9.测试程序

话不多说,直接上代码

Rational.h

#ifndef RATIONAL_H
#define RATIONAL_H
#include <iostream>

using namespace std;

class Rational
{
private:
    int fenzi, fenmu;
    void simply();//化简
    bool negative() const;//判断是否是负数
public:
    Rational(int numerator = 0, int denominator = 1);//构造函数
    Rational(const double n);//类型转换构造函数
    Rational(const Rational& ra);//复制构造函数
    //~Rational();没有动态分配,默认析构就行

    Rational& operator =(const Rational& ra);
    Rational& operator =(const double& n);//使有理数类对象能被double类型赋值

    //以下20个函数使有理数类对象能和double类型混合加减乘除和赋值
    Rational operator +(const Rational& ra);
    Rational operator -(const Rational& ra);
    Rational operator *(const Rational& ra);
    Rational operator /(const Rational& ra);
    friend Rational operator +(const double& n, const Rational& ra);
    friend Rational operator -(const double& n, const Rational& ra);
    friend Rational operator *(const double& n, const Rational& ra);
    friend Rational operator /(const double& n, const Rational& ra);
    Rational& operator +=(const Rational& ra);
    Rational& operator -=(const Rational& ra);
    Rational& operator *=(const Rational& ra);
    Rational& operator /=(const Rational& ra);

    Rational operator +(const double& n);
    Rational operator -(const double& n);
    Rational operator *(const double& n);
    Rational operator /(const double& n);
    Rational& operator +=(const double& n);
    Rational& operator -=(const double& n);
    Rational& operator *=(const double& n);
    Rational& operator /=(const double& n);
    // 有理数与整数int的计算
    Rational operator +(const int& n);
    Rational operator -(const int& n);
    Rational operator *(const int& n);
    Rational operator /(const int& n);
    friend Rational operator +(const int& n, const Rational& ra);
    friend Rational operator -(const int& n, const Rational& ra);
    friend Rational operator *(const int& n, const Rational& ra);
    friend Rational operator /(const int& n, const Rational& ra);
    Rational operator +=(const int& n);
    Rational operator -=(const int& n);
    Rational operator *=(const int& n);
    Rational operator /=(const int& n);

    int GetFenzi() { return fenzi; }
    int GetFenmu() { return fenmu; }
    void Set(int numerator, int denominator) { fenzi = numerator; fenmu = denominator; }

    //重载强制类型转换运算符,使得凡是应该出现double型的地方,均可以由有理数类对象替代。比如,可以使得
    //有理数类对象和普通double型比较大小成为可能
    operator double();

    //支持以m/n形式的有理数类对象输入输出,负号会显示在前面。
    friend ostream& operator <<(ostream& os, const Rational& ra);
    friend istream& operator >>(istream& is, Rational& ra);
};

#endif

Rational.cpp

#include <iostream>
#include <string>
#include <cstdlib>
#include "Rational.h"

using namespace std;
// 约分
void Rational::simply()//辗转相除法求最大公约数化简
{
	int a = fenzi, b = fenmu;
	while (b) {
		int mod = a % b;
		a = b;
		b = mod;
	}

	fenzi /= a;
	fenmu /= a;
}
// 是否为负数<0
bool Rational::negative() const
{
	return (fenzi < 0 || fenmu < 0);
}
// 构造方法
Rational::Rational(int numerator, int denominator)
{
	fenzi = numerator;
	fenmu = denominator;
	simply();//确保任意路径得到的有理数类对象均是最简形式
}
Rational::Rational(const double n)
{
	double numerator = n, denominator = 1;

	while ((int)numerator != numerator) {
		numerator *= 10;
		denominator *= 10;
	}

	fenzi = numerator, fenmu = denominator;
	simply();//确保任意路径得到的有理数类对象均是最简形式
}
// 拷贝方法
Rational::Rational(const Rational& ra) : fenzi(ra.fenzi), fenmu(ra.fenmu) {}
// 重载赋值运算符=
Rational& Rational::operator =(const Rational& ra)
{
	fenzi = ra.fenzi, fenmu = ra.fenmu;
	return *this;
}
Rational& Rational::operator =(const double& n)
{
	Rational tmp(n);
	*this = tmp;
	return *this;
}
// 有理数与有理数的运算+-*/
Rational Rational::operator +(const Rational& ra)
{
	int numerator = fenzi * ra.fenmu + ra.fenzi * fenmu;
	int denominator = fenmu * ra.fenmu;

	return Rational(numerator, denominator);
}
Rational Rational::operator -(const Rational& ra)
{
	int numerator = fenzi * ra.fenmu - ra.fenzi * fenmu;
	int denominator = fenmu * ra.fenmu;

	return Rational(numerator, denominator);
}
Rational Rational::operator *(const Rational& ra)
{
	int numerator = fenzi * ra.fenzi;
	int denominator = fenmu * ra.fenmu;

	return Rational(numerator, denominator);
}
Rational Rational::operator /(const Rational& ra)
{
	if (ra.fenzi == 0) {
		// 抛出异常
		throw exception("除数为0了!");
		cout << "除数为0了!" << endl;
		exit(1);
	}
	int numerator = fenzi * ra.fenmu;
	int denominator = fenmu * ra.fenzi;

	return Rational(numerator, denominator);
}
Rational& Rational::operator +=(const Rational& ra)
{
	Rational tmp = *this + ra;
	*this = tmp;
	return *this;
}
Rational& Rational::operator -=(const Rational& ra)
{
	Rational tmp = *this - ra;
	*this = tmp;
	return *this;
}
Rational& Rational::operator *=(const Rational& ra)
{
	Rational tmp = *this * ra;
	*this = tmp;
	return *this;
}
Rational& Rational::operator /=(const Rational& ra)
{
	Rational tmp = *this / ra;
	*this = tmp;
	return *this;
}
// 重载double浮点数与有理数的运算+-*/
Rational Rational::operator +(const double& n)
{
	Rational tmp(n);
	return *this + tmp;
}
Rational Rational::operator -(const double& n)
{
	Rational tmp(n);
	return *this - tmp;
}
Rational Rational::operator *(const double& n)
{
	Rational tmp(n);
	return *this * tmp;
}
Rational Rational::operator /(const double& n)
{
	Rational tmp(n);
	return *this / tmp;
}
Rational operator +(const double& n, const Rational& ra)
{
	Rational tmp(n);
	return tmp + ra;
}
Rational operator -(const double& n, const Rational& ra)
{
	Rational tmp(n);
	return tmp - ra;
}
Rational operator *(const double& n, const Rational& ra)
{
	Rational tmp(n);
	return tmp * ra;
}
Rational operator /(const double& n, const Rational& ra)
{
	Rational tmp(n);
	return tmp / ra;
}
Rational& Rational::operator +=(const double& ra)
{
	Rational tmp(ra);
	*this += tmp;
	return *this;
}
Rational& Rational::operator -=(const double& ra)
{
	Rational tmp(ra);
	*this -= tmp;
	return *this;
}
Rational& Rational::operator *=(const double& ra)
{
	Rational tmp(ra);
	*this *= tmp;
	return *this;
}
Rational& Rational::operator /=(const double& ra)
{
	Rational tmp(ra);
	*this /= tmp;
	return *this;
}
// 有理数转化为浮点数
Rational::operator double()
{
	return (double)fenzi / fenmu;
}
// 有理数与整数int的计算+-*/
Rational Rational::operator +(const int& n) {
	Rational tmp((double)n);
	return *this + tmp;
}
Rational Rational::operator -(const int& n) {
	Rational tmp((double)n);
	return *this - tmp;
}
Rational Rational::operator *(const int& n) {
	Rational tmp((double)n);
	return *this * tmp;
}
Rational Rational::operator /(const int& n) {
	Rational tmp((double)n);
	return *this / tmp;
}
Rational operator +(const int& n, const Rational& ra) {
	Rational tmp((double)n);
	return tmp + ra;
}
Rational operator -(const int& n, const Rational& ra) {
	Rational tmp((double)n);
	return tmp - ra;
}
Rational operator *(const int& n, const Rational& ra) {
	Rational tmp((double)n);
	return tmp * ra;
}
Rational operator /(const int& n, const Rational& ra) {
	Rational tmp((double)n);
	return tmp / ra;
}
Rational Rational::operator +=(const int& n) {
	Rational tmp((double)n);
	*this += tmp;
	return *this;
}
Rational Rational::operator -=(const int& n) {
	Rational tmp((double)n);
	*this -= tmp;
	return *this;
}
Rational Rational::operator *=(const int& n) {
	Rational tmp((double)n);
	*this *= tmp;
	return *this;
}
Rational Rational::operator /=(const int& n) {
	Rational tmp((double)n);
	*this /= tmp;
	return *this;
}
// 重写cout<<Rational输出方法
ostream& operator <<(ostream& os, const Rational& ra)
{
	if (ra.fenzi == 0)
		os << 0;
	else if (ra.negative())
		if (abs(ra.fenmu) == 1)
			os << "-" << abs(ra.fenzi);
		else
			os << "-" << abs(ra.fenzi) << "/" << abs(ra.fenmu); //如果是负数,符号写在前面。
	else
		if (abs(ra.fenmu) == 1)
			os << ra.fenzi;
		else
			os << ra.fenzi << "/" << ra.fenmu;
	return os;
}
// 重写cin>>Rational输入方法
istream& operator >>(istream& is, Rational& ra)
{
	string s;
	is >> s;

	int pos = s.find("/", 0);

	string sTmp = s.substr(0, pos);
	ra.fenzi = atoi(sTmp.c_str());//读入分子
	sTmp = s.substr(pos + 1, s.length() - pos - 1);
	ra.fenmu = atoi(sTmp.c_str());//读入分母

	return is;
}

RationalTest.cpp

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

int main()
{
	// 有理数测试
	Rational r1(1.5);
	Rational r2(7.5);
	cout << r1 + 1 << endl;
	cout << r1 - 1 << endl;
	cout << r1 * -2 << endl;
	cout << r1 / 2 << endl;

	cout << r1 + r2 << endl;
	cout << r1 - r2 << endl;
	cout << r1 * r2 << endl;
	cout << r1 / r2 << endl;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是大佬zvj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值