00001
00002 #ifndef Rational_H
00003 #define Rational_H
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00021
00022 #include "Musimat.h"
00023 #include <iostream>
00024 using namespace std;
00025
00027
00028 class Rational
00029 {
00030 friend ostream& operator<<(ostream&, Rational&);
00031 friend istream& operator>>( istream& is, Rational& p );
00032
00033 friend Bool operator==(Integer& i, Rational& p) { Return i == p.quotient(); }
00034 friend Bool operator==(Rational& p, Integer& i) { Return p.quotient() == i; }
00035 friend Bool operator!=(Integer& i, Rational& p) { Return i != p.quotient(); }
00036 friend Bool operator!=(Rational& p, Integer& i) { Return p.quotient() != i; }
00037 friend Bool operator>=(Rational& p, Integer& r) { Return p.quotient() >= r; }
00038 friend Bool operator>=(Integer& i, Rational& p) { Return i >= p.quotient(); }
00039 friend Bool operator>(Rational& p, Integer& i) { Return p.quotient() > i; }
00040 friend Bool operator>(Integer& i, Rational& p) { Return i > p.quotient(); }
00041 friend Bool operator<=(Rational& p, Integer& i) { Return p.quotient() <= i; }
00042 friend Bool operator<=(Integer& i, Rational& p) { Return i <= p.quotient(); }
00043
00044 friend Bool operator==(Real& r, Rational& p) { Return r == p.quotient(); }
00045 friend Bool operator==(Rational& p, Real& r) { Return p.quotient() == r; }
00046 friend Bool operator!=(Real& r, Rational& p) { Return r != p.quotient(); }
00047 friend Bool operator!=(Rational& p, Real& r){ Return p.quotient() != r; }
00048 friend Bool operator>=(Rational& p, Real& r) { Return p.quotient() >= r; }
00049 friend Bool operator>=(Real& r, Rational& p) { Return r >= p.quotient(); }
00050 friend Bool operator>(Rational& p, Real& r) { Return p.quotient() > r; }
00051 friend Bool operator>(Real& r, Rational& p) { Return r > p.quotient(); }
00052 friend Bool operator<=(Rational& p, Real& r) { Return p.quotient() <= r; }
00053 friend Bool operator<=(Real& r, Rational& p) { Return r <= p.quotient(); }
00054
00055 public:
00056
00058 Rational() : m_num(0), m_den(0) { }
00059
00061 Rational(Integer i) : m_num(i), m_den(i) { }
00062
00064 Rational(Const Rational& x) : m_num(x.m_num), m_den(x.m_den) { }
00065
00068 Rational(Real x) : m_num(0), m_den(0) { RealToRational( x, m_num, m_den ); }
00069
00073 Rational(Integer num, Integer den) : m_num(num), m_den(den) {
00074 If (m_den == 0)
00075 m_den = 1;
00076 }
00077
00082 Rational(Real x, Integer& num, Integer& den) : m_num(0), m_den(0) {
00083 RealToRational( x, num, den );
00084 m_num = num;
00085 m_den = den;
00086 }
00087
00092 Rational(Rational x, Integer& num, Integer& den) : m_num(0), m_den(0) {
00093 RealToRational( x.quotient(), num, den );
00094 m_num = num;
00095 m_den = den;
00096 }
00097
00099 Rational& operator=(Const Rational& x) {
00100 m_num = x.m_num;
00101 m_den = x.m_den;
00102 Return *this;
00103 }
00104
00106 Bool operator==(Const Rational& x) Const {
00107 Return m_num == x.m_num And m_den == x.m_den;
00108 }
00109
00111 Bool operator!=(Const Rational& x) Const {
00112 Return m_num != x.m_num || m_den != x.m_den;
00113 }
00114
00116 Bool operator>=(Const Rational& x) Const {
00117 Return quotient() >= x.quotient();
00118 }
00119
00121 Bool operator>(Const Rational& x) Const {
00122 Return quotient() > x.quotient();
00123 }
00124
00126 Bool operator<(Const Rational& x) Const {
00127 Return quotient() < x.quotient();
00128 }
00129
00131 Bool operator<=(Const Rational& x) Const {
00132 Return quotient() <= x.quotient();
00133 }
00134
00136 Rational& operator+=(Const Real x) {
00137 Return( *this = Rational(quotient() + x) );
00138 }
00139
00141 Rational& operator+=(Rational x) {
00142 Return( *this = Rational(quotient() + x.quotient() ) );
00143 }
00144
00146 Rational& operator-=(Const Real x) {
00147 Return( *this = quotient() - x );
00148 }
00149
00151 Rational& operator-=(Rational x) {
00152 Return( *this = quotient() - x.quotient() );
00153 }
00154
00156 Rational& operator*=(Const Real x) {
00157 Return( *this = quotient() * x );
00158 }
00159
00161 Rational& operator*=(Rational x) {
00162 Return( *this = quotient() * x.quotient() );
00163 }
00164
00166 Rational& operator/=(Const Real x) {
00167 Return( *this = quotient() / x );
00168 }
00169
00171 Rational& operator/=(Rational x) {
00172 Return( *this = quotient() / x.quotient() );
00173 }
00174
00176 Rational operator+(Rational& x) {
00177 Return( Rational(quotient() + x.quotient()) );
00178 }
00179
00181 Rational operator-(Rational& x) {
00182 Return( Rational(quotient() - x.quotient()) );
00183 }
00184
00186 Rational operator*(Rational& x) {
00187 Return( Rational(quotient() * x.quotient()) );
00188 }
00189
00191 Rational operator/(Rational& x) {
00192 Return( Rational(quotient() / x.quotient()) );
00193 }
00194
00196 Rational operator+(Const Real x) {
00197 Return( Rational(quotient() + x) );
00198 }
00199
00201 Rational operator-(Const Real x) {
00202 Return( Rational(quotient() - x) );
00203 }
00204
00206 Rational operator*(Const Real x) {
00207 Return( Rational(quotient() * x) );
00208 }
00209
00211 Rational operator/(Const Real x) {
00212 Return( Rational(quotient() / x ) );
00213 }
00214
00217 String print(String s = 0) Const {
00218 If (s)
00219 cout << s;
00220 sprintf(s_buf, "{%d,%d}", m_num, m_den);
00221 Return s_buf;
00222 }
00223
00224 private:
00225
00226
00227 Real quotient() Const { Return( Real(m_num) / Real(m_den) ); }
00228
00229 protected:
00230 Integer m_num;
00231 Integer m_den;
00232 Static char s_buf[128];
00233 };
00234
00235 #endif // Rational_H