Арифметические операции
Арифметические операции +
, -
, *
и /
выполняются по правилам алгебры и возвращают результат в виде несократимой дроби.
Унарные операции
Для удобства добавим унарные методы, позволяющие изменить знак дроби:
def unary_+ = new Fraction(numerator, denominator)
def unary_- = new Fraction(-numerator, denominator)
Сложение
Сложение дробей производится по формуле:
$$\frac{a}{b} + \frac{c}{d} = \frac{a \cdot d + c \cdot b}{b \cdot d}$$
Добавим метод +
, выполняющий сложение дробей:
def +(that: Fraction) =
new Fraction(
this.numerator * that.denominator +
this.denominator * that.numerator,
this.denominator * that.denominator)
.reduced
Обратите внимание на использование ключевого слова this
.
Вычитание
Для реализации метода -
воспользуемся методом сложения в сочетании с унарным методом -
:
def -(that: Fraction) = this + (-that)
Умножение
Умножение дробей производится по следующей формуле:
$$\frac{a}{b} \cdot \frac{c}{d} = \frac{a \cdot c}{b \cdot d}$$
Добавим метод *
:
def *(that: Fraction) =
new Fraction(
this.numerator * that.numerator,
this.denominator * that.denominator)
.reduced
Деление
Для реализации операции деления воспользуемся уже имеющимся умножением на обратную дробь (inversed
):
def /(that: Fraction) = this * that.inversed
Проверка
val f1 = new Fraction(8,-6)
f1: Fraction = -8/6
val f2 = new Fraction(-1,6)
f2: sandbox.Fraction = -1/6
f1 + f2
res4: sandbox.Fraction = -3/2
f1 - f2
res5: sandbox.Fraction = -7/6
f1 * f2
res6: sandbox.Fraction = 2/9
f1 / f2
res7: sandbox.Fraction = 8