Задание № 1506

Студент

Корнев Захар

Задача

Интервальная арифметика

Состояние

Завершено

Баллов

3

Дедлайн
18 марта 2019
Назначено

04.03.2019, 13:01

Завершено

07.04.2019, 12:50

Реализовать класс Range для работы с интервалами и интервальной арифметикой.

Описание

Мы будем рассматривать всевозможные конечные вещественные интервалы [a, b] (a <= b). Т.е. интервалы считаются открытыми. В рамках задачи интервал будет задаваться двумя крайними значениями a и b.

  • Вырожденные интервалы, у которых начало и конец совпадают, будем отождествлять с обычными вещественными числами.
  • При делении интервалов, обратите внимание на наличие нуля в интервале.
  • При перегрузке стандартных функций (таких как sin, cos) см. [1].

Постановка задачи

Реализовать класс Range в соответствии с указанным интерфейсом. public и protected методы классов фиксированы, кроме спецификаторов. Т.е. нельзя менять названия методов, а также типы и количество аргументов. НО в этих методах отсутствуют спецификаторы const и static, которые были удалены намеренно. Их необходимо вернуть на место.

private поля и private методы можно добавлять в класс Range.

class Range final {
public:
  Range();
  Range(double value);
  Range(double lower, double upper);

  const double& lower();
  const double& upper();

  void assign(double lower, double upper);
  double width();

  Range operator+(double right);
  Range operator-(double right);
  Range operator*(double right);
  Range operator/(double right);

  Range& operator+=(double right);
  Range& operator-=(double right);
  Range& operator*=(double right);
  Range& operator/=(double right);

  Range& operator+=(const Range &right);
  Range& operator-=(const Range &right);
  Range& operator*=(const Range &right);
  Range& operator/=(const Range &right);

  Range operator+(const Range &right);
  Range operator-(const Range &right);
  Range operator*(const Range &right);
  Range operator/(const Range &right);

  bool operator<(const Range& right);
  bool operator<(double right);

  bool operator>(const Range& right);
  bool operator>(double right);

  bool operator<=(const Range& right);
  bool operator<=(double right);

  bool operator>=(const Range& right);
  bool operator>=(double right);

  bool operator!=(const Range& right);
  bool operator!=(double right);

  bool operator==(const Range& right);
  bool operator==(double right);

  bool isValid();

  bool in(double value, const Range& range);
  bool zeroIn(const Range& range);
  bool overlap(const Range& x, const Range& y);
};

Range operator+(double left, const Range &right);
Range operator-(double left, const Range &right);
Range operator*(double left, const Range &right);
Range operator/(double left, const Range &right);

bool operator<(double left, const Range& right);
bool operator>(double left, const Range& right);
bool operator<=(double left, const Range& right);
bool operator>=(double left, const Range& right);
bool operator!=(double left, const Range& right);
bool operator==(double left, const Range& right);

Range abs(const Range& range);
Range sqrt(const Range& range);
Range square(const Range& range);

Range sin(const Range& range);
Range cos(const Range& range);
  • Range() -- конструктор по умолчанию.

  • Range(double value) -- конструктор для вырожденного интервала.

  • Range(double lower, double upper) -- конструктор с параметрами. lower - левая граница интервала, upper - правая граница интервала.

  • lower() -- метод возвращает константную ссылку на значение левой границы.

  • upper() -- метод возвращает константную ссылку на значение правой границы.

  • assign(double lower, double upper) -- присваивание интервалу новых значений левой и правой границ.

  • width() -- возращает ширину интервала. Для вещественного числа ширина равняется 0.

  • isValid() -- возращает true если интервал является валидным, иначе false. Интервал может стать невалидным в случае выполнения невалидных операций. Например, при делении на нуль, operator/ должен вернуть невалидный интервал. Чтобы задавать невалидный интервал, предлагается использовать значения NAN для границ интервала. Также интевал [a, b] невалиден, если a > b.

  • in(double value, const Range& range) -- метод проверяет вхождение вещественного числа value в интервал range.

  • zeroIn(const Range& range) -- метод проверяет вхождение нуля в интервал range.

  • overlap(const Range& x, const Range& y) -- метод проверяет наличие пересечения двух интервалов.

  • abs(const Range& range) -- перегрузка глобальной функции abs для интервала. Функция реализуется согласно правилам интервальной арифметики. Тоже самое касается остальных глобальных функций.

  • арифметические операторы -- все арифметические операторы для интервалов реализуются согласно правилам интервальной арифметики. Операторы, которые находятся за пределами класса Range являются глобальными.

Требования

  1. К public методам, класса Range, необходимо добавить спецификаторы static и const. Но только в те места, где это необходимо.
  2. public и protected методы классов фиксированы, кроме спецификаторов. Т.е. нельзя менять названия методов, а также типы и количество аргументов.
  3. Названия header и source файлов следующие: Range.hpp, Range.cpp.
  4. Написать unit test'ы для реализованного класса.

Действия