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         //rationalNumber res;
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         // Vorzeichen setzen:
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 
Generated on Tue Nov 23 13:10:52 2010 for centerfocus by  doxygen 1.6.3