1 #include "RationalWithOperators.h"
2 #include <sstream>
3 #include <cstdlib>
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
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);
106 else
107 return to_string(numerator) + "/" + to_string(denominator);
108 }
109
110 Rational::Rational(int numerator)
111 {
112 this->numerator = numerator;
113 this->denominator = 1;
114 }
115
116
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
142 int& Rational::operator[](int index)
143 {
144 if (index == 0)
145 return numerator;
146 else
147 return denominator;
148 }
149
150
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
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
179 Rational Rational::operator+()
180 {
181 return *this;
182 }
183
184 Rational Rational::operator-()
185 {
186 return Rational(-numerator, denominator);
187 }
188
189
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
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
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 }