Вход в систему
РФЭИ/ИТ
Базовые определения Практика: обыкновенные дроби Язык программирования Scala
Спецификация Сократимость

Базовые определения

Начнем определение класса 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
Спецификация Сократимость
2012 © ООО «Территория Образования»
Сделано с помощью Circumflex