Открыто
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.