1using System;
2
3namespace Studentlitteratur.CSharp
4{
5
6
7
8
9 public class Rational : ICloneable, IComparable
10 {
11 private int numerator, denominator;
12
13
14
15
16 public Rational() : this(0, 1) {}
17
18
19
20
21
22 public Rational(int numerator) : this(numerator, 1) {}
23
24
25
26
27
28 public Rational(double val) : this(checked((int)(val * 1000)), 1000) {}
29
30
31
32
33
34
35
36 public Rational(int numerator, int denominator)
37 {
38 if (denominator == 0)
39 throw new ArgumentException();
40 this.numerator = numerator;
41 this.denominator = denominator;
42 Normalize();
43 }
44
45
46
47
48
49 private void Normalize()
50 {
51
52 int m = Math.Abs(numerator), n = Math.Abs(denominator);
53 int r = m % n;
54 while (r != 0)
55 {
56 m = n;
57 n = r;
58 r = m % n;
59 }
60
61 numerator /= n;
62 denominator /= n;
63
64 if (numerator == 0)
65 denominator = 1;
66
67 if (denominator < 0)
68 {
69 denominator = -denominator;
70 numerator = -numerator;
71 }
72 }
73
74
75
76
77 public void Invert()
78 {
79 int temp = numerator;
80 numerator = denominator;
81 denominator = temp;
82 }
83
84
85
86
87 public static Rational Zero
88 {
89 get { return new Rational(0, 1); }
90 }
91
92
93
94
95 public int Numerator
96 {
97 get { return numerator; }
98 }
99
100
101
102
103 public int Denominator
104 {
105 get { return denominator; }
106 }
107
108
109
110
111
112 public override string ToString()
113 {
114 return numerator.ToString() + "/" + denominator.ToString();
115 }
116
117
118
119
120
121
122 public override bool Equals(object obj)
123 {
124 if (obj == null)
125 return false;
126 if (obj.GetType() != this.GetType())
127 return false;
128 Rational r = (Rational)obj;
129 return (r.numerator == this.numerator && r.denominator == this.denominator);
130 }
131
132
133
134
135
136 public override int GetHashCode()
137 {
138 return (numerator << 16) | denominator;
139 }
140
141
142
143
144
145 public object Clone()
146 {
147 return MemberwiseClone();
148 }
149
150
151
152
153
154
155
156 public int CompareTo(object obj)
157 {
158 if (obj.GetType() != this.GetType())
159 throw new ArgumentException();
160 Rational r = (Rational)obj;
161 if (this.numerator * r.denominator < this.denominator * r.numerator)
162 return -1;
163 else if (this.Equals(r))
164 return 0;
165 else
166 return 1;
167 }
168
169
170
171
172
173
174
175 public static Rational operator+(Rational left, Rational right)
176 {
177 Rational r = new Rational(
178 left.numerator * right.denominator + left.denominator * right.numerator,
179 left.denominator * right.denominator);
180 r.Normalize();
181 return r;
182 }
183
184
185
186
187
188
189
190 public static Rational operator-(Rational left, Rational right)
191 {
192 Rational r = new Rational(
193 left.numerator * right.denominator - left.denominator * right.numerator,
194 left.denominator * right.denominator);
195 r.Normalize();
196 return r;
197 }
198
199
200
201
202
203
204
205 public static Rational operator*(Rational left, Rational right)
206 {
207 Rational r = new Rational(
208 left.numerator * right.numerator,
209 left.denominator * right.denominator);
210 r.Normalize();
211 return r;
212 }
213
214
215
216
217
218
219
220 public static Rational operator/(Rational left, Rational right)
221 {
222 Rational r = new Rational(
223 left.numerator * right.denominator,
224 left.denominator * right.numerator);
225 r.Normalize();
226 return r;
227 }
228
229
230
231
232
233
234
235 public static bool operator==(Rational left, Rational right)
236 {
237 return Equals(left, right);
238 }
239
240
241
242
243
244
245
246 public static bool operator!=(Rational left, Rational right)
247 {
248 return !Equals(left, right);
249 }
250
251
252
253
254
255
256
257 public static bool operator<(Rational left, Rational right)
258 {
259 return left.CompareTo(right) < 0;
260 }
261
262
263
264
265
266
267
268 public static bool operator>(Rational left, Rational right)
269 {
270 return left.CompareTo(right) > 0;
271 }
272
273
274
275
276
277
278
279 public static bool operator<=(Rational left, Rational right)
280 {
281 return left.CompareTo(right) <= 0;
282 }
283
284
285
286
287
288
289
290 public static bool operator>=(Rational left, Rational right)
291 {
292 return left.CompareTo(right) >= 0;
293 }
294
295
296
297
298
299
300 public static Rational operator-(Rational obj)
301 {
302 return new Rational(-obj.numerator, obj.denominator);
303 }
304
305
306
307
308
309
310 public static implicit operator double(Rational obj)
311 {
312 return (double)obj.numerator/obj.denominator;
313 }
314
315
316
317
318
319
320 public static implicit operator Rational(int i)
321 {
322 return new Rational(i);
323 }
324
325
326
327
328
329
330 public static implicit operator Rational(double d)
331 {
332 return new Rational(d);
333 }
334
335
336
337
338
339 static void Main()
340 {
341 Rational r1 = new Rational(); //eller:
342 r1 = Rational.Zero;
343 Rational r2 = new Rational(5);
344 Rational r3 = new Rational(18, -45);
345 Rational r4 = new Rational(3.75);
346 Rational r5 = r3 + r4;
347 Rational r6 = r3 - r4;
348 Rational r7 = r3 * r4;
349 Rational r8 = r3 / r4;
350 Rational r9 = -r4;
351 Console.WriteLine(r1.ToString());
352 Console.WriteLine(r2.ToString());
353 Console.WriteLine(r3.ToString());
354 Console.WriteLine(r4.ToString());
355 Console.WriteLine(r5.ToString());
356 Console.WriteLine(r6.ToString());
357 Console.WriteLine(r7.ToString());
358 Console.WriteLine(r8.ToString());
359 Console.WriteLine(r9.ToString());
360 }
361 }
362}
363
|