﻿ 实数Rational类的编译通过了，但是结果有点小问题。 | Code Bye

# 实数Rational类的编译通过了，但是结果有点小问题。

7年前 (2015-11-15) 582次浏览
Rational.h
#ifndef RATIONAL_CLASS
#define RAIIONAL_CLASS
#include <iostream>
using namespace std;
class Rational {
private:
int numerator, denominator;
static int digits(double d);
static int gcd(int a, int b);
Rational normalize();
public:
Rational(int n = 0, int d = 1);
Rational(double d);
Rational(const Rational& r);
Rational& operator = (const Rational& rhs);
Rational operator + (const Rational& rhs) const ;
Rational operator – (const Rational& rhs) const ;
Rational operator * (const Rational& rhs) const ;
Rational operator / (const Rational& rhs) const ;
Rational& operator += (const Rational& rhs);
Rational& operator -= (const Rational& rhs);
Rational& operator *= (const Rational& rhs);
Rational& operator /= (const Rational& rhs);
friend Rational operator + (int n, const Rational& rhs);
friend Rational operator – (int n, const Rational& rhs);
friend Rational operator * (int n, const Rational& rhs);
friend Rational operator / (int n, const Rational& rhs);
friend int& operator += (int& n, const Rational& rhs);
friend int& operator -= (int& n, const Rational& rhs);
friend int& operator *= (int& n, const Rational& rhs);
friend int& operator /= (int& n, const Rational& rhs);
friend Rational operator + (double n, const Rational& rhs);
friend Rational operator – (double n, const Rational& rhs);
friend Rational operator * (double n, const Rational& rhs);
friend Rational operator / (double n, const Rational& rhs);
friend double& operator += (double& n, const Rational& rhs);
friend double& operator -= (double& n, const Rational& rhs);
friend double& operator *= (double& n, const Rational& rhs);
friend double& operator /= (double& n, const Rational& rhs);
bool operator > (const Rational& rhs) const;
bool operator == (const Rational& rhs) const;
bool operator >= (const Rational& rhs) const;
bool operator < (const Rational& rhs) const;
bool operator <= (const Rational& rhs) const;
bool operator != (const Rational& rhs) const;
friend bool operator > (int n, const Rational& rhs);
friend bool operator >= (int n, const Rational& rhs);
friend bool operator < (int n, const Rational& rhs);
friend bool operator <= (int n, const Rational& rhs);
friend bool operator == (int n, const Rational& rhs);
friend bool operator != (int n, const Rational& rhs);
friend bool operator > (double n, const Rational& rhs);
friend bool operator >= (double n, const Rational& rhs);
friend bool operator < (double n, const Rational& rhs);
friend bool operator <= (double n, const Rational& rhs);
friend bool operator == (double n, const Rational& rhs);
friend bool operator != (double n, const Rational& rhs);
Rational operator + () const;
Rational operator – () const;
Rational& operator ++ ();
Rational operator ++ (int);
Rational& operator — ();
Rational operator — (int);
operator int () const;
operator double () const;
friend ostream& operator << (ostream& os, const Rational& rhs) ;
friend istream& operator >> (istream& is, const Rational& rhs);
void Print() {
cout << this->normalize() << endl;
}
};
#endif
Rational.cpp
#include <iostream>
#include <cassert>
#include <cmath>
#include “Rational.h”
using namespace std;
int Rational::digits(double d) {
char buffer;
sprintf(buffer, “%g”, d);
int n = strlen(buffer);
int i = 0;
while (buffer[i] != “”\0″” && buffer[i] != “”.””)
++i;
if(i == n)
return 0;
return n – i – 1;
}
int Rational::gcd(int a, int b) {
int r;
while(b != 0) {
r = a % b;
a = b;
b = r;
}
return a;
}
Rational Rational::normalize() {
int n = gcd(this->numerator, this->denominator);
assert(n != 0);
this->numerator /= n;
this->denominator /= n;
if(this->denominator < 0) {
this->numerator *= -1;
this->denominator *= -1;
}
return *this;
}
Rational::Rational(int n, int d) {
this->numerator = n;
this->denominator = (d == 0 ? 1 : d);
}
Rational::Rational(double d) {
int n = Rational::digits(d);
double e = pow(10.0, n);
this->numerator = int(d * e);
this->denominator = int(e);
this->normalize();
}
Rational::Rational(const Rational& r) {
this->numerator = r.numerator;
this->denominator = r.denominator;
}
Rational& Rational::operator = (const Rational& rhs) {
this->numerator = rhs.numerator;
this->denominator = rhs.denominator;
return *this;
}
Rational Rational::operator + (const Rational& rhs) const {
Rational r;
r.numerator = this->numerator * rhs.denominator +
this->denominator * rhs.numerator;
r.denominator = this->denominator * rhs.denominator;
return r.normalize();
}
Rational Rational::operator – (const Rational& rhs) const {
Rational r;
r.numerator = this->numerator * rhs.denominator –
this->denominator * rhs.numerator;
r.denominator = this->denominator * rhs.denominator;
return r.normalize();
}
Rational Rational::operator * (const Rational& rhs) const {
Rational r;
r.numerator = this->numerator * rhs.numerator;
r.denominator = this->denominator * rhs.denominator;
return r.normalize();
}
Rational Rational::operator / (const Rational& rhs) const {
assert(rhs.numerator != 0);
Rational r;
r.numerator = this->numerator * rhs.denominator;
r.denominator = this->denominator * rhs.numerator;
return r.normalize();
}
Rational& Rational::operator += (const Rational& rhs) {
return *this = *this + rhs;
}
Rational& Rational::operator -= (const Rational& rhs) {
return *this = *this – rhs;
}
Rational& Rational::operator *= (const Rational& rhs) {
return *this = *this * rhs;
}
Rational& Rational::operator /= (const Rational& rhs) {
return *this = *this / rhs;
}
Rational operator + (int n, const Rational& rhs) {
return Rational(n) + rhs;
}
Rational operator – (int n, const Rational& rhs) {
return Rational(n) – rhs;
}
Rational operator * (int n, const Rational& rhs) {
return Rational(n) * rhs;
}
Rational operator / (int n, const Rational& rhs) {
return Rational(n) / rhs;
}
int& operator += (int& n, const Rational& rhs) {
n = n * rhs.denominator + rhs.numerator;
return n /= rhs.denominator;
}
int& operator -= (int& n, const Rational& rhs) {
n = n * rhs.denominator – rhs.numerator;
return n /= rhs.denominator;
}
int& operator *= (int& n, const Rational& rhs) {
n = n * rhs.numerator;
return n /= rhs.denominator;
}
int& operator /= (int& n, const Rational& rhs) {
assert(rhs.numerator != 0);
n = n * rhs.denominator;
return n /= rhs.numerator;
}
Rational operator + (double n, const Rational& rhs) {
return Rational(n) + rhs;
}
Rational operator – (double n, const Rational& rhs) {
return Rational(n) – rhs;
}
Rational operator * (double n, const Rational& rhs) {
return Rational(n) * rhs;
}
Rational operator / (double n, const Rational& rhs) {
return Rational(n) / rhs;
}
double& operator += (double& n, const Rational& rhs) {
return n += (double)rhs.numerator / rhs.denominator;
}
double& operator -= (double& n, const Rational& rhs) {
return n -= (double)rhs.numerator / rhs.denominator;
}
double& operator *= (double& n, const Rational& rhs) {
return n *= (double)rhs.numerator / rhs.denominator;
}
double& operator /= (double& n, const Rational& rhs) {
return n /= (double)rhs.numerator / rhs.denominator;
}
bool Rational::operator < (const Rational& rhs) const {
return (*this – rhs).numerator < 0;
}
bool Rational::operator == (const Rational& rhs) const {
return (*this – rhs).numerator  == 0;
}
bool Rational::operator > (const Rational& rhs) const {
return rhs < *this;
}
bool Rational::operator >= (const Rational& rhs) const {
return !(*this < rhs);
}
bool Rational::operator <= (const Rational& rhs) const {
return !(*this > rhs);
}
bool Rational::operator != (const Rational& rhs) const {
return !(*this == rhs);
}
bool operator > (int n, const Rational& rhs) {
return Rational(n) > rhs;
}
bool operator >= (int n, const Rational& rhs) {
return Rational(n) >= rhs;
}
bool operator < (int n, const Rational& rhs) {
return Rational(n) < rhs;
}
bool operator <= (int n, const Rational& rhs) {
return Rational(n) <= rhs;
}
bool operator == (int n, const Rational& rhs) {
return Rational(n) == rhs;
}
bool operator != (int n, const Rational& rhs) {
return Rational(n) != rhs;
}
bool operator > (double n, const Rational& rhs) {
return n > (double)rhs.numerator / rhs.denominator;
}
bool operator >= (double n, const Rational& rhs) {
return n >= (double)rhs.numerator / rhs.denominator;
}
bool operator < (double n, const Rational& rhs) {
return n < (double)rhs.numerator / rhs.denominator;
}
bool operator <= (double n, const Rational& rhs) {
return n <= (double)rhs.numerator / rhs.denominator;
}
bool operator == (double n, const Rational& rhs) {
return n == (double)rhs.numerator / rhs.denominator;
}
bool operator != (double n, const Rational& rhs) {
return n != (double)rhs.numerator / rhs.denominator;
}
Rational Rational::operator + () const {
return *this;
}
Rational Rational::operator – () const {
return Rational(- this->numerator, this->denominator);
}
Rational& Rational::operator ++ () {
this->numerator += this->denominator;
return *this;
}
Rational Rational::operator ++ (int) {
Rational temp(*this);
++(*this);
return temp;
}
Rational& Rational::operator — () {
this->numerator -= this->denominator;
return *this;
}
Rational Rational::operator — (int) {
Rational temp(*this);
–(*this);
return temp;
}
Rational::operator int () const {
return this->numerator / this->denominator;
}
Rational::operator double () const {
return (double)this->numerator / this->denominator;
}
ostream& operator << (ostream& os, const Rational& rhs)  {
os << rhs.numerator << “/ ” << rhs.denominator;
return os;
}
istream& operator >> (istream& is, const Rational& rhs) {
char dump;
is >> rhs.numerator >> dump >> rhs.denominator;
return is;
}

+-*/一般不提供 const 签名函数

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明实数Rational类的编译通过了，但是结果有点小问题。

[1034331897@qq.com] 