C++抽象编程——面向对象(8)——最终版的Rational文件

Rational.h

代码如下:

/*
*这个文件包含了Rational类的声明 ,也包含了这个类的对应的重载运算符的自由
*函数的声明。
*/ 

#ifndef _Rational_h
#define _Rational_h

class Rational{
    public:
/*
*构造函数:Rational
*用法: Rational R; 
        Rational R1(n);
        Rational R2(x,y);
*-----------------------
* 创建一个Rational对象,默认构造的值为0,当只有一个参数n时候,
*构造的是一个等值于这个数的Rational值。当含有两个参数的时候,
*创建的是分数 x/y
*/
        Rational();
        Rational(int n);
        Rational(int x, int y);
/*
*方法:toString
*用法:string str = r.toString();
*-------------------------------
*将值以字符串的形式呈现出来
*/
        std::string toString();

#include "rationalpriv.h" 
};

/*
*运算符:<<
*-----------
*重载运算符,使得可以按分数的形式出现
*/
std::ostream & operator<<(std::ostream & os, Rational rat);

/*
*运算符 :+
*用法:r1 + r2;
*----------------
*重载运算符+,使得它可以进行分数之间的相加的运算,返回计算后的结果 
*/
Rational operator+(Rational r1, Rational r2); 

/*
*运算符 :-
*用法:r1 - r2;
*----------------
*重载运算符-,使得它可以进行分数之间的相减运算,返回计算后的结果 
*/
Rational operator-(Rational r1, Rational r2);

/*
*运算符 :* 
*用法:r1 * r2;
*----------------
*重载运算符+,使得它可以进行分数之间的相乘运算,返回计算后的结果 
*/
Rational operator*(Rational r1, Rational r2);

/*
*运算符 :/ 
*用法:r1 / r2;
*----------------
*重载运算符/,使得它可以进行分数之间的相除运算,返回计算后的结果 
*/
Rational operator/(Rational r1, Rational r2);

#endif   

Rationalpriv.h

代码如下:

/*
*这部分内容为Rational类的私有部分成员或不希望被用户看到的内容 
*将运算符以friend形式声明
*/ 
friend Rational operator+(Rational r1, Rational r2);
friend Rational operator-(Rational r1, Rational r2);
friend Rational operator*(Rational r1, Rational r2);
friend Rational operator/(Rational r1, Rational r2);

private:
/*实例化参数*/ 
    int num;//分子 
    int den;//分母 

这里可能会有疑问,就是我们这里已经声明了Rational operator+(Rational r1, Rational r2);这些函数,为何我们还要在上面头文件的Rational类后面再次声明呢?答案是,我们在这里声明的东西依旧属于类内,是为了声明类与这个自由函数的关系是friend。而Rational.h文件在Rational后面声明的才是函数的原型,自由函数不属于某个类,但是它可以和某个类有某种关系。

Rational.cpp

代码如下:

#include <cstdlib>
#include <cmath>
#include "error.h"
#include "rational.h"
#include "strlib.h"
using namespace std;
/*函数原型*/
int gcd(int x, int y);

/*构造函数*/ 
Rational::Rational(){
    num = 0;
    den = 1;
} 
Rational::Rational(int n){
    num = n;
    den = 1;
}
Rational::Rational(int x, int y) {
    if (y == 0) error("错误,分母不能为0");
    if (x == 0) {
    num = 0;
    den = 1;
    } else {
        int g = gcd(abs(x), abs(y));
        num = x / g;
        den = abs(y) / g;
        if (y < 0) num = -num;
    }
}

/*实现toString函数*/ 
string Rational::toString(){
    if(den == 1) { //如果这里我们写成了 = 会出现什么情况? 
    return integerToString(num);
    }else{
        return integerToString(num) + "/" + integerToString(den);
    }
}
/*实现插入运算符<<的重载*/
ostream & operator<<(ostream & os, Rational rat){
    return os << rat.toString();
} 
/*实现 + - * / 的重载*/
Rational operator+(Rational r1, Rational r2) {
    return Rational(r1.num * r2.den + r2.num * r1.den, r1.den * r2.den);
}
Rational operator-(Rational r1, Rational r2) {
    return Rational(r1.num * r2.den - r2.num * r1.den, r1.den * r2.den);
}
Rational operator*(Rational r1, Rational r2) {
    return Rational(r1.num * r2.num, r1.den * r2.den);
}
Rational operator/(Rational r1, Rational r2) {
    return Rational(r1.num * r2.den, r1.den * r2.num);
}

/*
*函数:gcd(great command devision)
*用法; int n = gcd(x,y)
*-----------------------
*求x,y 的最大公约数
*/
int gcd(int x, int y) {
    int r = x % y;
    while (r != 0) {
        x = y;
        y = r;
        r = x % y;
    }
    return y;
}

这里我在编码的时候,犯了一个小失误,if(den == 1)写成了 if(den = 1),程序不会报错,可以正常运行,但是会出现结果有问题,至于是什么就自己去试试了。可以在测试代码一这里运行。至于为什么会这样,可以留言。我会回复。
这里涉及到两个自定义的头文件
关于”strlib.h”,参考:C++抽象编程——自定义strlib文件
关于”error.h”,看下面:

error.h

#ifndef _error_h
#define _error_h

/*
*函数:error
*用法: error("string")
*----------------------
*返回错误信息,并终止程序
*/ 
void error(std::string msg);

#endif

error.cpp

#include <iostream>
#include <string>
#include <cstdlib> //EXIT_FAILURE
using namespace std;
void error(string msg){
    cerr << msg << endl;
    exit(EXIT_FAILURE);
}

测试代码1

#include <iostream>
#include "Rational.h"
using namespace std;
int main(){
    Rational r;
    cout << r << endl;
    Rational r2(4);
    cout << r2 <<endl;
    Rational r3(1,3);
    cout << r3 << endl; 
    Rational r4(3,0);
    cout << r4 << endl;
    return 0;
}

测试结果如下:

测试代码2

#include <iostream>
#include "Rational.h"
using namespace std;
int main(){
    Rational r1(1,3),r2(1,6);
    cout << r1 + r2 << endl;
    cout << r1 - r2 << endl;
    cout << r1 * r2 << endl;
    cout << r1 / r2 << endl;
    cout << r2 - r1 << endl;
    cout << r2 / r1 << endl;
    return 0;
}

测试结果如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值