
19-Sep-2005, 08:33
|
|
Junior Member
|
|
Join Date: Aug 2005
Posts: 45
|
|
Not trying to bump my thread, just thought posting the code might get more response.
#include <iostream.h> // for cerr
class rational
{ // represents a rational number in the form numerator / denominator.
// conditions maintained in class:
// denominator > 0, sign maintained in numerator
public:
// methods
rational (); // mirrors original constructor
// declares a rational number and initializes it to 0/1
rational (int numerator, int denominator);
// declares and initializes the rational number
void initialize (int numerator, int denominator, bool &ok);
// initializes the rational number. ok= (denominator > 0)
int returnNumerator (); // returns the numerator of the rational number
int returnDenominator (); // returns the denominator of the rational number
void reduce ();
void add (rational fraction);
void sub (rational fraction);
void mul (rational fraction);
void div (rational fraction);
bool operator== (rational fraction);
private:
int numer, denom;
}; // class rational
bool rational::operator== (rational fraction) {
return (numer==fraction.numer && denom==fraction.denom);
} // rational::operator==
rational::rational()
{ bool ok;
initialize (0, 1, ok);
} //rational::rational
rational::rational (int numerator, int denominator)
{ bool ok;
initialize (numerator, denominator, ok);
if (!ok)
cerr <<"Error: denominator is " <<denominator;
// writes an error message to standard error stream
} // rational::rational
void rational::initialize (int numerator, int denominator, bool &ok)
{ if (denominator <= 0)
ok= false;
else
{ ok= true;
numer= numerator;
denom= denominator;
} //if
} // rational::rational
int rational::returnNumerator ()
{ return (numer);
} // rational::returnNumerator
int rational::returnDenominator ()
{ return (denom);
} // rational::returnDenominator
void rational::reduce () {
int GCD (int, int);
int x= GCD (numer, denom);
numer /= x;
denom /= x;
} // rational::reduce
int GCD (int a, int b)
// determines the greatest common divisor of a and b
// note: better algorithms exist!
{ int possCD, GCDsoFar= 1;
for (possCD= 2; possCD <= a; ++possCD)
if ((a % possCD == 0) && (b % possCD == 0))
GCDsoFar= possCD;
return (GCDsoFar);
} // GCD
void rational::add (rational fraction){
void makeCommonDen (rational &, rational &);
makeCommonDen (*this, fraction);
numer= numer + fraction.numer;
reduce();
} // rational::add*
void rational::sub (rational fraction){
void makeCommonDen (rational &, rational &);
makeCommonDen (*this, fraction);
numer= numer - fraction.numer;
reduce();
} // rational::sub*
void rational::mul (rational fraction){
void makeCommonDen (rational &, rational &);
makeCommonDen (*this, fraction);
numer= numer * fraction.numer;
reduce();
} // rational::mul
void rational::div (rational fraction){
void makeCommonDen (rational &, rational &);
makeCommonDen (*this, fraction);
numer= numer / fraction.numer;
reduce();
} // rational::div
void makeCommonDen (rational &fr1, rational &fr2)
{ bool ok;
int commonDen= fr1.returnDenominator() * fr2.returnDenominator() *
GCD (fr1.returnDenominator(), fr2.returnDenominator());
fr1.initialize (fr1.returnNumerator() * commonDen / fr1.returnDenominator(),
commonDen, ok);
fr2.initialize (fr2.returnNumerator() * commonDen / fr2.returnDenominator(),
commonDen, ok);
} // makeCommonDen
void printFract(){
cout<<numer<<endl<<"----"<<endl<<denom<<endl;
}//printFract
#include <iostream.h>
void main () {
rational fraction1 (6, 14), fraction2 (-1, 7), fraction3;
fraction1.reduce();
cout <<fraction1.returnNumerator () <<"/" <<fraction1.returnDenominator() <<endl;
// outputs: 3/7
fraction1.add (fraction2);
cout <<fraction1.returnNumerator () <<"/" <<fraction1.returnDenominator() <<endl <<endl;
// outputs: 2/7
if (fraction1==fraction2)
cout <<"Equal." <<endl;
else
cout <<"Not equal." <<endl;
printFract();
}
printFract is the part I'm talking about.
|