rationalNumber.cc
Go to the documentation of this file.00001
00002 #include "rationalNumber.h"
00003 #include "parseTools.h"
00004
00005
00006 const rationalNumber rationalNumber::Zero(0);
00007
00008 const rationalNumber rationalNumber::One(1);
00009
00010
00011
00015 rationalNumber::rationalNumber(std::stringstream & ssNum)
00016 {
00017
00018 #ifdef DEBUG
00019 std::cerr << "rationalNumber: extractFromStream" << std::endl;
00020 std::cerr << "ssNum: = " << ssNum.str() << std::endl;
00021 std::cerr << "getSign" << std::endl;
00022 #endif
00023
00024 ssNum >>std::ws;
00025
00026 int sign = extractSign(ssNum);
00027
00028 ssNum >> numerator;
00029
00030
00031 if (ssNum.fail())
00032 {
00033 ssNum.clear();
00034 if (sign>0)
00035 {
00036 throw "ssNum createFromStream failed";
00037 }
00038 else
00039 {
00040 numerator=1;
00041 denominator=1;
00042 }
00043 }
00044
00045 #ifdef DEBUG
00046 std::cerr << ">> sign = " << sign << std::endl;
00047 std::cerr << ">> numerator = " << numerator << std::endl;
00048 #endif
00049
00050 ssNum >> std::ws;
00051
00052
00053 numerator *= sign;
00054
00055 #ifdef DEBUG
00056 std::cerr << ">> numerator" << numerator<< std::endl;
00057 #endif
00058 if (ssNum.eof() || ssNum.peek()!='/')
00059 {
00060 denominator=1;
00061 }
00062 else
00063 {
00064 extractChar(ssNum,'/');
00065 ssNum >> std::ws;
00066 int dsign = ::getSign(ssNum);
00067
00068 numerator = numerator*dsign;
00069 ssNum >> denominator;
00070
00071 if (ssNum.fail())
00072 {
00073 ssNum.clear();
00074 throw "createFromStream (extract denominator) failed";
00075 }
00076 }
00077
00078 #ifdef DEBUG
00079 std::cerr << "rattional Number = " << (*this);
00080 #endif
00081 }
00082
00083
00084
00086 int rationalNumber::extractSign(std::stringstream& sstream)
00087 {
00088 char a;
00089 int sign=1;
00090
00091 int count =0;
00092
00093 while (!sstream.eof() )
00094 {
00095 sstream >> std::ws;
00096 if (!sstream.eof())
00097 {
00098 a=sstream.peek();
00099
00100 if (a=='-' || a =='+')
00101 {
00102 count++;
00103 if (count>2)
00104 throw "rationalNumber::extractSign three or more '+|-' in series";
00105 sstream >>a;
00106 if (a=='-')
00107 sign*=-1;
00108 }
00109 else
00110 break;
00111 }
00112 else
00113 break;
00114 }
00115 return sign;
00116 }
00117
00118
00119
00120 rationalNumber& rationalNumber::operator+=( const rationalNumber& r2)
00121 {
00122
00123 int newNumerator = this->numerator*r2.denominator + r2.numerator*this->denominator;
00124
00125 int newDenominator = denominator*r2.denominator;
00126
00127 numerator = newNumerator;
00128 denominator = newDenominator;
00129
00130 return *this;
00131 }
00132
00133 bool rationalNumber::operator==(const rationalNumber& r2) const
00134 {
00135 return (numerator*r2.denominator==r2.numerator*denominator);
00136 }
00137
00138 bool rationalNumber::operator!=(const rationalNumber& r2) const
00139 {
00140 return !(numerator*r2.denominator==r2.numerator*denominator);
00141 }
00142
00143
00144 std::ostream& rationalNumber::operator<<(std::ostream & os) const
00145 {
00146 os << numerator << "/" << denominator ;
00147 return os;
00148 }
00149
00150 std::ostream & operator<<(std::ostream & out, const rationalNumber& zahl)
00151 {
00152 return zahl.operator<<(out);
00153 }
00154
00155