Monday, November 2, 2009

Rational class (cpp file)

/*
Title: Rational class function definitions
Author: Daniel Tanner
Date: August 2nd, 2005
Class: CPSC 1720
*/

//TannRational class function declarations
#include
#include
#include
#include "tannRational.h"
using namespace std;

/* constructors
Purpose: to allow for a default and special constructor
*/
TannRational::TannRational() {numerator_ = 1; denominator_ = 1;}
TannRational::TannRational(int numer, int denom)
{
numerator_ = numer;
if(denom == 0)
zeroError();
else
denominator_ = denom;
reduce();
}

/* Set Functions
Purpose: To set the numerator, denominator, or both
*/
void TannRational::setRational(int numerator, int denominator)
{
numerator_ = numerator;
if(denominator == 0)
zeroError();
else
denominator_ = denominator;
reduce();
}
void TannRational::setRational(TannRational ratio2)
{
numerator_ = ratio2.getNumerator();
denominator_ = ratio2.getDenominator();
reduce();
}
void TannRational::setNumerator(int numerator) {numerator_ = numerator;}
void TannRational::setDenominator(int denominator)
{
if(denominator == 0)
zeroError();
else
denominator_ = denominator;
}

/* Get Functions
Purpose: To return the numerator or the denominator
*/
int TannRational::getNumerator()const {return numerator_;}
int TannRational::getDenominator()const {return denominator_;}

/* Denominator = 0 error
Purpose: If user has set 0 as the denominator, make him change it
Output: Error Message
Input: New Denominator
*/
void TannRational::zeroError()
{
int denom2;
cout << "Error: Computer cannot process ratios with denominator of 0.\n"
<< "Please input a correct denominator: ";
cin >> denom2;
while(denom2 == 0)
{
cout << "Try again. Enter any integer except 0: ";
cin >> denom2;
}
denominator_ = denom2;
}
/* reduce function
Purpose: to reduce a given fraction down to its lowest denominator
Ref: a numerator and denominator that it is reducing
*/
void TannRational::reduce()
{
//create a temporary variable which will be used to reduce
int reducer;

//change the negative sign to numerator if denominator is negative
if(numerator_ > 0 && denominator_ < 0)
{
numerator_ -= numerator_ * 2;
denominator_ = abs(denominator_);
}

//if both numerator & denominator are negative, change to positive
if(numerator_ < 0 && denominator_ < 0)
{
numerator_ = abs(numerator_);
denominator_ = abs(denominator_);
}

//set the reducer to whichever variable is lower between the num & denom
if(abs(numerator_) >= (denominator_))
reducer = abs(denominator_);
else
reducer = abs(numerator_);

//Create a loop to find the highest common multiple between the two
while((((numerator_ % reducer) != 0) || ((denominator_ % reducer)) != 0) && (reducer != 0))
{
reducer--;
}

//reduce with reducer that is divisible by both numer & denom
if(reducer != 0)
{
numerator_ /= reducer;
denominator_ /= reducer;
}
}
/* Print Function
Purpose: To Print out the rational in the form numerator/denominator
*/
void TannRational::printRational()
{
cout << getNumerator() << '/' << getDenominator();
}

/* Add Function
Purpose: to return the sum of two rationals
Return: the sum
*/
TannRational TannRational::add(int numer2, int denom2)
{
TannRational sum;
sum.setNumerator(numerator_ * denom2 + denominator_ * numer2);
sum.setDenominator(denominator_ * denom2);
sum.reduce();
return sum;
}

/* Subtract Function
Purpose: to return the difference between this Ratio and another
Return: the difference
*/
TannRational TannRational::subtract(int numer2, int denom2)
{
TannRational diff;
diff.setNumerator(numerator_ * denom2 - denominator_ * numer2);
diff.setDenominator(denominator_ * denom2);
diff.reduce();
return diff;
}

//Operator Overloaders
//Purpose: To overload the various operators so as to work better with ratios
TannRational TannRational::operator=(const TannRational &right)
{
numerator_ = right.getNumerator();
denominator_ = right.getDenominator();
return *this;
}

/*math operator overloaders
Purpose: To overload the 4 basic math operators to work with a rational
*/
//addition operator overloader
TannRational TannRational::operator+(const TannRational &right)const
{
TannRational sum;
sum.numerator_ = numerator_ * right.denominator_ + denominator_ * right.numerator_;
sum.denominator_ = denominator_ * right.denominator_;
sum.reduce();
return sum;
}

//subtraction operator overloader
TannRational TannRational::operator-(const TannRational &right)const
{
TannRational diff;
diff.numerator_ = numerator_ * right.denominator_ - denominator_ * right.numerator_;
diff.denominator_ = denominator_ * right.denominator_;
diff.reduce();
return diff;
}

//multiplication operator overloader
TannRational TannRational::operator*(const TannRational &right)const
{
TannRational product;
product.setNumerator(numerator_ * right.getNumerator());
product.setDenominator(denominator_ * right.getDenominator());
product.reduce();
return product;
}

//division operator overloader
TannRational TannRational::operator/(const TannRational &right)const
{
TannRational quotient;
quotient.setNumerator(numerator_ * right.getDenominator());
quotient.setDenominator(denominator_ * right.getNumerator());
quotient.reduce();
return quotient;
}

//prefix ++ operator overloader
TannRational TannRational::operator++()
{++numerator_; reduce(); return *this;}

//prefix -- operator overloader
TannRational TannRational::operator--()
{--numerator_; reduce(); return *this;}

//postfix ++ operator overloader
TannRational TannRational::operator++(int)
{TannRational temp(*this); ++numerator_; reduce(); return temp;}

//postfix -- operator overloader
TannRational TannRational::operator--(int)
{TannRational temp(*this); --numerator_; reduce(); return temp;}

//relational operators overloaders
bool TannRational::operator>(const TannRational &right)const
{
TannRational temp;
temp = *this - right;
if(temp.getNumerator() > 0)
return true;
else
return false;
}

bool TannRational::operator<(const TannRational &right)const
{
return right > *this;
}

bool TannRational::operator==(const TannRational &right)const
{
if(this->numerator_ * right.getDenominator() == this->denominator_ * right.getNumerator())
return true;
else
return false;
}

bool TannRational::operator!=(const TannRational &right)const
{
if(*this == right)
return false;
else
return true;
}

bool TannRational::operator>=(const TannRational &right)const
{
TannRational temp;
temp = *this - right;
if(temp.getNumerator() >= 0)
return true;
else
return false;
}

bool TannRational::operator<=(const TannRational &right)const
{
return right >= *this;
}

//I/O Operator Overloaders
ostream &operator<<(ostream &strm, TannRational &obj)
{
strm << obj.numerator_ << "/" << obj.denominator_;
return strm;
}

istream &operator>>(istream &strm, TannRational &obj)
{
strm >> obj.numerator_ >> obj.denominator_;
return strm;
}

//Type Conversion Overloaded Operators
TannRational::operator double()
{
return static_cast(numerator_) / static_cast(denominator_);
}

No comments:

Post a Comment