00001 #pragma once 00002 00003 00004 00005 #include <sstream> 00006 #include <iostream> 00007 #include <assert.h> 00008 00022 struct rationalNumber 00023 { 00024 protected: 00025 00026 00029 int numerator; 00030 int denominator; 00031 00033 int extractSign(std::stringstream& number); 00034 00035 public: 00036 static const rationalNumber Zero; 00037 static const rationalNumber One; 00038 00039 static bool memsetClearAllowed() { return true; } 00040 00044 inline rationalNumber(); 00045 00046 inline rationalNumber(int value); 00047 00048 inline rationalNumber(int _numerator, int _denominator); 00049 00050 rationalNumber(std::stringstream& number); 00051 00057 inline int getNumerator() const; 00058 inline int getDenominator() const; 00064 inline bool isZero() const; 00065 inline bool isNotZero() const; 00066 inline int getSign() const; 00072 rationalNumber& operator+=(const rationalNumber& r2); 00073 std::ostream & operator<<(std::ostream & os) const; 00074 00075 bool operator==(const rationalNumber& r2) const; 00076 00077 bool operator!=(const rationalNumber& r2) const; 00078 00079 rationalNumber operator-() 00080 { 00081 return rationalNumber(-numerator, denominator); 00082 } 00088 }; 00089 00090 00091 00092 std::ostream & operator<<(std::ostream & out, const rationalNumber& zahl); 00093 00094 00095 00097 inline rationalNumber::rationalNumber() 00098 { 00099 numerator = 0; 00100 denominator = 1; 00101 } 00102 00104 inline rationalNumber::rationalNumber(int value) 00105 { 00106 denominator = 1; 00107 numerator = value; 00108 }; 00109 00110 inline rationalNumber::rationalNumber(int _numerator, int _denominator) 00111 { 00112 numerator=_numerator; 00113 denominator=_denominator; 00114 00115 if (denominator<0) 00116 { 00117 denominator *= -1; 00118 numerator *= -1; 00119 } 00120 } 00121 00122 00123 00124 inline int rationalNumber::getSign() const 00125 { 00126 // only correct for denominator>0, therefore: 00127 #ifdef SAFE 00128 assert(denominator>0); 00129 #endif 00130 if ( numerator>=0 ) 00131 return 1; 00132 return -1; 00133 } 00134 00135 inline int rationalNumber::getNumerator() const 00136 { 00137 return numerator; 00138 } 00139 00140 inline int rationalNumber::getDenominator() const 00141 { 00142 return denominator; 00143 } 00144 00145 inline bool rationalNumber::isZero() const 00146 { 00147 return (numerator==0); 00148 } 00149 00150 inline bool rationalNumber::isNotZero() const 00151 { 00152 return (numerator!=0); 00153 }