Computer Science 15-100, Fall 2008
Class Notes:  Getting Started with Writing Classes


  1. Mark's Fraction Code
  2. David's Fraction Code

Getting Started with Writing Classes

  1. Mark's Fraction Code
    // Mark's Foo Code (tests the Fraction class)
    // This code was developed in class.  As such, it is
    // for demonstrational purposes only, and in particular
    // may be incomplete and may contain bugs or other oddities.
    class Foo
    {
      public static void main(String[] args)
      {
        Fraction f1 = new Fraction(1,2);
        System.out.println("f1 = " + f1.toString());
        Fraction f2 = new Fraction(0,4);
        Fraction f3 = new Fraction(8);
        Fraction f4 = new Fraction();
        System.out.println("f2 = " + f2);
        System.out.println(f1.add(f2));
        System.out.println(f3 + " " + f4);
      }
    }
    
    // Mark's Fraction Code
    // This code was developed in class.  As such, it is
    // for demonstrational purposes only, and in particular
    // may be incomplete and may contain bugs or other oddities.
    class Fraction
    {
      private int numerator;
      private int denominator;
    
      public Fraction(int numerator, int denominator)
      {
        int commonFactor = gcd(numerator, denominator);
        this.numerator = numerator/commonFactor;
        this.denominator = denominator/commonFactor;
      }
    
      public Fraction(int num)
      {
        numerator = num;
        denominator = 1;
      }
    
      public Fraction()
      {
        this(0,1);
      }
    
      public Fraction add(Fraction other)
      {
        int num = this.numerator * other.denominator +
                  other.numerator * this.denominator;
        int denom = this.denominator * other.denominator;
        return new Fraction(num, denom);
      }
    
      public boolean equals(Fraction other)
      {
        return (this.numerator == other.numerator &&
                this.denominator == other.denominator);
      }
    
      public String toString()
      {
        return numerator + "/" + denominator;
      }
    
      private static int gcd(int x, int y)
      {
        int r;
        while (y > 0)
        {
          r = x % y;
          x = y;
          y = r;
        }
        return x;
      }
    }
  2. David's Fraction Code
    // David's FractionDemo Code
    // This code was developed in class.  As such, it is
    // for demonstrational purposes only, and in particular
    // may be incomplete and may contain bugs or other oddities.
    class FractionDemo {
      public static void main(String[] args) {
        Fraction x = new Fraction(4,6);
        System.out.println(x.toString());
        System.out.println(x); // implicitly calls toString
        Fraction y = new Fraction(1,6);
        System.out.println(y);
    
        Fraction z = x.times(y); // like String
        System.out.println(x + " * " + y + " = " + z);
        
        x = new Fraction(2,3);
        y = new Fraction(4,3);
        z = x.plus(y);
        System.out.println(x + " + " + y + " = " + z);
        
        Fraction z2 = new Fraction(4,2);
        System.out.println(z + " equals " + z2 + " is " +
                           z.equals(z2));
    
        z2 = new Fraction(-4,-2);
        System.out.println(z + " equals " + z2 + " is " +
                           z.equals(z2));
    
        x = new Fraction(0,9);
        System.out.println(x);
        x = new Fraction(9,0);
        System.out.println(x);
        x = new Fraction();
        System.out.println(x);
      }
    }
    
    // David's Fraction Code
    // This code was developed in class.  As such, it is
    // for demonstrational purposes only, and in particular
    // may be incomplete and may contain bugs or other oddities.
    class Fraction {
      private int num, den;
      
      // Constructors
      public Fraction() {
        this.num = 0;
        this.den = 1;
      }
      
      public Fraction(int num, int den) {
        // handle the sign -- only the num can be negative
        if (den < 0) {
          den = -den;
          num = -num;
        }
        // and assign to the instance variables
        this.num = num;
        this.den = den;
        // reduce them
        int gcd = gcd(num, den);
        if (gcd > 0) {
          this.num /= gcd;
          this.den /= gcd;
        }
      }
      
      private static int gcd(int x, int y) {
        // Euclid:  gcd(x, y) == gcd(y, x%y)
        // gcd(180, 24) = gcd(24, 12)
        //              = gcd(12, 0)
        // gcd(24, 180) = gcd(180, 24)..
        x = Math.abs(x);
        y = Math.abs(y);
        if ((x == 0) || (y == 0)) return 0;
        while (y != 0) {
          int r = x % y;
          x = y;
          y = r;
        }
        return x;
      }
    
      // a/b * c/d = ac/bd
      public Fraction times(Fraction that) {
        int num = this.num * that.num;
        int den = this.den * that.den;
        return new Fraction(num, den);
      }
    
      // a/b + c/d
      // = a/b * d/d  + c/d * b/b
      // = ad/bd + bc/bd
      // = (ad + bc)/bd
      public Fraction plus(Fraction that) {
        int num = this.num*that.den + that.num*this.den;
        int den = this.den*that.den;
        return new Fraction(num, den);
      }
      
      public String toString() {
        if (den == 0)
          return "NaF"; // Not A Fraction
        else if (num == 0)
          return "0";
        else if (den == 1)
          return ("" + num);
        else
          return num + "/" + den;
      }
      
      public boolean equals(Fraction that) {
        return ((this.num == that.num) &&
                (this.den == that.den));
      }
    }
    

carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem   -   carpe diem