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

Проверяемые знания учащихся

  • Уровень знакомства с языком Ruby:
    • Запуск приложения.
    • Описание переменных и методов, их использование.
    • Работа с контейнерами, итераторами, нумераторами.
    • Описание собственных классов.
    • Наследование классов.
    • Использование модулей и примесей.
    • Знание деталей работы стандартных классов: чисел, строк.
    • Знание деталей вызова методов и указания их аргументов.
    • Использование методов чисел и промежутков.
    • Использование методов классов строк и регулярных выражений.
  • Уровень знакомства с экосистемой языка Ruby:
    • Установка, удаление зависимостей с помощью gem.
    • Управление зависимостями с помощью Bundler.
    • Проверка качества исходного кода с помощью Rubocop.

Требования к выполнению задания

  • Приложение должно реализовать все требования, указанные в задании. Однако к защите допускаются приложения, реализующие только часть задач.
  • К защите не допускается исходный код, который не запускается.
  • Исходный код приложения должен быть проверен с помощью приложения Rubocop с настройками по-умолчанию или с конфигурацией, предложенной на соответствующем занятии. Для каждого нарушения, которое находит Rubocop, должно быть объяснение почему оно не было исправлено. Допускаются аргументы с точки зрения архитектуры приложения, другого рода аргументы не принимаются.
  • Все зависимости приложения должны управляться с помощью Bundler, установка зависимостей с помощью gem запрещена. Исключением является джем bundler.
  • Для разрабатываемого приложения должны быть создан отдельный каталог.
    • В корне каталога должны располагаться конфигурационные файлы: Gemfile, Gemfile.lock.
    • В корне каталога приложения должны находится каталоги bin, lib, в которых должен находиться исходный код приложения. В каталоге bin находится исполняемый файл, в каталоге lib находится описание всех собственных классов и модулей.
  • Весь код приложения должен быть разбит на модули и классы, запрещается использовать файлы с простым набором методов, которые не пренадлежат какому-либо модулю.
  • Необходимо выделить отдельные классы, описывающие предметную область.
  • В одном модуле нельзя совмещать логику обработки предметной области и операции ввода-вывода.
  • Приложение должно корректно обрабатывать неправильный ввод от пользователя.
  • Приложение должно обладать понятным интерфейсом: показывать помощь по использованию, для ввода данных приложение должно показывать приглашение.

Задача

Самостоятельно разработать консольное приложение, позволяющее решать квадратные уравнения формата a * x ^ 2 + b * x + c = 0. Пользователю необходимо ввести коэффициенты a, b и c.

Приложение должно отображать следующие пункты меню:

  • Добавить новое квадратное уравнение.
  • Просмотреть список ранее добавленных уравнений.
  • Выйти из приложения.

При выборе первого элемента меню приложение должно реализовать следующий сценарий:

  1. Приложение показывает приглашение для ввода первого коэффициента.
  2. Пользователь вводит первый коэффициент.
  3. Приложение проверяет введённые данные. Если ввод не верен, то возвращается к пункту № 1.
  4. Приложение показывает приглашение для ввода второго коэффициента.
  5. Пользователь вводит второй коэффициент.
  6. Приложение проверяет введённые данные. Если ввод не верен, то возвращается к пункту № 4.
  7. Приложение показывает приглашение для ввода третьего коэффициента.
  8. Пользователь вводит третий коэффициент.
  9. Приложение проверяет введённые данные. Если ввод не верен, то возвращается к пункту № 7.
  10. Приложение показывает пользователю уравнение с подставленными коэффициентами. Затем указывает на количество корней: корней нет, 1 корень, 2 корня. Если корни есть, то выводит их.
  11. Приложение показывает стартовое меню.

При выборе второго пункта меню должен быть показан список ранее добавленных уравнений. Для каждого из них надо вывести туже информацию, что и в пункте № 10 предыдущего шага.

При выводе уравнения надо группировать по количеству корней в группы: нет корней, 1 корень, 2 корня. Внутри групп сортировка произвольная.

При выборе последнего пункта меню приложение должно корректно завершать свою работу.