// File Rational.java
/* Fall 2007 CS 216 NOTES on Handout:
*
* MCO: See notes scattered in comments throughout this file
*
* For now, use the comments as a guideline for the conversion to C++
* Explanation the following concepts will become clearer in the next class:
* - pointers
* - when to use "new" and "this"
*
* NOTE 0: For now, remove all instances of "new" and "this"
*
* C++ REMINDERS:
*
* 1) For Input/Output:
*
* #include <iostream>
* using namespace std;
*
* 2) To print to screen: cout << varname1 << " " << endl;
* (endl means "end of line" or newline)
*
* 3) C++ signature for main (must not be in any class):
* int main()
*
* 4) C++ class syntax reminders:
*
* // Instead of modifying each member function,
* // just a section for each in the class
* public:
* private:
*
*/
public class Rational {
private int num; // the numerator
private int den; // the denominator
// create and initialize a new Rational object
public Rational(int numerator, int denominator) {
if (denominator == 0) {
System.out.println("Denominator is zero");
}
int g = gcd(numerator, denominator);
num = numerator / g;
den = denominator / g;
}
// return string representation of (this)
public void print() {
if (den == 1) {
// MCO: NOTE 1
// For conversion to C++
// use the following
// cout << num << "" << endl;
// We'll talk about C++ operator overloading later for
// operators such as the '+' symbol soon
System.out.println(num + "");
} else {
System.out.println(num + "/" + den);
}
}
// return (this * b)
public Rational times(Rational b) {
// MCO: NOTE 2
// More explanation on this next class, for now
// remove "new" and "this" for conversion to C++
// Do this for all "new" and "this" for the Rational class
// for this exercise
return new Rational(this.num * b.num, this.den * b.den);
}
// return (this + b)
public Rational plus(Rational b) {
int numerator = (this.num * b.den) + (this.den * b.num);
int denominator = this.den * b.den;
return new Rational(numerator, denominator);
}
// return (1 / this)
public Rational reciprocal() {
return new Rational(den, num);
}
// return (this / b)
public Rational divides(Rational b) {
return this.times(b.reciprocal());
}
/*************************************************************************
* Helper functions
*************************************************************************/
// return gcd(m, n)
private int gcd(int m, int n) {
if (0 == n)
return m;
else
return gcd(n, m % n);
}
/*************************************************************************
* Test client
*************************************************************************/
public static void main(String[] args) {
Rational x, y, z;
// 1/2 + 1/3 = 5/6
x = new Rational(1, 2);
y = new Rational(1, 3);
z = x.plus(y);
z.print();
// 8/9 + 1/9 = 1
x = new Rational(8, 9);
y = new Rational(1, 9);
z = x.plus(y);
z.print();
// 4/17 * 7/3 = 28/51
x = new Rational(4, 17);
y = new Rational(7, 3);
z = x.times(y);
z.print();
// 0/6 = 0
x = new Rational(0, 6);
x.print();
}
}