#ifndef Rational_hpp
#define Rational_hpp
#include <stdio.h>
#include <string>
#include <iostream>
using namespace::std;
class Rational{
public:
Rational();
Rational(int numerator,int denominator);
int getNumerator()const;
int getDemominator()const;
Rational add(const Rational& secondRational);
Rational sub(const Rational& secondRational);
Rational mult(const Rational& secondRational);
Rational div(const Rational& secondRational);
int compareTo(const Rational& secondRational);
bool equal(const Rational& secondRational);
int intValue();
double doubleValue();
string toString();
Rational(int numerator);
//重载简写运算符
Rational& operator+=(const Rational& secondRational);
Rational& operator-=(const Rational& secondRational);
Rational& operator*=(const Rational& secondRational);
Rational& operator/=(const Rational& secondRational);
//重载运算符[]
int& operator[](int index);
//重载自增自减运算符(前缀)
Rational& operator++();
Rational& operator--();
//重载自增自减运算符(后缀)
Rational operator++(int dummy);
Rational operator--(int dummy);
//重载'+','-'运算符(正负)
Rational operator+();
Rational operator-();
//重载<<,>>运算符,使用友元类,
friend ostream& operator<<(ostream& ,const Rational&);
friend istream& operator>>(istream&, Rational&);
private:
int numerator,denominator;
static int gcd(int n,int d);
};
//重载非成员函数还例如>,<,<=,>=,==,!=号以及+,-,*,/
Rational operator+(Rational& r1,Rational& r2);
Rational operator-(Rational& r1,Rational& r2);
Rational operator*(Rational& r1,Rational& r2);
Rational operator/(Rational& r1,Rational& r2);
#endif /* Rational_hpp */
#include "Rational.hpp"
#include <cstdlib>
#include <sstream>
Rational::Rational(){
numerator = 0;
denominator = 1;
}
Rational::Rational(int numerator,int denominator){
int factor = gcd(numerator, denominator);
this->numerator = (numerator>0?1:-1) * abs(numerator)/factor;
this->denominator = abs(denominator)/factor;
}
int Rational::gcd(int n, int d){
int a = abs(n);
int b = abs(d);
int gcd = 1;
for (int i=1; i<=a&&i<=b; i++) {
if (a%i==0&&b%i==0) {
gcd = i;
}
}
return gcd;
}
Rational::Rational(int numerator){
this->numerator = numerator;
this->denominator = 1;
}
int Rational::getNumerator()const{
return numerator;
}
int Rational::getDemominator()const{
return denominator;
}
Rational Rational::add(const Rational &secondRational){
int n;
int d;
n = numerator*secondRational.getDemominator()+denominator*secondRational.getNumerator();
d=denominator*secondRational.getDemominator();
return Rational(n,d);
}
Rational Rational::sub(const Rational &secondRational){
int n;
int d;
n = numerator*secondRational.getDemominator()-denominator*secondRational.getNumerator();
d=denominator*secondRational.getDemominator();
return Rational(n,d);
}
Rational Rational::mult(const Rational &secondRational){
int n,d;
n = numerator*secondRational.getNumerator();
d = denominator*secondRational.getDemominator();
return Rational(n,d);
}
Rational Rational::div(const Rational &secondRational){
int n,d;
n = numerator*secondRational.getDemominator();
d = denominator*secondRational.getNumerator();
return Rational(n,d);
}
int Rational::compareTo(const Rational &secondRational){
Rational temp =sub(secondRational);
if (temp.getNumerator()<0) {
return -1;
}
else if (temp.getNumerator()==0)
return 0;
else
return 1;
}
bool Rational::equal(const Rational &secondRational){
if (compareTo(secondRational)==0) {
return true;
}
else
return false;
}
int Rational::intValue(){
return getNumerator()/getDemominator();
}
double Rational::doubleValue(){
return 1.0*getNumerator()/getDemominator();
}
string Rational::toString(){
stringstream ss;
ss<<numerator;
if (denominator>1) {
ss<<"/"<<denominator;
}
return ss.str();
}
Rational& Rational::operator+=(const Rational& secondRational){
*this = add(secondRational);
return *this;
}
Rational& Rational::operator-=(const Rational &secondRational){
*this = sub(secondRational);
return *this;
}
Rational& Rational::operator*=(const Rational &secondRational){
*this = mult(secondRational);
return *this;
}
Rational& Rational::operator/=(const Rational &secondRational){
*this = div(secondRational);
return *this;
}
int& Rational::operator[](int index){
if (index == 0) {
return numerator;
}
else
return denominator;
}
Rational& Rational::operator++(){
numerator+=denominator;
return *this;
}
Rational& Rational::operator--(){
numerator-=denominator;
return *this;
}
Rational Rational::operator++(int dummy){
Rational temp(numerator,denominator);
numerator+=denominator;
return temp;
}
Rational Rational::operator--(int dummy){
Rational temp(numerator,denominator);
numerator-=denominator;
return temp;
}
Rational Rational::operator+(){
return *this;
}
Rational Rational::operator-(){
return Rational(-numerator,denominator);
}
ostream& operator<<(ostream& out,const Rational& firstRational){
if (firstRational.denominator==1) {
out<< firstRational.numerator;
}
else
out<<firstRational.numerator<<"/"<<firstRational.denominator;
return out;
}
istream& operator>>(istream& in,Rational& firstRational){
cout<<"请输入分子:";
in>>firstRational.numerator;
cout<<"请输入分母";
in>>firstRational.denominator;
return in;
}
Rational operator+(Rational& r1,Rational& r2){
return r1.add(r2);
}
Rational operator-(Rational& r1,Rational& r2){
return r1.sub(r2);
}
Rational operator*(Rational& r1,Rational& r2){
return r1.mult(r2);
}
Rational operator/(Rational& r1,Rational& r2){
return r1.div(r2);
}
测试
#include <iostream>
#include "Rational.hpp"
using namespace::std;
int main(int argc, const char * argv[]) {
Rational a(3,4);
Rational b(5,2);
Rational c(1,2);
cout<<a<<" + "<<b<<"="<<a+b<<endl;
cout<<a<<" - "<<b<<"="<<a-b<<endl;
cout<<a<<" * "<<b<<"="<<a*b<<endl;
cout<<a<<" / "<<b<<"="<<a/b<<endl;
a[0] = 2;
cout<<a<<"\n"<<a.doubleValue()<<endl;
cout<<a<<"++为"<<++a<<endl;
b += c;
cout<<b<<" "<<c<<endl;
Rational d;
cin>>d;
cout<<d<<endl;
return 0;
}
结果