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
本知识属于个人知识成果,如需转载,请邮件请求