1 #include<iostream>
  2 #include<string>
  3 #include<cmath>
  4 using namespace std;
  5 
  6 class Rational
  7 {
  8 public:
  9   Rational();
 10   Rational(long numerator, long denominator);
 11   long getNumerator();
 12   long getDenominator();
 13   Rational add(Rational &secondRational);
 14   Rational subtract(Rational &secondRational);
 15   Rational multiply(Rational &secondRational);
 16   Rational divide(Rational &secondRational);
 17   int compareTo(Rational &secondRational);  
 18   bool equals(Rational &secondRational);
 19   int intValue();
 20   double doubleValue();
 21   string toString();
 22  
 23   // Define function operators for relational operators
 24   bool operator<(Rational &secondRational);
 25   bool operator<=(Rational &secondRational);
 26   bool operator>(Rational &secondRational);
 27   bool operator>=(Rational &secondRational);
 28   bool operator!=(Rational &secondRational);
 29   bool operator==(Rational &secondRational);
 30  
 31   // Define function operators for arithmetic operators
 32   Rational operator+(Rational &secondRational);
 33   Rational operator-(Rational &secondRational);
 34   Rational operator*(Rational &secondRational);
 35   Rational operator/(Rational &secondRational);
 36  
 37   // Define function operators for shorthand operators
 38   Rational& operator+=(Rational &secondRational);
 39   Rational& operator-=(Rational &secondRational);
 40   Rational& operator*=(Rational &secondRational);
 41   Rational& operator/=(Rational &secondRational);
 42  
 43   // Define function operator [], 0 for numerator and 1 for denominator
 44   long& operator[](const int &index);
 45  
 46   // Define function operators for prefix ++ and --
 47   Rational& operator++();
 48   Rational& operator--();
 49  
 50   // Define function operators for postfix ++ and --
 51   Rational operator++(int dummy);
 52   Rational operator--(int dummy);
 53  
 54   // Define function operators for unary + and -
 55   Rational operator+();
 56   Rational operator-();
 57  
 58   // Define the output and input operator
 59   friend ostream &operator<<(ostream &stream, Rational rational);
 60   friend istream &operator>>(istream &stream, Rational &rational);
 61  
 62   // Define function operator for conversion
 63   operator double();
 64   
 65  
 66 private:
 67   long numerator;
 68   long denominator;
 69   static long gcd(long n, long d);
 70 };
 71  
 72 Rational::operator double(){
 73    double a;
 74    a=1.0* this->numerator/this->denominator;
 75    return a;
 76   }
 77 long Rational::gcd(long a,long b){
 78  if(a==0) return 1;
 79  if(a < 0) a = -a;
 80  if(b < 0) b = -b;
 81  if(a<b){
 82   long t;
 83   t=a;
 84   a=b;
 85   b=t;
 86  }
 87  while(a%b != 0){
 88   long t = a%b;
 89   a=b;
 90   b=t;
 91  }
 92  return b;
 93 }
 94 
 95 Rational::Rational(){
 96     this->numerator=0;
 97     this->denominator=1;
 98 }
 99 Rational::Rational(long numerator, long denominator){
100     this->numerator = numerator;
101     this->denominator = denominator;
102     //cout<<gcd(8,12)<<endl;
103 }
104 long Rational::getNumerator(){
105     return numerator;
106 }
107 
108 long Rational::getDenominator(){
109  
110     return denominator;
111 }
112 
113 Rational Rational::add(Rational &secondRational){
114     Rational r;
115     r.numerator = this->numerator *secondRational.denominator+ this->denominator * secondRational.numerator;
116     r.denominator=this->numerator *secondRational.numerator;
117     return r;
118 }
119 
120 Rational Rational::subtract(Rational &secondRational){
121     Rational r;
122     r.numerator = -this->denominator *secondRational.numerator + this->numerator*secondRational.denominator;
123     r.denominator=this->numerator *secondRational.numerator;
124     return r;
125 }
126 
127 Rational Rational::multiply(Rational &secondRational){
128     Rational r;
129     r.numerator = this->numerator * secondRational.numerator;
130     r.denominator=this->denominator * secondRational.numerator;
131     return r;
132 }
133 
134 Rational Rational::divide(Rational &secondRational){
135     Rational r;
136     r.numerator = this->numerator * secondRational.denominator;
137     r.denominator=this->denominator * secondRational.numerator;
138     return r;
139 }
140 
141 int Rational::compareTo(Rational &secondRational){
142  if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator==0) return 0;
143     else if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator<0) return 1;
144     else return -1;
145 }
146 bool Rational::equals(Rational &secondRational){
147     if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator==0) return true;
148     else return false;
149 }
150 int Rational::intValue(){
151     int t;
152     t=int(this->numerator / this->denominator);
153     return t;
154 }
155 double Rational::doubleValue(){
156     double t;
157     t=1.0*this->numerator / this->denominator;
158     return t;
159 }
160 string Rational::toString(){
161     string s;
162     string s1;
163     string s2;
164     long a,b;
165     int fuhao=0;
166     long sm = gcd(this->numerator,this->denominator);
167     a = this->numerator /sm;
168     b = this->denominator /sm;
169     if(a==0||b==0){
170      return "0";
171     }
172     if(a<0) {
173      fuhao++;
174      a=(-1)*a;
175     }
176     if(b<0) {
177      fuhao++;
178      b=(-1)*b;
179     }
180     while(a!=0){
181      char c=(a%10 +'0');
182      s1 = c+s1;
183      a=a/10;
184     }
185      while(b!=0){
186       char c=( b%10 + '0');
187      s2=c+s2;
188      b=b/10;
189     }
190    
191     if(s2=="1"){
192      if(fuhao==1)
193      s1="-"+s1;
194      return s1;
195     } 
196     else{
197      s=s1+"/"+s2;
198      if(fuhao==1) s="-"+s;
199      return s;
200     }
201 }
202 
203   // Define function operators for relational operators
204   bool Rational::operator<(Rational &secondRational){
205       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator>0) return true;
206       else return false;
207   }
208   bool Rational::operator<=(Rational &secondRational){
209       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator>=0) return true;
210       else return false;
211   }
212   bool Rational::operator>(Rational &secondRational){
213       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator<0) return true;
214       else return false;
215   }
216   bool Rational::operator>=(Rational &secondRational){
217       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator<=0) return true;
218       else return false;
219   }
220   bool Rational::operator!=(Rational &secondRational){
221       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator!=0) return true;
222       else return false;
223   }
224   bool Rational::operator==(Rational &secondRational){
225       if(this->denominator *secondRational.numerator - this->numerator*secondRational.denominator==0) return true;
226       else return false;
227   }
228  
229   // Define function operators for arithmetic operators
230   Rational Rational::operator+(Rational &secondRational){
231       Rational r;
232       r.numerator = this->numerator *secondRational.denominator+ this->denominator*secondRational.numerator;
233       r.denominator=this->numerator *secondRational.numerator;
234       return r;
235   }
236   Rational Rational::operator-(Rational &secondRational){
237       Rational r;
238       r.numerator = this->numerator *secondRational.denominator - this->denominator*secondRational.numerator;
239       r.denominator=this->denominator *secondRational.denominator;
240       return r;
241   }
242   Rational Rational::operator*(Rational &secondRational){
243       Rational r;
244       r.numerator = this->numerator * secondRational.numerator;
245       r.denominator = this->denominator * secondRational.denominator;
246       return r;
247   }
248   Rational Rational::operator/(Rational &secondRational){
249       Rational r;
250       r.numerator = this->numerator * secondRational.denominator;
251       r.denominator = this->denominator * secondRational.numerator;
252       return r;
253   }
254 
255   // Define function operators for shorthand operators
256   Rational& Rational::operator+=(Rational &secondRational){
257       this->numerator = this->denominator*secondRational.numerator + this->numerator*secondRational.denominator;
258       this->denominator=this->denominator*secondRational.denominator;
259       return *this;
260   }
261   Rational& Rational::operator-=(Rational &secondRational){
262       this->numerator = this->numerator*secondRational.denominator - this->denominator*secondRational.numerator;
263       this->denominator=this->denominator *secondRational.denominator;
264       return *this;
265   
266   } 
267   Rational& Rational::operator*=(Rational &secondRational){
268       this->numerator = numerator*secondRational.numerator;
269       this->denominator=this->denominator *secondRational.denominator;
270       return *this;
271   }
272   
273   Rational& Rational::operator/=(Rational &secondRational){
274       this->numerator = numerator*secondRational.denominator;
275       this->denominator=this->denominator*secondRational.numerator;
276       return *this;
277   }                    
278   
279   long& Rational::operator[](const int &index){
280     if(index==0) return this->numerator;
281     if(index==1) return this->denominator;
282   }
283   
284   
285   Rational& Rational::operator++(){
286     this->numerator = this->numerator + this->denominator;
287     return *this;
288   }
289   Rational& Rational::operator--(){
290     this->numerator = this->numerator - this->denominator;
291     return *this;
292   }
293   
294   Rational Rational::operator++(int dummy){
295     Rational temp(*this);
296     temp.numerator = temp.numerator;
297     this->numerator = this->numerator + this->denominator;
298     return temp;
299   }
300   Rational Rational::operator--(int dummy){
301     Rational temp(*this);
302     temp.numerator = temp.numerator ;
303     this->numerator = this->numerator - this->denominator;
304     return temp;
305   }
306   
307   Rational Rational::operator+(){
308     Rational temp;
309     temp.numerator = this->numerator;
310     temp.denominator =  this->denominator;
311     return temp;
312     
313   }
314   Rational Rational::operator-(){
315     Rational temp;
316     temp.numerator = this->numerator * (-1);
317     temp.denominator =  this->denominator;
318     return temp;
319   }
320   
321   ostream &operator<<(ostream &stream, Rational rational){
322 //     long a = rational.numerator%rational.denominator;
323 //     if(a==0) cout<<rational.numerator/rational.denominator;
324 //     else {
325 //       long s =  Rational::gcd(rational.numerator,rational.denominator);
326 //       rational.numerator = rational.numerator / s;
327 //   rational.denominator = rational.denominator / s;
328 //       stream<<rational.numerator<<"/"<<rational.denominator;
329 //     }
330   stream << rational.toString();
331       return stream;
332   }
333   istream &operator>>(istream &stream, Rational &rational){
334      stream>>rational.numerator>>rational.denominator;
335      return stream;   
336   }
337   
338   
339   
340   
341   
342   
343   int main()
344 {
345 
346   // Create and initialize two rational numbers r1 and r2.
347   Rational r1(3, 2);
348   Rational r2(2, 3);
349  
350   // Test relational operators
351   cout << r1 << " > " << r2 << " is " << (r1 > r2) << endl;
352   cout << r1 << " >= " << r1 << " is " << (r1 >= r1) << endl; 
353   cout << r1 << " < " << r2 << " is " << (r1 < r2) << endl;
354   cout << r1 << " <= " << r1 << " is " << (r1 <= r1) << endl;
355   cout << r1 << " == " << r2 << " is " << (r1 == r2) << endl;
356   cout << r1 << " == " << r1 << " is " << (r1 == r1) << endl;
357   cout << r1 << " != " << r2 << " is " << (r1 != r2) << endl;
358   cout << r1 << " != " << r1 << " is " << (r1 != r1) << endl;
359  
360  
361   // Test toString, add, substract, multiply, and divide operators
362   cout << r1 << " + " << r2 << " = " << r1 + r2 << endl;
363   cout << r1 << " - " << r2 << " = " << r1 - r2 << endl;
364   cout << r1 << " * " << r2 << " = " << r1 * r2 << endl;
365   cout << r1 << " / " << r2 << " = " << r1 / r2 << endl;
366  
367   // Test shorthand operators
368   Rational r3(1, 2);
369   r3 += r1;
370   cout << "r3 is " << r3 << endl;
371   r3 -= r1;
372   cout << "r3 is " << r3 << endl;
373   
374   // Test function operator []
375   Rational r4(1, 2);
376   r4[0] = 3; r4[1] = 4;
377   cout << "r4 is " << r4 << endl;
378  
379   // Test function operators for 
380   // prefix ++ and --
381   // postfix ++ and --
382   r3 = r4++;
383   cout << "r3 is " << r3 << endl;
384   cout << "r4 is " << r4 << endl;
385   r3 = r4--;
386   cout << "r3 is " << r3 << endl;
387   cout << "r4 is " << r4 << endl;
388  
389  
390   r3 = ++r4;
391   cout << "r3 is " << r3 << endl;
392   cout << "r4 is " << r4 << endl;
393   r3 = --r4;
394   cout << "r3 is " << r3 << endl;
395   cout << "r4 is " << r4 << endl;
396  
397   // Test function operator for conversion
398   cout << "1 + " << r4 << " is " << (1 + r4) << endl;
399    cout<<r4.toString()<<endl; 
400  
401   return 0;
402 }
403   
404               

 

posted on 2016-10-22 14:04  任我主宰  阅读(150)  评论(0编辑  收藏  举报