Блок задач

3. Простые классы

Сложность 3

Задача «Длинные целые числа»

Реализовать класс LongInteger для работы с очень длинными (> LLONG_MAX) знаковыми целыми числами.

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

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

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

//LongInteger.hpp
class LongInteger {
public:
  LongInteger();
  LongInteger(int i);
  LongInteger(const char* iStr);
  LongInteger(const LongInteger& val);
  ~LongInteger();
  size_t ToString(char* buff, size_t buff_lenght);

  LongInteger& operator= (int val);
  LongInteger& operator+=(int val);
  LongInteger& operator-=(int val);
  LongInteger& operator*=(int val);
  LongInteger& operator/=(int val);

  LongInteger& operator= (const LongInteger &val);
  LongInteger& operator+=(const LongInteger &val);
  LongInteger& operator-=(const LongInteger &val);
  LongInteger& operator*=(const LongInteger &val);
  LongInteger& operator/=(const LongInteger &val);

  bool operator==(const LongInteger &right);
  bool operator!=(const LongInteger &right);
  bool operator>=(const LongInteger &right);
  bool operator<=(const LongInteger &right);
  bool operator>(const LongInteger &right);
  bool operator<(const LongInteger &right);

  LongInteger operator+(const LongInteger &right);
  LongInteger operator-(const LongInteger &right);
  LongInteger operator*(const LongInteger &right);
  LongInteger operator/(const LongInteger &right);
  LongInteger operator%(const LongInteger &right);

protected:
private:

};
  • LongInteger() -- Конструктор по умолчанию
  • LongInteger(int i) -- Конструктор определяющий LongInteger из знакового целого.
  • LongInteger(const char* iStr) -- Конструктор из строкового представления целого числи по основанию 10. Кидает исключение std::invalid_argument, если строка невалидная. Пустая строка считается валидной.
  • LongInteger(const LongInteger& val) -- Копирующий конструктор.
  • ~LongInteger() -- деструктор.
  • size_t ToString(char* buff, size_t buff_lenght) -- Преобразует LongInteger в строковое представление целого числа по основанию 10. char* buff - Буфер для строки, size_t buff_lenght - длина буфера. Возвращает количество записанных в буфер байт (включая заключительный ноль). Если в буфере не достаточно места, в буфер ничего не записывается и возвращается количество байт, необходимое для правильного вывода (включая заключительный ноль).

Стандартные операторы, принимающие в качестве аргументов int

  • LongInteger& operator= (int val) -- Оператор присваивания, аналог конструктора из целого числа.
  • LongInteger& operator+=(int val) -- Оператор +=, прибавить...
  • LongInteger& operator-=(int val) -- Оператор -=, отнять...
  • LongInteger& operator*=(int val) -- Оператор *=, умножить на...
  • LongInteger& operator/=(int val) -- Оператор /=, поделить на...

Стандартные операторы, принимающие в качестве аргументов LongInteger

  • LongInteger& operator= (const LongInteger& val) -- Оператор присваивания, аналог конструктора копирующего конструктора.
  • LongInteger& operator+=(const LongInteger& val) -- Оператор +=, прибавить...
  • LongInteger& operator-=(const LongInteger& val) -- Оператор -=, отнять...
  • LongInteger& operator*=(const LongInteger& val) -- Оператор *=, умножить на...
  • LongInteger& operator/=(const LongInteger& val) -- Оператор /=, поделить на...
  • bool operator==(const LongInteger& right) -- Оператор ==, возвращает true если аргумент равен исходному числу
  • bool operator!=(const LongInteger& right) -- Оператор !=, возвращает true если аргумент не равен исходному числу
  • bool operator>=(const LongInteger &right) -- Оператор больше либо равно
  • bool operator<=(const LongInteger &right) -- Оператор меньше либо равно
  • bool operator>(const LongInteger &right) -- Оператор больше
  • bool operator<(const LongInteger &right) -- Оператор меньше
  • LongInteger operator+(const LongInteger& right) -- Оператор сложения длинных целых чисел
  • LongInteger operator-(const LongInteger& right) -- Оператор вычитания длинных целых чисел
  • LongInteger operator*(const LongInteger& right) -- Оператор умножения длинных целых чисел
  • LongInteger operator/(const LongInteger& right) -- Оператор деления длинных целых чисел
  • LongInteger operator%(const LongInteger &right) -- Оператор остаток от деления длинных целых чисел

Примечание: при делении на 0 кидать исключение std::invalid_argument.

Требования

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