Файл содержит статистику биатлонных гонок кубка мира типа спринт с 2-мя огневыми рубежами:
- № этапа гонки
- стартовый № участника
- занятое место
- фамилия участника
- имя участника
- страна участника
- общее время прохождения дистанции, сек.
- время подхода к первому огневому рубежу (относительное, в секундах от начала гонки)
- время подхода ко второму огневому рубежу (относительное, в секундах от начала гонки)
- время отхода от первого огневого рубежа (относительное, в секундах от начала гонки)
- время отхода от второго огневого рубежа (относительное, в секундах от начала гонки)
- общее кол-во промахов
- общее время прохождения штрафных кругов
Для незавершивших гонку указывается общее время -1. Найти тех, кто стрелял точнее всего на протяжении сезона и вывести по ним данные по всем гонкам, а конкретно:
- № этапа гонки
- № участника
- занятое место
- общее время прохождения дистанции
- кол-во промахов и указать наилучшее время стрельбы и гонка, где оно было достигнуто.
В заголовке указывается кол-во этапов, в футере - кол-во записей и общее кол-во промахов.
Первая строка начинается с header:
, после чего идет содержимое заголовка. Строки с данными начинаются с порядкового номера строки
(номерация с 1). Отдельные элементы строк (поля) разделены символом ";". Разделитель внутри контента встречаться не должен. В файле могут
быть пустые строки и строки из пробелов, которые не номеруются и должны игнорироваться при разборе. Последняя строка (футер) начинается с footer:
, после чего идет содержимое футера.
- Входные данные поступают в файле. Если в командной строке более 1 параметра/ключа, то имя/путь исходного файла должно браться как соответствующий аргумент командной строки. В противном случае он должен задаваться пользователем при запуске программы.
- Исходные и результирующие файлы, указанные пользователем - через пробел - во время выполнения программы, также даолжны обрабатываться.
- Правильный результат обработки правильных данных должен выводиться на экран либо в файл. Решение о точке вывода данных принимается динамически, в процессе выполнения программы, путем запроса у пользователя.
- Реализован контейнер/контейнеры, содержащие данные, предоставляемые в файле (необязательно сохранять все поля, можно хранить частично агрегированную информацию)
- Ограничения контейнера по памяти зависит только от доступного объема свободной памяти. Файлы размером 10 Мб должны успешно загружаться.
- В контейнере должен быть метод, выводящий содержимое контейнера на экран (в консоль)
- В контейнере/контейнерах должны быть реализованы публичные методы для добавления информации в контейнер в виде обработанных данных (скалярных или ссылочных), но не содержимое всего файла или его части, или неразобранные строки, или входной поток.
- В контейнере/контейнерах должны быть реализованы публичные методы для поиска в них информации. Аргументами этих методов должны быть не пользовательские объекты, а скалярные данные или строки. Методы для поиска элемента типа Т в контейнере элементов типа Т не запрещаются, однако они не должны быть публичными. Могут использоваться для поиска с помощью перегруженного оператора "==". При таком подходе, они должны быть "обернуты" в публичные методы, к которым относится это подпункт.
- Логика разбора строк должна быть вынесена в отдельный класс/классы (Lexer), отвечающий исключительно за разбор текста. Разбор осуществляется за 1 проход по ленивой стратегии (исключением может быть случай использования специальных системных библиотек, выпоняющих энергичный разбор).
- Логику загрузки исходного файла в контейнер вынести в отдельный класс (Builder), который, используя объект(ы) класса Lexer (возможно и классов-наследников), реализует загрузку содержимого текстового файла в контейнер. В нем должен быть соответствующий метод, аргументами которого выступают контейнер и имя файла.
- Корректный файл должне правильно разбираться и загружаться в контейнер.
- При разборе строк не должны разрабатываться функции, аналоги которых входят в состав стандартных библиотек.
- При наличии ошибок в исходном файле выводится диагностическое сообщение, оперделяющее тип ошибки (ошибки при работе с физическим файлом, синтаксические или семантические ошибки) и сообщает суть ошибки и номер строки файла, на которой ошибка выявлена. При наличии ошибок в исходном файле загрузка данных производится до первой ошибки.
- Реализовать метод(ы) контейнера, выводящие правильный результат обработки в файл. Если путь/имя файла для вывода не задано, вывод осуществляется в консоль.
- Все открытые файлы должны быть закрыты сразу после того, как завершается их чтение.
- Избегать использование алгоритмов со сложностью, превышающей квадратичную. Файли размеров до 100Кб должны обрабатываться не долее часа.
- Проверка синтаксических ошибок:
- некорректное отображение чисел (?)
- несоответствие формата
- неверное кол-во элементов информации в строке При вводе принимается максимальный размер строки записи 2047 символов. Проверять это не требуется.
- Пустые строки и строки, содержащие пробелы, игнорируются.
- Контролируется соответствие содержимого файла его заголовку и футеру.
- Контролируются все возможные семантические ошибки.