Базовые определения
Начнем определение класса Fraction
, следуя спецификации.
Числитель и знаменатель
Класс Fraction
представляет собой обыкновенную дробь, заданную двумя целыми числами — числителем и знаменателем.
class Fraction(val numerator: Int,
val denominator: Int)
Знаменатель не должен быть равен нулю.
Создавать экземпляр с нулевым значением знаменателя не имеет смысла, поэтому сделаем соответствующую проверку в теле класса:
class Fraction(val numerator: Int,
val denominator: Int) {
if (denominator == 0)
throw new IllegalArgumentException("Denominator cannot equal to zero.")
}
Знак дроби
Знак дроби определяется по знаку числителя; знаменатель всегда берется по модулю.
Для выполнения этого пункта следует отделить параметры конструктора от полей.
class Fraction(n: Int, d: Int) {
if (d == 0)
throw new IllegalArgumentException("Denominator cannot equal to zero.")
val numerator = if (d < 0) -n else n
val denominator = math.abs(d)
}
Десятичное представление
Обыкновенная дробь имеет десятичное представление.
Добавим поле decimal
двойной точности:
val decimal = numerator.toDouble / denominator
Обратная дробь
Дробь, обратная заданной, получается перестановкой числителя и знаменателя.
Добавим метод inversed
, возвращающий новый экземпляр Fraction
, подставляя вместо числителя значение знаменателя текущей дроби и наоброт:
def inversed = new Fraction(denominator, numerator)
Модуль дроби
Модуль обыкновенной дроби — это дробь, числитель и знаменатель которой берутся по модулю.
Добавим метод abs
, возвращающий модуль текущей дроби:
def abs = new Fraction(math.abs(numerator), denominator)
Мы берем по модулю только числитель, т.к. поле denominator
уже содержит положительное значение.
Стандартное представление
Для наглядности работы с экземплярами через консоль добавим стандартное текстовое представление, переопределив метод toString
.
Стандартное представление дроби — числитель отделяется от знаменателя косой чертой.
override def toString = {
var result = numerator.toString
if (denominator != 1)
result += "/" + denominator
result
}
Промежуточные результаты
class Fraction(n: Int, d: Int) {
if (d == 0)
throw new IllegalArgumentException("Denominator cannot equal to zero.")
val numerator = if (d < 0) -n else n
val denominator = math.abs(d)
val decimal = numerator.toDouble / denominator
def inversed = new Fraction(denominator, numerator)
def abs = new Fraction(math.abs(numerator), denominator)
override def toString = {
var result = numerator.toString
if (denominator != 1)
result += "/" + denominator
result
}
}
Проверка
val f1 = new Fraction(8,-6)
f1: Fraction = -8/6
f1.decimal
res0: Double = -1.3333333333333333
f1.inversed
res0: Fraction = -6/8
f1.abs
res0: Fraction = 8/6
f1.inversed.abs
res0: Fraction = 6/8