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; }
運行結果: