66 lines
2.1 KiB
Plaintext
66 lines
2.1 KiB
Plaintext
// This file is part of www.nand2tetris.org
|
|
// and the book "The Elements of Computing Systems"
|
|
// by Nisan and Schocken, MIT Press.
|
|
// File name: projects/09/Fraction/Fraction.jack
|
|
|
|
/** Represents the Fraction type and related operations. */
|
|
class Fraction {
|
|
field int numerator, denominator; // field = property = member variable.
|
|
|
|
/** Constructs a (reduced) fraction from the given numerator and denominator. */
|
|
constructor Fraction new(int x, int y) {
|
|
let numerator = x;
|
|
let denominator = y;
|
|
do reduce(); // reduces the fraction
|
|
return this; // a constructor is expected to return a reference to the new object
|
|
}
|
|
|
|
// Reduces this fraction.
|
|
method void reduce() {
|
|
var int g;
|
|
let g = Fraction.gcd(numerator, denominator);
|
|
if (g > 1) {
|
|
let numerator = numerator / g;
|
|
let denominator = denominator / g;
|
|
}
|
|
return;
|
|
}
|
|
|
|
/** Accessors. */
|
|
method int getNumerator() { return numerator; }
|
|
method int getDenominator() { return denominator; }
|
|
|
|
/** Returns the sum of this fraction and the other one. */
|
|
method Fraction plus(Fraction other) {
|
|
var int sum;
|
|
let sum = (numerator * other.getDenominator()) + (other.getNumerator() * denominator);
|
|
return Fraction.new(sum, denominator * other.getDenominator());
|
|
}
|
|
|
|
// More fraction-related methods (minus, times, div, etc.) can be added here.
|
|
|
|
/** Disposes this fraction. */
|
|
method void dispose() {
|
|
do Memory.deAlloc(this); // uses an OS routine to recycle the memory held by the object
|
|
return;
|
|
}
|
|
|
|
/** Prints this fraction in the format x/y. */
|
|
method void print() {
|
|
do Output.printInt(numerator);
|
|
do Output.printString("/");
|
|
do Output.printInt(denominator);
|
|
return;
|
|
}
|
|
|
|
// Computes the greatest common divisor of the given integers.
|
|
function int gcd(int a, int b) {
|
|
var int r;
|
|
while (~(b = 0)) { // applies Euclid's algorithm
|
|
let r = a - (b * (a / b)); // r = remainder of the integer division a/b
|
|
let a = b; let b = r;
|
|
}
|
|
return a;
|
|
}
|
|
}
|