1  #include "RationalWithOperators.h"
  2  #include <sstream> // Used in toString to convert numbers to strings
  3  #include <cstdlib> // For the abs function
  4  Rational::Rational()
  5  {
  6    numerator = 0;
  7    denominator = 1;
  8  }
  9  
 10  Rational::Rational(int numerator, int denominator)
 11  {
 12    int factor = gcd(numerator, denominator);
 13    this->numerator = (denominator > 0 ? 1 : -1) * numerator / factor;
 14    this->denominator = abs(denominator) / factor;
 15  }
 16  
 17  int Rational::getNumerator() const
 18  {
 19    return numerator;
 20  }
 21  
 22  int Rational::getDenominator() const
 23  {
 24    return denominator;
 25  }
 26  
 27  // Find GCD of two numbers 
 28  int Rational::gcd(int n, int d) 
 29  {
 30    int n1 = abs(n);
 31    int n2 = abs(d);
 32    int gcd = 1;
 33  
 34    for (int k = 1; k <= n1 && k <= n2; k++)
 35    {
 36      if (n1 % k == 0 && n2 % k == 0)
 37        gcd = k;
 38    }
 39  
 40    return gcd;
 41  }
 42  
 43  Rational Rational::add(const Rational& secondRational) const
 44  {
 45    int n = numerator * secondRational.getDenominator() +
 46      denominator * secondRational.getNumerator();
 47    int d = denominator * secondRational.getDenominator();
 48    return Rational(n, d);
 49  }
 50  
 51  Rational Rational::subtract(const Rational& secondRational) const
 52  {
 53    int n = numerator * secondRational.getDenominator()
 54      - denominator * secondRational.getNumerator();
 55    int d = denominator * secondRational.getDenominator();
 56    return Rational(n, d);
 57  }
 58  
 59  Rational Rational::multiply(const Rational& secondRational) const
 60  {
 61    int n = numerator * secondRational.getNumerator();
 62    int d = denominator * secondRational.getDenominator();
 63    return Rational(n, d);
 64  }
 65  
 66  Rational Rational::divide(const Rational& secondRational) const
 67  {
 68    int n = numerator * secondRational.getDenominator();
 69    int d = denominator * secondRational.numerator;
 70    return Rational(n, d);
 71  }
 72  
 73  int Rational::compareTo(const Rational& secondRational) const
 74  {
 75    Rational temp = subtract(secondRational);
 76    if (temp.getNumerator() < 0)
 77      return -1;
 78    else if (temp.getNumerator() == 0)
 79      return 0;
 80    else
 81      return 1;
 82  }
 83  
 84  bool Rational::equals(const Rational& secondRational) const
 85  {
 86    if (compareTo(secondRational) == 0)
 87      return true;
 88    else
 89      return false;
 90  }
 91  
 92  int Rational::intValue() const
 93  {
 94    return getNumerator() / getDenominator();
 95  }
 96  
 97  double Rational::doubleValue() const
 98  {
 99    return 1.0 * getNumerator() / getDenominator();
100  }
101  
102  string Rational::toString() const
103  {
104    if (denominator == 1)
105      return to_string(numerator); // See Ch7 for to_string
106    else
107      return  to_string(numerator) + "/" + to_string(denominator);
108  }
109  
110  Rational::Rational(int numerator) // Suitable for type conversion
111  {
112    this->numerator = numerator;
113    this->denominator = 1;
114  }
115  
116  // Define function operators for augmented operators
117  Rational& Rational::operator+=(const Rational& secondRational)
118  {
119    *this = add(secondRational);
120    return *this;
121  }
122  
123  Rational& Rational::operator-=(const Rational& secondRational)
124  {
125    *this = subtract(secondRational);
126    return *this;
127  }
128  
129  Rational& Rational::operator*=(const Rational& secondRational)
130  {
131    *this = multiply(secondRational);
132    return *this;
133  }
134  
135  Rational& Rational::operator/=(const Rational& secondRational)
136  {
137    *this = divide(secondRational);
138    return *this;
139  }
140  
141  // Define function operator []
142  int& Rational::operator[](int index)
143  {
144    if (index == 0)
145      return numerator;
146    else 
147      return denominator;
148  }
149  
150  // Define function operators for prefix ++ and --
151  Rational& Rational::operator++()
152  {
153    numerator += denominator;
154    return *this;
155  }
156  
157  Rational& Rational::operator--()
158  {
159    numerator -= denominator;
160    return *this;
161  }
162  
163  // Define function operators for postfix ++ and --
164  Rational Rational::operator++(int dummy)
165  {
166    Rational temp(numerator, denominator);
167    numerator += denominator;
168    return temp;
169  }
170  
171  Rational Rational::operator--(int dummy)
172  {
173    Rational temp(numerator, denominator);
174    numerator -= denominator;
175    return temp;
176  }
177  
178  // Define function operators for unary + and -
179  Rational Rational::operator+()
180  {
181    return *this;
182  }
183  
184  Rational Rational::operator-()
185  {
186    return Rational(-numerator, denominator);
187  }
188  
189  // Define the output and input operator
190  ostream& operator<<(ostream& out, const Rational& rational)
191  {
192    if (rational.denominator == 1)
193      out << rational.numerator;
194    else
195      out << rational.numerator << "/" << rational.denominator;
196    return out;
197  }
198  
199  istream& operator>>(istream& in, Rational& rational)
200  {
201    cout << "Enter numerator: ";
202    in >> rational.numerator;
203  
204    cout << "Enter denominator: ";
205    in >> rational.denominator;
206    return in;
207  }
208  
209  // Define function operators for relational operators
210  bool operator<(const Rational& r1, const Rational& r2)
211  {
212    return (r1.compareTo(r2) < 0);
213  }
214  
215  bool operator<=(const Rational& r1, const Rational& r2)
216  {
217    return (r1.compareTo(r2) <= 0);
218  }
219  
220  bool operator>(const Rational& r1, const Rational& r2)
221  {
222    return (r1.compareTo(r2) > 0);
223  }
224  
225  bool operator>=(const Rational& r1, const Rational& r2)
226  {
227    return (r1.compareTo(r2) >= 0);
228  }
229  
230  bool operator==(const Rational& r1, const Rational& r2)
231  {
232    return (r1.compareTo(r2) == 0);
233  }
234  
235  bool operator!=(const Rational& r1, const Rational& r2)
236  {
237    return (r1.compareTo(r2) != 0);
238  }
239  
240  // Define non-member function operators for arithmetic operators
241  Rational operator+(const Rational& r1, const Rational& r2)
242  {
243    return r1.add(r2);
244  }
245  
246  Rational operator-(const Rational& r1, const Rational& r2)
247  {
248    return r1.subtract(r2);
249  }
250  
251  Rational operator*(const Rational& r1, const Rational& r2)
252  {
253    return r1.multiply(r2);
254  }
255  
256  Rational operator/(const Rational& r1, const Rational& r2)
257  {
258    return r1.divide(r2);
259  }