// FractionDemo.java // Developed in class on 29-July-2008 import java.util.*; public class FractionDemo { public static Scanner scanner = new Scanner(System.in); public static void testFraction() { System.out.println("Testing Fraction class..."); Fraction f1 = new Fraction(3,4); // 3/4; Fraction f2 = new Fraction(2,3); // 2/3; Fraction f3 = f1.add(f2); // f1 + f2; // 17/12 // System.out.println(f1 + " + " + f2 + " = " + f3); assert(f3.equals(new Fraction(17,12))); assert(f3.toString().equals("17/12")); f3 = f1.add(f1); // 3/4 + 3/4 = 6/4 = 3/2 // System.out.println(f1 + " + " + f1 + " = " + f3); assert(f3.equals(new Fraction(3,2))); assert(f3.toString().equals("3/2")); f1 = new Fraction(1,2); f2 = new Fraction(-1,-2); // assert(f1.equals(f2)); // this will FAIL!!! System.out.println("PASSED ALL TESTS!"); } public static void main(String[] args) { testFraction(); } } class Fraction { private int num, den; // numerator and denominator // helper methods private int gcd(int i1, int i2) { i1 = Math.abs(i1); // if (i1 < 0) i1 = -i1; i2 = Math.abs(i2); // if (i2 < 0) i2 = -i2; // @TODO: use Euler's method; it's faster for (int i=Math.min(i1,i2); i>1; i--) if (((i1 % i) == 0) && ((i2 % i) == 0)) return i; return 1; } // constructor public Fraction(int num, int den) { int gcd = gcd(num, den); this.num = num/gcd; this.den = den/gcd; } // equals public boolean equals(Fraction that) { return ((this.num == that.num) && (this.den == that.den)); } // toString public String toString() { return this.num + "/" + this.den; } // arithmetic methods public Fraction add(Fraction that) { // a/b + c/d = (ad + bc) / bd int num = (this.num*that.den) + (this.den*that.num); int den = this.den*that.den; return new Fraction(num, den); } }