home *** CD-ROM | disk | FTP | other *** search
- // \EXAMPLES\EX0900.H
- // Definition of Fraction class
-
- // this file is used in the following example programs:
- //--------------------------------------------------------------
- // %F,15,EX0902.CPP%EX0902.CPP overloading + - * /
- // %F,15,EX0903.CPP%EX0903.CPP overloading unary + -
- // %F,15,EX0904.CPP%EX0904.CPP overloading binary operators
- // %F,15,EX0905.CPP%EX0905.CPP overloading =
- // %F,15,EX0906.CPP%EX0906.CPP overloading prefix ++ --
- // %F,15,EX0907.CPP%EX0907.CPP overloading postfix ++ --
- //---------------------------------------------------------------
- // This file must be used with
- // %F,15,EX0900.CPP%EX0900.CPP Fraction members & friends
- //---------------------------------------------------------------
-
-
- #ifndef INCL_FRAC_H
- #define INCL_FRAC_H
-
- #include <iostream.h>
-
-
- // Fractions are always kept in simplest form
- // always stored reduced to simplest form
- class Fraction
- {
-
- private:
-
- int num; // numerator signed
- int denom; // demoninator always positive
- void reduce (); // reduces Fraction to simplest form
- int // used by reduce()
- gcd( int n, int d);
-
- public:
- //------------------------------------------------------
- // default constructor
- //------------------------------------------------------
- Fraction() : num(0), denom(1) {};
-
- //------------------------------------------------------
- // constructor - conversion from 1 or 2 integers
- //------------------------------------------------------
- inline
- Fraction( int i, int j = 1);
-
- //------------------------------------------------------
- //conversion from real
- //------------------------------------------------------
- Fraction( double x);
-
- //------------------------------------------------------
- // copy constructor
- //------------------------------------------------------
- inline
- Fraction( const Fraction& source);
-
- //------------------------------------------------------
- // assignment operator
- //------------------------------------------------------
- inline Fraction&
- operator=( const Fraction& src);
-
- //------------------------------------------------------
- // overloading >> and << for input and output
- //------------------------------------------------------
-
- friend ostream&
- operator<<( ostream&, const Fraction& );
-
- friend istream&
- operator>>( istream&, Fraction& );
-
- //------------------------------------------------------
- // overloading unary math operators + -
- //------------------------------------------------------
- inline Fraction operator+() const
- { return *this; }
-
- inline Fraction operator-() const
- { return Fraction(-num, denom); }
-
- //------------------------------------------------------
- // overloading Prefix increment and decrement
- //------------------------------------------------------
- Fraction operator++()
- { num += denom;
- return *this;
- }
-
- Fraction Fraction::operator--()
- { num -= denom;
- return *this;
- }
-
- //------------------------------------------------------
- // overloading Postfix increment and decrement
- //------------------------------------------------------
- inline Fraction operator++( int);
- inline Fraction operator--( int);
-
- //------------------------------------------------------
- // overloading binary math operators + - * / ...
- //------------------------------------------------------
- inline Fraction
- operator+( const Fraction& f) const;
-
- inline Fraction
- operator-( const Fraction& f) const;
-
- inline Fraction
- operator*( const Fraction& f) const;
-
- inline Fraction
- operator/( const Fraction& f) const;
-
- };
-
- //----------------------------------------------------------
- // definition of inline member functions
- //----------------------------------------------------------
-
- //----------------------------------------------------------
- // constructors
- //----------------------------------------------------------
-
- inline
- Fraction::Fraction( int i, int j) : num(i), denom(j)
- { if (denom != 1) reduce();
- }
-
- inline
- Fraction::Fraction( const Fraction& source)
- { num = source.num;
- denom = source.denom;
- }
-
- //------------------------------------------------------
- // assignment operator
- //------------------------------------------------------
-
- inline Fraction&
- Fraction::operator=( const Fraction& src)
- { num = src.num;
- denom = src.denom;
- return *this;
- }
-
- //---------------------------------------------------------
- // binary arithmetic operators
- //---------------------------------------------------------
-
- inline Fraction
- Fraction::operator+( const Fraction& f) const
- {
- int n = (num * f.denom) + (f.num * denom);
- int d = denom * f.denom;
- return Fraction(n,d);
- }
-
- inline Fraction
- Fraction::operator-( const Fraction& f) const
- {
- int n = (num * f.denom) - (f.num * denom);
- int d = (denom * f.denom);
- return Fraction(n,d);
- }
-
- inline Fraction
- Fraction::operator*( const Fraction& f) const
- {
- int n = (num * f.num);
- int d = (denom * f.denom);
- return Fraction(n,d);
- }
-
- inline Fraction
- Fraction::operator/( const Fraction& f) const
- {
- int n = (num * f.denom);
- int d = (denom * f.num);
- return Fraction(n,d);
- }
-
- //---------------------------------------------------------
- // Increment and Decrement operators postfix ++ --
- //---------------------------------------------------------
-
- inline Fraction
- Fraction::operator++ (int)
- {
- int oldNum = num;
- num = num + denom;
- return Fraction( oldNum, denom);
- }
-
-
- inline Fraction
- Fraction::operator-- (int)
- {
- int oldNum = num;
- num = num - denom;
- return Fraction( oldNum, denom);
- }
-
- #endif
-