//**************************************************************************//
//                                                                          //
// Copyright (c) 1997.                                                      //
//      Richard D. Irwin, Inc.                                              //
//                                                                          //
// This software may not be distributed further without permission from     //
// Richard D. Irwin, Inc.                                                   //
//                                                                          //
// This software is distributed WITHOUT ANY WARRANTY. No claims are made    //
// as to its functionality or purpose.                                      //
//                                                                          //
// Authors: James P. Cohoon and Jack W. Davidson                            //
// Date: 7/15/96                                                            //
// Version: 1.0b                                                            //
//                                                                          //
//**************************************************************************//

#include <iostream.h>
#include "rational.h"

// default constructor
Rational::Rational() {
	SetNumerator(0);
	SetDenominator(1);
}

// (numer, denom) constructor
Rational::Rational(int numer, int denom) {
	SetNumerator(numer);
	SetDenominator(denom);
}

// get the numerator
int Rational::Numerator() const {
	return NumeratorValue;
}

// get the denominator
int Rational::Denominator() const {
	return DenominatorValue;
}

// set the numerator
void Rational::SetNumerator(int numer) {
	NumeratorValue = numer;
}

// set the denominator
void Rational::SetDenominator(int denom) {
	if (denom != 0)
		DenominatorValue = denom;
	else {
		cerr << "Illegal denominator: " << denom
		<< "using 1" << endl;
		DenominatorValue = 1;
	}
}

// adding Rationals
Rational Rational::Add(const Rational &r) const {
	int a = Numerator();
	int b = Denominator();
	int c = r.Numerator();
	int d = r.Denominator();
	return Rational(a*d + b*c, b*d);
}

// multiplying Rationals
Rational Rational::Multiply(const Rational &r) const {
	int a = Numerator();
	int b = Denominator();
	int c = r.Numerator();
	int d = r.Denominator();
	return Rational(a*c, b*d);
}

// inserting a Rational
void Rational::Insert(ostream &sout) const {
	sout << Numerator() << '/' << Denominator();
	return;
}

// extracting a Rational
void Rational::Extract(istream &sin) {
	int numer;
	int denom;
	char slash;
	sin >> numer >> slash >> denom;
	SetNumerator(numer);
	SetDenominator(denom);
	return;
}

// adding Rationals
Rational operator+(const Rational &r,
const Rational &s) {
	return r.Add(s);
}

// multiplying Rationals
Rational operator*(const Rational &r,
const Rational &s) {
	return r.Multiply(s);
}

// inserting a Rational
ostream& operator<<(ostream &sout, const Rational &r) {
	r.Insert(sout);
	return sout;
}

// extracting a Rational
istream& operator>>(istream &sin, Rational &r) {
	r.Extract(sin);
	return sin;
}


