C++ 有理數類


C++只提供了整數類和浮點數類,但是沒有有理數類,所以需要自己寫一個有理數類。

我們將使用分數來表示一個有理數。即Rational類有兩個數據域,分子叫做 numerator,分母叫做denominator,且分母不能為0。

同時,一個有理數可能又很多表現形式,比如1/3可以表示為2/6,3/9等,我們統一用化簡后的形式表示這個數,比如1/3。

Rational.h

#ifndef RATIONAL_H
#define RATIONAL_H
#include <string>
using namespace std;

class Rational{
public:
    //無參構造函數
    Rational();
    //有參構造函數,兩個參數分別是分子和分母
    Rational(int numerator, int denominator);
    //獲取分子
    int getNumerator() const;
    //獲取分母
    int getDenominator() const;
    //兩數求和,返回Rational類對象
    Rational add(const Rational& secondRational) const;
    //兩數求差,返回Rational類對象
    Rational subtract(const Rational& secondRational) const;
    //兩數相乘,返回Rational類對象
    Rational multiply(const Rational& secondRational) const;
    //兩數相除,返回Rational類對象
    Rational divide(const Rational& secondRational) const;
    //比較兩個有理數
    int compareTo(const Rational& secondRational) const;
    //若兩個有理數相等,則返回true;否則,返回false
    bool equals(const Rational& secondRational) const;
    //返回一個整型數
    int intValue() const;
    //返回一個浮點數
    double doubleValue() const;
    //返回一個字符串
    string toString() const;

private:
    //分子
    int numerator;
    //分母
    int denominator;
    //求公因數,用於約分
    static int gcd(int n, int d);
};

#endif // RATIONAL_H

Rational.cpp

#include "Rational.h"
#include <sstream>
#include <cstdlib>

Rational::Rational() {
    //構造一個值為0的對象
    this->numerator = 0;
    this->denominator = 1;
}

Rational::Rational(int numerator, int denominator) {
    int temp = gcd(numerator, denominator);
    this->numerator = ((denominator > 0) ? 1 : -1) * numerator / temp;
    this->denominator = abs(denominator) / temp;
}

int Rational::getNumerator() const {
    return this->numerator;
}

int Rational::getDenominator() const{
    return this->denominator;
}

int Rational::gcd(int n, int d) {
    int n1 = abs(n);
    int n2 = abs(d);
    int gcd = 1;

    for (int i = 1; i <= n1 && i <= n2; i ++) {
        if (n1 % i == 0 && n2 % i == 0) {
            gcd = i;
        }
    }

    return gcd;
}

Rational Rational::add(const Rational& secondRational) const {
    int n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator();
    int d = denominator * secondRational.getDenominator();

    return Rational(n, d);
}

Rational Rational::subtract(const Rational& secondRational) const {
    int n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator();
    int d = denominator * secondRational.getDenominator();

    return Rational(n, d);
}

Rational Rational::multiply(const Rational& secondRational) const {
    int n = numerator * secondRational.getNumerator();
    int d = denominator * secondRational.getDenominator();

    return Rational(n, d);
}

Rational Rational::divide(const Rational& secondRational) const {
    int n = numerator * secondRational.getDenominator();
    int d = denominator * secondRational.getNumerator();

    return Rational(n, d);
}

int Rational::compareTo(const Rational& secondRational) const {
    //作差法比較大小
    Rational temp = subtract(secondRational);

    if (temp.getNumerator() < 0) {
        //小於
        return -1;
    } else if (temp.getNumerator() == 0) {
        //等於
        return 0;
    } else {
        //大於
        return 1;
    }
}

bool Rational::equals(const Rational& secondRational) const {
    if(compareTo(secondRational) == 0) {
        return true;
    } else {
        return false;
    }
}

int Rational::intValue() const {
    return getNumerator()/getDenominator();
}

double Rational::doubleValue() const {
    return 1.0 * getNumerator()/getDenominator();
}

string Rational::toString() const {
    stringstream ss;
    ss << numerator;

    if(denominator > 1) {
        ss << "/" <<denominator;
    }

    return ss.str();
}

main.cpp

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

using namespace std;

int main()
{
    Rational r1(4, 2);
    Rational r2(2, 3);

    cout << "r1的值為" << r1.toString() << endl << "r2的值為" << r2.toString() << endl;

    cout << "-------------------------------" << endl;
    cout << r1.toString() << " + " << r2.toString() << " = " << r1.add(r2).toString() << endl;
    cout << r1.toString() << " - " << r2.toString() << " = " << r1.subtract(r2).toString() << endl;
    cout << r1.toString() << " * " << r2.toString() << " = " << r1.multiply(r2).toString() << endl;
    cout << r1.toString() << " / " << r2.toString() << " = " << r1.divide(r2).toString() << endl;

    cout << "-------------------------------" << endl;
    cout << "r2向下取整:"  << r2.intValue() << endl;
    cout << "r2轉換為小數:"  << r2.doubleValue() << endl;

    cout << "-------------------------------" << endl;
    cout << "r1.compareTo(r2)的返回值是:" << r1.compareTo(r2) << endl;
    cout << "r2.compareTo(r1)的返回值是:" << r2.compareTo(r1) << endl;
    cout << "r1.compareTo(r1)的返回值是:" << r1.compareTo(r1) << endl;

    cout << "-------------------------------" << endl;
    cout << "r1.equals(r1)的返回值是:" << r1.equals(r1) << endl;
    cout << "r1.equals(r2)的返回值是:" << r1.equals(r2) << endl;

    cout << "-------------------------------" << endl;
    return 0;
}

運行結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM