Лабораторная работа будет выдана на ограниченное время, равное 1 паре. Формат сдачи можно сравнить с обыкновенной контрольной по математическим предметам.

Текст задачи будет размещён на данной странице, а решение необходимо будет предоставить на ресурс moodle.uniyar.ac.ru. Пожалуйста удостоверьтесь, что у вас есть доступ к данному ресурсу.

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

Важно. Если у проверяющего возникнет обоснованное предположение о совместном решении, тогда все участники получат оценку.

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

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

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

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

Задача

Разработайте интерактивное консольное приложение для обработки результатов тестирования школьников.

Весь поток 7 класса прошёл тест, состоящий из 40 вопросов. Результаты тестирования записанные в CSV-файле. Файл можно скачать по ссылке.

Пример структуры файла:

7А,Агатьева Арина Юрьевна,0010110001001101001100001001101100111000
7А,Алексеева Пальмира Гурьевна,0111011001001111101101011011010110111101
7А,Алексеев Феликс Александрович,1111010101111111111111011110110110110011

В первом столбце находится номер класса ученика. Во втором столбце — фамилия, имя и отчество школьника. В третьем столбце приведены результаты тестирования студента в виде строки из нулей и единиц, где единица обозначает правильный ответ на соответствующий её порядковому номеру вопрос, а ноль — неправильный.

Приложение должно выставлять оценку «3» за 21 и более правильный ответ, «4» за 26 и более правильных ответов, «5» за 31 и более правильный ответ.

Приложение должно считывать эти данные из файла и позволять учителю выполнять следующие задачи:

  1. Находить и отображать список двоечников с указанием их ФИО, номера класса и количества правильных ответов.
  2. Вычислять статистику тестирования. Вывести на экран список классов (7А – 7Д), для каждого указать количество учеников и среднее количество правильных ответов в этом классе.
  3. Пересчитать оценки по другой шкале. Запросить у пользователя количество правильных ответов, начиная с которого выставлять оценку «3», «4» и «5». Вывести количество учеников, получивших оценки «2», «3», «4» и «5», в отдельности для каждого класса.
  4. Проверить на возможное списывание. Проверить, существуют ли пары учеников, у которых ответы различаются не более, чем в трёх вопросах. В результате проверки вывести соответствующее сообщение (есть или нет такие пары) и все пары, если такие есть.
  5. Найти три самых сложных вопроса. Сложность вопроса оценивается количеством учеников, которые не смогли дать правильный ответ на него.