CS 1723, A List of Rational Numbers

This example uses exactly the same classes List and CompList from earlier examples to provide a generic list of items, so these classes are not shown again here. Listed below are a class Rational to implement the rational numbers themselves, a new version of GetData to read rational numbers, and a slightly altered class with a main method: RationalListMain
//  Rational.java: Represent rational number with numerator and denominator.
public class Rational implements Comparable {
   private int numerator; 
   private int denominator;

   // Rational: ensuring a nonzero denominator, make only numerator signed.
   public Rational(int numer, int denom) {
      if (denom == 0)
         denom = 1;
      // Make the numerator "store" the sign
      if (denom < 0) {
         numer = numer * -1;
         denom = denom * -1;
      }
      numerator = numer;
      denominator = denom;
      reduce();
   }

   //  add: add two rational numbers
   public Rational add(Rational op2) {
      int commonDenominator = denominator * op2.getDenominator();
      int numerator1 = numerator * op2.getDenominator();
      int numerator2 = op2.getNumerator() * denominator;
      int sum = numerator1 + numerator2;

      return new Rational (sum, commonDenominator);
   }

   //  subtract: subtract two rational numbers
   public Rational subtract(Rational op2) {
      int commonDenominator = denominator * op2.getDenominator();
      int numerator1 = numerator * op2.getDenominator();
      int numerator2 = op2.getNumerator() * denominator;
      int difference = numerator1 - numerator2;
      return new Rational(difference, commonDenominator);
   }

   //  multiply: multiply two rational numbers
   public Rational multiply(Rational op2) {
      int numer = numerator * op2.getNumerator();
      int denom = denominator * op2.getDenominator();
      return new Rational(numer, denom);
   }

   //  divide: divide two rational numbers
   public Rational divide(Rational op2) {
      return multiply(op2.reciprocal());
   }

   // reciprocal: take reciprocal
   public Rational reciprocal () {
      return new Rational(denominator, numerator);
   }

   // getNumerator: return the numerator
   public int getNumerator() {
      return numerator;
   }

   // getDenominator: return the denominator
   public int getDenominator() {
      return denominator;
   }

   // equals: check for equality
   public boolean equals(Rational op2) {
      return ( numerator == op2.getNumerator() &&
               denominator == op2.getDenominator() );
   }

   // toString: convert to String
   public String toString() {
      String result;
      if (numerator == 0)
         result = "0";
      else
         if (denominator == 1)
            result = numerator + "";
         else
            result = numerator + "/" + denominator;
          return result;
   }

   // reduce: reduce to lowest terms
   private void reduce() {
      if (numerator != 0) {
         int common = gcd (Math.abs(numerator), denominator);

         numerator = numerator / common;
         denominator = denominator / common;
      }
   }

   // gcd: greatest commmon divisor
   private int gcd(int num1, int num2) {
      while (num1 != num2)
         if (num1 > num2)
            num1 = num1 - num2;
         else
            num2 = num2 - num1;
      return num1;
   }

   // compareTo: the method in Comparable interface
   public int compareTo(Object obj) {
      Rational diff = this.subtract((Rational)obj);
      if (diff.numerator == 0) return 0;
      else if (diff.numerator < 0) return -1;
      else return 1;
   }
}

// RationalListMain: use of the Rational class for a list of fractions public class RationalListMain { public static void main(String[] args) { CompList list1 = new CompList(); CompList list2 = new CompList(); GetData getData = new GetData(); Rational zero = new Rational(0,1); Rational num = zero; while(true) { num = getData.getNextRational(); if (num.equals(zero)) break; list1.add(num); list2.add(num); } list1.dump(); while (!list1.isEmpty()) System.out.print(list1.removeMin() + " "); System.out.println(); while (!list2.isEmpty()) System.out.print(list2.removeMax() + " "); System.out.println(); } }
Here is the source for the I/O: GetData.java.

Here is a sample run:

% java RationalListMain
1/2  3/4  11/17  1/3  2/5  3/7  1/9  2/8 -3/4  2/-3  -3/-2 0/1
Dump of List, Current size: 11, Maximum size: 12, Empty? false, Full? false
 1/2 3/4 11/17 1/3 2/5 3/7 1/9 1/4 -3/4 -2/3 3/2  End of Dump

-3/4 -2/3 1/9 1/4 1/3 2/5 3/7 1/2 11/17 3/4 3/2 
3/2 3/4 11/17 1/2 3/7 2/5 1/3 1/4 1/9 -2/3 -3/4

Revision date: 2001-09-04. (Please use ISO 8601, the International Standard.)