Skip to content
This repository has been archived by the owner on Jan 2, 2024. It is now read-only.

Latest commit

 

History

History
81 lines (58 loc) · 4.19 KB

README.md

File metadata and controls

81 lines (58 loc) · 4.19 KB

C++: Int128

Лабораторная работа по курсу C++, ИТМО

Необходимо реализовать класс целого знакового 128-битого числа. Такой тип не предусматривается стандартом языка, однако многие популярные библиотеки (например, boost и abseil) реализуют соответствующую структуру данных. Вам необходимо реализовать её упрощённую версию.

Интерфейс класса должен состоять из следующих операций:

  • Конструирование без аргументов
  • Конструирование от int64_t
  • Конструирование от std::string_view
  • Явное приведение к int64_t
  • Явное приведение к double
  • Перевод в строку: std::string str()
  • Сложение: +, +=
  • Вычитание: -, -=
  • Умножение: *, *=
  • Деление: /, /=
  • Унарный минус: -
  • Сравнение на равенство: ==, !=
  • Вывод в поток: <<

Ограничения на принимаемые значения: [-2^127, 2^127 - 1].

Обработка ошибок не требуется, однако операции стоит реализовывать так, чтобы минимизировать вероятность переполнения.

Допустимо добавление в публичный интерфейс дополнительных методов, если они семантически действительно должны быть публичными.

Арифметические выражения

Необходимо организовать иерархию классов для работы с вычислимыми арифметическими выражениями над типом Int128.

Виды выражений:

  • Const (в конструкторе передаётся значение)
  • Variable (в конструкторе передаётся имя переменной)
  • Negate (унарный минус)
  • Add (сложение)
  • Subtract (вычитание)
  • Multiply (умножение)
  • Divide (деление)

Все эти классы должны (необязательно напрямую) наследоваться от Expression.

Пример конструирования выражения 2 * x + 1:

const Add expr(Multiply(Const(2), Variable("x")), Const(1));

Над выражениями должны быть реализованы соответствующие арифметические операторы. Таким образом, предыдущий пример можно было бы записать так:

const Add expr = Const(2) * Variable("x") + Const(1);

Аргументом методу eval передаётся отображение из имени переменной в её значение. Он возвращает результат выражения, используя переданные значения вместо переменных.

const Int128 result = expr.eval({
    {"x", Int128(100)}
    {"y", Int128(42)}
}); // 201

Вспомогательный метод clone должен возвращать указатель на такое же выражение, как то, на котором он вызван, однако владение над указателем принадлежит вызвавшему метод.

Для класса Expression должен быть реализован оператор вывода в поток.

В этой части задания также не требуется обрабатывать ошибки.

Написание своих тестов.

Тесты необходимо написать на catch2, они должны покрывать все операции и запускаться автоматически на github.