Открыто
27.03.2023, 05:51
29.05.2023, 04:37
Реализовать класс Range
для работы с интервалами и
интервальной арифметикой.
Мы будем рассматривать всевозможные конечные вещественные интервалы
[a, b] (a <= b)
. Т.е. интервалы считаются открытыми.
В рамках задачи интервал будет задаваться двумя крайними значениями a
и b
.
Реализовать класс 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
являются глобальными.
public
методам, класса Range
,
необходимо добавить спецификаторы static
и const
.
Но только в те места, где это необходимо.public
и protected
методы классов фиксированы, кроме спецификаторов.
Т.е. нельзя менять названия методов, а также типы и количество аргументов.Range.hpp, Range.cpp
.