Модернизация дистанционного практикума по программированию для поддержки новых правил проведения олимпиад школьников

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    387,36 Кб
  • Опубликовано:
    2016-11-09
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Модернизация дистанционного практикума по программированию для поддержки новых правил проведения олимпиад школьников

СОДЕРЖАНИЕ

ВВЕДЕНИЕ

. АНАЛИТИЧЕСКИЙ ОБЗОР

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

.2 Анализ существующих решений

.3 Анализ системы дистанционного практикума ВоГУ, подлежащий модернизации

. ПРОЕКТИРОВАНИЕ СИСТЕМЫ

.1 Определение решаемых задач

.2 Проектирование изменений в ядре системы

.3 Проектирование изменений в базе данных системы

.4 Проектирование изменений в веб-интерфейсе пользователя

. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ СИСТЕМЫ

.1 Программная реализация изменений в ядре системы

.2 Программная реализация изменений в базе данных системы

.3 Программная реализация изменений в веб-интерфейсе пользователя

. ТЕСТИРОВАНИЕ СИСТЕМЫ

. РАЗРАБОТКА ДОКУМЕНТАЦИИ

.1 Разработка инструкции для участника олимпиад

.2 Разработка инструкции для членов жюри

.3 Разработка инструкции для администратора

ЗАКЛЮЧЕНИЕ

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

ПРИЛОЖЕНИЯ

ВВЕДЕНИЕ


В информационную эпоху, дисциплина по программированию присоединилась в образовательный стандарт многих специальностей инженерного профиля. Направления обучения, связанные с IT-технологиями, стали наиболее популярными среди студентов и востребованными среди работодателей.

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

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

Данная выпускная квалификационная работа представляет собой разработку подсистемы для проведения подобных олимпиад среди школьников. В основной части это будет модернизация уже существующего дистанционного практикума по программированию. Система построена на реляционной базе данных Firebird, для написания графического интерфейса используются средства языков HTML и Perl, ядро разработано на языке C++, также будет реализована отдельная программа для вывода турнирной таблице, написанная на языке Java.

1. АНАЛИТИЧЕСКИЙ ОБЗОР


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

Согласно требованиям региональной олимпиаде по информатике за 2015 - 2016 год, решением задачи является программа, которая формирует по известным входным данным, поступающим со стандартного потока ввода, выходные данные, идущие через стандартный поток вывода [1]. В тексте условия должны быть обязательно указаны предельное время работы программы, количество доступной памяти должно быть не более 256 мегабайт. Размер файла - исходника, должен быть не более 256 килобайт, а время компиляции не больше минуты.

Участник олимпиады должен иметь возможность выбрать язык программирования и соответствующий ему компилятор. Таблица команд компиляции должна быть доведена до сведения всех участников перед началом каждого тура и размещена в памятке участнику. Если программная среда проведения соревнований с автоматической проверкой не используется, то участник в комментарии в начале текста программы указывает, каким компилятором компилировать его программу − это должно быть указано в памятке участника.

Оценка правильности решения задач осуществляется в следующей последовательности:

Участники отправляют на автоматическую проверку файлы с исходным текстом кодом своих решений. При отправке участники указывают язык программирования, на котором выполнено решение.

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

Скомпилированная программа последовательно запускается на тестах из примеров в условии. Если хотя бы один из тестов из условия не пройден, участнику сообщается об этом и сообщается, на каком тесте и какая ошибка произошла.

Если решение проходит все тесты из условия, участнику сообщается об этом и решение принимается на окончательную проверку.

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

Если в процессе исполнения используемая программой память превышает значение, указанные в условии задачи, работа программы участника завершается и результатом работы программы на этом тесте является сообщение «Превышено ограничение по памяти» («Memory limit exceeded»).

Если программа успешно завершила работу, но не создала выходной файл, указанный в условии задачи, результатом работы программы на этом тесте является сообщение «Неверный формат вывода» («Presentation Error»).

Если в процессе исполнения программа использованное программой процессорное время превышает значение, указанные в условии задачи, работа программы участника завершается и результатом работы программы на этом тесте является сообщение «Превышено ограничение по времени» («Time limit exceeded»).

Если исполнение программы завершилось с ошибкой или код выхода программы не равен 0, то считается, что у программы произошла ошибка исполнения и результатом работы программы на этом тесте является сообщение «Ошибка во время выполнения» («Runtime Error»).

Оценивание решения, принятого на окончательную проверку, осуществляется следующим образом. Тесты к каждой задаче разделены на группы, каждая группа соответствует своей подзадаче. Для каждой подзадачи в условии задачи указано, каким образом оценивается эта подзадача.

Общее количество баллов за задачу равно сумме баллов, полученных за каждую подзадачу.

По каждой задаче участнику сообщается результат окончательной проверки не более 10 раз. Пример предоставления информации в случае, если сообщается результат проверки решения на каждом тесте, приведен на рис. 1.1 (здесь приведена лишь часть полученной информации).

Рисунок 1.1- Пример предоставления информации в случае, если сообщается результат проверки решения на каждом тесте.

1.2 Анализ существующих решений

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

Подобные системы можно разделить на два типа:

1.      Проверяющие системы с определенным архивом задач

.        Системы для соревнований в режиме реального времени

Одной из интересных систем, является система второго типа под названием ejudge [2]. У неё следующие особенности:

·        Виртуальные турниры

·        Многоязычный интерфейс

·        Интерфейс администратора турнира

·        Вариантность задач

·        Кастомизируемый внешний вид

·        Множество олимпиадный режимов по различным системам

Архитектура системы состоит из следующих компонентов:

·        Компоненты работающие с базой данных, компиляцией решений, учетом действующих турниров

·        Обслуживающие запросы пользователей

·        Второстепенные программы, дающие доступ к управлению системой через командную строку

Управляющие компоненты работают все время, в течении жизни системы. Эти компоненты работают в одном экземпляре на запущенные олимпиады. Запуск системы ejudge состоит в запуске компонент управления, к ни относят программы userlist-server, super-serve, compile, job-server.

Userlist-server - позволяет пользователям регистрироваться на олимпиаду, просматривать других участников, проводить аутентификацию пользователей. По сути, она выполняет обязанности сервера базы.

Super-serve следит за активными олимпиадами, может запускать средства обслуживания олимпиады, принимает запросы на изменение параметров олимпиады.

Compile занимается компиляцией решений участников олимпиады.

Job-server занимается рассылкой электронных сообщений, воспроизведением звуковых откликов и других низкоприоритетных запросов.

Существует система acm.timus Это система уральского государственного университета, представляет собой архив задач, т.е. система первого типа. Позволяет проверить задачу в любое удобное время[3].

Рассмотрим систему Яндекс.Контест. Это платформа для создания тестов и проведения онлайн-тестирований [4]. Основное назначение платформы - проведение соревнований по спортивному программированию. С помощью Яндекс.Контест проводятся как индивидуальные, так и командные соревнования различных уровней - от школьных олимпиад до международных чемпионатов.

На платформе Яндекс.Контест проводятся следующие соревнования:

·        По типу доступа: открытые, закрытые

·        По времени начала: реальные, виртуальные

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

Существуют различные системы правил проведения турниров по программированию. Например ACM International Collegiate Programming Contest, где победитель определяется по количеству решенных задач, в спорных ситуациях победит участник с наименьшим штрафным временем. Штрафное время - это время которое прошло с момента начала турнира до момента сдачи верного решения.

Система правил школы анализа данных (ШАД) - побеждает участник, набравший наибольшее количество баллов, за каждую неудачную попытку отправки решения, участнику начисляет штраф в определенное количество баллов. Существуют и другие турнирные системы.

Пример предоставления информации условий задач и отправки решений показан на рисунке 1.2.

Рисунок 1.2-Пример представления информации для участника турнира в системе Яндекс.Контест.

В заголовках столбцов указывается суммарный итог участников по каждой задаче (количество решений/количество попыток решения) и вычитаемое штрафное время за верное решение этой задачи вслепую

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

Пример предоставления итоговой таблицы предоставлен на рисунке 1.3.

Рисунок 1.3- Пример отображения турнирной таблицы в системе Яндекс.Контест.

.3 Анализ системы дистанционного практикума ВоГУ, подлежащий модернизации

Система представлена в классической клиент-серверной архитектуре, когда пользователь через интернет-браузер отсылает запросы на удаленный веб-сервер [5]. На веб-сервере находятся скрипты, которые обрабатывают запросы клиента и формируют для клиента html страницы.

Система состоит из нескольких модулей:

·        Аутентификация - модуль занимается проверкой подлинности пользователя.

·        Просмотр задач - модуль для отображения задач в виде иерархической структуры.

·        Формирование статистики - модуль формирует отчет по результатам и спискам решенных и не решенных задач.

·        Управление пользователями - модуль отвечает за создание групп юзеров, передачи прав и создание новых пользователей.

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

·        Управление системой - позволяет запускать и останавливать сервера, сконфигурированных в системе, управляет и настраивает систему защиты , определяет опасный код.

·        Анализ плагиата - модуль выявляет «похожие» решения у различных пользователей для любого языка программирования.

Существуют и другие модули, все они работают под управлением веб-сервера с использованием fasr-cgi скриптов [6].

Концептуальная схема базы данных приведена на рисунке 1.4.

Рисунок 1.4- Концептуальная схема базы данных.

Алгоритм работы модулей представлен на рисунке 1.5.

Рисунок 1.4- Обобщенный алгоритм работы модулей.

Страницы веб-интерфейса построены по правилу - каждая страница делится на навигационную часть и информативную. В навигационной части располагаются ранее рассмотренные функции, содержимое навигационной части одинаково для любых страниц [7]. Информативная часть показывает полезную для пользователя информацию, формы ввода, эта часть зависит от запросов юзера.

Схема навигации между формами показана на рисунке 1.5.

Рисунок 1.5- Схема навигации интерфейса.

При разработке дистанционного практикума по программированию применялись следующие средства:

1.      Компилятор Borland C++ 5.02 при разработке ядра системы.

2.      Firebird 1.5 в качестве базы данных.

3.      Apache 1.3 - веб сервер, с модулями fast-cgi скриптов.

4.      Perl 5.6 с модулями FCGI - интерфейс для работы с fast-cgi, DBI - для работы с базой данных.

2. ПРОЕКТИРОВАНИЕ СИСТЕМЫ


.1 Определение решаемых задач

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

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

После окончания проверки, по запросу участника, сделанному с использованием интерфейса автоматической системы проверки решений, участник может получить информацию о результатах проверки своего решения [8]. Какая информация может быть получена участником по каждой подзадаче, указано в условии каждой задачи, при этом возможны следующие варианты:

·        участнику сообщается суммарное количество баллов;

·        сообщается результат проверки его решения на каждом тесте

По каждой задаче участник может сделать во время тура не более 10 запросов на вывод результатов окончательной проверки на всем наборе тестов для этой задачи.

Тесты для каждой задачи сгруппированы по подзадачам. Для каждой подзадачи в условии задачи указывается правило начисления баллов за эту подзадачу.

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

2.2 Проектирование изменений в ядре системы

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

Нужно определить формат для работы с наборами тестов. Помимо самих тестов, необходимо сформировать конфигурационный файл, пример такого файла представлен на рисунке 2.1.

Рисунок 2.1- Содержимое конфигурационного файла.

Первая цифра в каждой строке обозначает количество баллов, которое получить пользователь при удачном прохождении определенного набора тестов. Набор тестов идет сразу после количества баллов. К примеру, из указанного рисунка выше следует, что если программа участника турнира пройдет тесты с 1 по 5, то он получит 20 баллов, если удачно будут пройдены тесты с 6 по 10, то к имеющимся 20 баллам прибавятся еще 30.

.3 Проектирование изменений в базе данных системы

Концептуальная схема базы данных дистанционного практикума ВоГУ была представлена в первой главе. Исходя из требований предметно-методической комиссии, участник турнира может запросить не более десяти отчетов с результатами проверки по каждой задаче. Потребуется хранить количество запросов в базе данных. Для этого достаточно ввести новое поле REPORT_VIEWED в таблицу STATUS, таблица хранит статистику проверяемых задач. При каждом вызове статистики это поле будет равно единице.

Исходная система поддерживает, только один тип турнира - ACM, для ввода нового типа турнира потребуются ввести дополнительную информацию в таблицу TYPENAMES, там потребуется указать название нового типа турнира на русском и английском языках, в таблицу CONTTYPES потребуется добавить идентификатор нового типа турнира.

.4 Проектирование изменений в веб-интерфейсе пользователя

Личная страница участника турнира показана на рисунке 2.2.

Рисунок 2.1- Личная страница участника турнира.

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

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

Форма для организации нового турнира представлена на рисунке 2.3.

Рисунок 2.3- Форма для организации нового турнира.

Данная форма поддерживает только один тип турнира - ACM, потребуются ввести дополнительный тип « Всероссийская олимпиада школьников». Страница с итоговыми результатами турнира должна содержать таблицу с результатами, должна содержать имена участников, список задач, баллы за каждую задачу, итоговый суммарный балл, место в турнире

3. ПРОГРАММНАЯ РЕАЛИЗАЦИЯ СИСТЕМЫ


.1 Программная реализация изменений в ядре системы

Изначально для обработки тестов в режиме ACM турнира было достаточно обработать конфигурационный файл index.lst в котором находились номера тестов. Эта обработка не подразумевала обработку групп тестов, тесты проверялись индивидуально и если один из них будет провален, то обработка на этом закончится. Для обработки решений в режиме школьных олимпиад разработан файл points.lst, его формат указан в предыдущей главе. Алгоритм работы представлен в Приложении 3. Суть алгоритма сводится к тому, что в обрабатывающая процедура принимает параметры задачи, под параметрами понимаются: путь к тестам, лимит времени, ограничение памяти, число баллов за решение и др. Затем нужно проверить, есть в этом наборе параметров файл points.lst, если да, то это школьная олимпиада, в противном случае это будет ACM турнир. В случае школьной олимпиады, идет проверка групп тестов, при прохождении каждой группы начисляется определенное количество баллов. Результат тестирования отправляется пользователю.

.2 Программная реализация изменений в базе данных системы

Для ввода изменений в базу данных, будем использовать IBExpert - это СУБД, имеющая графическую оболочку [9]. Для начала выполним регистрацию существующей базы данных в СУБД IBExpert, окно регистрации представлено на рисунке 3.1

Рисунок 3.1- Окно регистрации новой БД.

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

Рисунок 3.2- Ввод нового поля в таблицу STATUS.

В таблице TYPENAMES, нужно указать новый тип турнира. Для этого в поле TP_NAME добавим две новых строки - Всероссийская олимпиада школьников для русской версии сайта и All-Russian school olympiad для английской. Окно ввода новых значений поля TP_NAME показано на рисунке 3.3.

Рисунок 3.3- Ввод новых строк в таблицу TP_NAME.

Аналогично, в таблицу CONTTYPES потребуется добавить идентификатор нового типа турнира, это отображено на рисунке 3.4.

Рисунок 3.4- Добавление нового идентификатора в таблицу CONTTYPES.

Дальнейшие изменения в базе данных не требуется.

.3 Программная реализация изменений в веб-интерфейсе пользователя

Для формирования турнирной таблицы реализовано отдельное приложение на языке JAVA. Алгоритм работы в программы показан в обобщенном виде (см. Приложение 1). Суть работы алгоритма сводится к следующему, для начала администратору турнира необходимо сформировать два конфигурационных файла - problems.txt, в котором будут указаны идентификаторы решаемых задач, на рисунке 3.5 показан формат файла.

Рисунок 3.5- Формат файла problems.txt.

Второй конфигурационный файл - schoolkid.txt, в нем необходимо указать идентификаторы участников турнира, фамилию и имя. Формат файла представлен на рисунке 3.6.

Рисунок 3.6- Формат файла schoolkid.txt.

Программа считывает эти файлы и инициализирует внутренние переменные, после этого программа делает запрос к базе данных по идентификатору задачи и идентификатору участника олимпиады, на получение количества баллов у всех школьников. На основании полученных данных формируется и выводится турнирная таблица в формате html. В таблице указаны имена участников, номера олимпиадных задач, количество набранных баллов за эти задачи, суммарное количество баллов и места в турнирной таблице. Код программы показан в Приложении 2.

После всех изменений в базе данных, на странице добавления нового турнира появился вариант для школьной олимпиады, страница администратора показана на рисунке 3.7.

Рисунок 3.7- Страница добавления нового турнира после изменений в БД.

4. ТЕСТИРОВАНИЕ СИСТЕМЫ


Проведем тестовый турнир для проверки корректности вывода турнирной таблицы. В систему было загружено шесть тестовых задач с номерами 1630-1636 (номера будут указаны в турнирной таблице), для каждой задачи был составлено два конфигурационных файла - index.lst и points.lst. В index.lst указываются номера тестов, пример файла представлен на рисунке 4.1, в нем указано 8 тестов.

Рисунок 4.1 - формат файла index.lst.

В points.lst указываются баллы, которые получит участник олимпиады, если его программа корректно пройдет определенные тестовые наборы, на рисунке 4.2. показан пример такого файла, участник может получить 30 баллов за пройденные тесты, начиная с 1 по 5 и еще 70 баллов за тесты, начиная с 6 по 8.

Рисунок 4.2 - формат файла points.lst.

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

В турнире приняли участие шесть виртуальных участников, результат турнира показан на рисунке 4.3.

Рисунок 4.3 - Турнирная таблица.

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

5. РАЗРАБОТКА ДОКУМЕНТАЦИИ


.1 Разработка инструкции для участника олимпиад

Для участия в олимпиаде, пользователю рекомендуется выполнить нижеперечисленные шаги:

Нажать на вкладку «Турниры», расположенной в шапке сайта.

Пройти регистрацию нового участника турнира, кнопка для регистрации расположена в верхней правой части страницы.

Авторизоваться в системе, введя логин и пароль. Авторизация проходится в верхней правой части страницы.

Просмотреть список ожидаемых олимпиад и выбрать нужную, кликнув на кнопку «Register».

Когда олимпиада будет запущена, появится кнопка «Private page», для входа на персональную страницу участника олимпиада.

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

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

После отправки нужно обновить страницу, появится таблица с результатами проверки.

.2 Разработка инструкции для членов жюри

В школьной олимпиаде используется бальная система оценки решения задач.

За выполнение задачи участник может получить определенное количество баллов (обычно от 0 до 100). Количество набранных баллов зависит от качества написанного решения. Это определяется количеством тестовых подгрупп, которая прошла программа участника олимпиады.

Для оценки результата проведения олимпиады используется программа вывода турнирной таблицы. Для запуска достаточно запустить файл jrun.bat, в результате в папке появится html файл с турнирной таблицей.

.3 Разработка инструкции для администратора

Для модифицирования существующей системы, необходимо выполнить следующие действия.

В ядре системы заменить файл testing.cpp на предложенный новый, с последующей перекомпиляцией ядра.

В базе данных необходимо редактировать некоторые таблицы.

В таблицу STATUS добавить новое поле REPORT_VIEWED, тип CHAR(1).

Таблица TYPENAMES, в поле TP_NAME создать две новые строки «All-Russian school olympiad» для английского языка (en) и «Всероссийская олимпиада школьников» для русского языка (ru).

В таблице CONTTYPES добавить строку с новым id = 2.

Программа для вывода турнирной таблицы состоит из файлов: problems.txt, schoolkid.txt, Score.java, jrun.bat.

Problems.txt - должен хранить номера олимпиадных задач.

Schoolkid.txt - должен хранить id участника олимпиады, имя и фамилию. .java - программа для вывода турнирной таблицы.

Jrun.bat - для запуска программы.


ЗАКЛЮЧЕНИЕ


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

В ходе модернизации удалось реализовать:

·        Ввод нового типа турнира в интерфейсе пользователя.

·        Отдельную программу для вывода турнирной таблицы.

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

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

Не удалось реализовать следующие элементы:

·        Детализированный вывод результатов по тестированию на каждой тестовой подгруппе.

·        Ограничение на количество запрашиваемых детализированных отчетов.

·        Формирование турнирной таблицы с учетом запроса участника олимпиады на вывод детализированного отчета по результату проверки задачи.

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

практикум программирование модернизация олимпиада



Приложение 2. Код программы вывода турнирной таблицы


import java.sql.*;java.io.*;java.util.*;org.jsoup.*;org.jsoup.nodes.*;org.jsoup.select.*;class Score {

static class Schoolkid {

int id;

String name;

int solved;

Schoolkid(int id, String name) {

this.id = id;

this.name = name;

solved = 0;

}

static final Comparator<Schoolkid> mainComparator = new Comparator<Schoolkid>() {

@Override

public int compare(Schoolkid left, Schoolkid right) {

if (left.solved > right.solved) return -1;

if (left.solved < right.solved) return 1;

return left.name.compareTo(right.name);

}

};

};

public static void main(String[] args) throws Exception {

new Score().run();

}

void run() throws Exception {

// problems

Scanner in = new Scanner(new File("problems.txt"));

ArrayList<String> problems = new ArrayList<>();

StringBuilder prbList = new StringBuilder();

prbList.append('(');

while (in.hasNextInt()) {

String p = in.next();

problems.add(p);

if (p.charAt(0)>='0' && p.charAt(0)<='9') {

prbList.append(p);

prbList.append(',');

}

}

prbList.setCharAt(prbList.length() - 1, ')');

in.close();

// schoolkid -> names

in = new Scanner(new File("schoolkid.txt"));

ArrayList<Schoolkid> Schoolkids = new ArrayList<>();

StringBuilder schoolList = new StringBuilder();

schoolList.append('(');

while (in.hasNextInt()) {

int schoolId = in.nextInt();

String schoolName = in.nextLine();

Schoolkids.add(new Schoolkid(schoolId, schoolName));

schoolList.append(schoolId);

schoolList.append(',');

}

in.close();

schoolList.setCharAt(schoolList.length() - 1, ')');

// number of attempts

TreeMap<String, Integer> schoolPrb = new TreeMap<>();

Class.forName("org.firebirdsql.jdbc.FBDriver");

java.sql.Connection connection = DriverManager.getConnection("jdbc:firebirdsql:localhost/3050:c:/acm/db/acm.gdb", "SYSDBA", "masterkey");

Statement stmt = connection.createStatement();

try {

String query = "SELECT id_publ, id_prb, max(points) as score from status where id_publ in " +

schoolList + " and id_prb in " + prbList + " group by id_publ, id_prb";

ResultSet rs = stmt.executeQuery(query);

while (rs.next()) {

int id_publ = rs.getInt(1);

int id_prb = rs.getInt(2);

int score = rs.getInt(3);

String sp = id_publ + "|" + id_prb;

schoolPrb.put(sp, score);

}

} finally {

stmt.close();

// calculate solved for every Schoolkid

for (Schoolkid s : Schoolkids) {

for (String p : problems) {

String sp = s.id + "|" + p;

Integer score = schoolPrb.get(sp);

if (score != null && score > 0) {

s.solved += score;

}

}

}

Schoolkids.sort(Schoolkid.mainComparator);

// make result table

PrintWriter out = new PrintWriter(System.out);

out.println("<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=Windows-1251\"></head><body>");

out.println("<table border = 1 cellspacing = 0 cellpadding = 0>");

out.print("<tr height = 30><th>Участник</th>");

for (String p : problems) {

out.print("<th width = 40 align=center>" + p + "</th>");

}

out.println("<th>&nbsp;&nbsp;Баллы &nbsp;&nbsp;</th><th>&nbsp;&nbsp; Место &nbsp;&nbsp;</th></tr>");

int place = 0, solved = problems.size() * 100 + 1;

String bgcolor = "'f8f8f8'";

for (Schoolkid s : Schoolkids) {

if (s.solved < solved) {

place++;

solved = s.solved;

if (bgcolor.compareTo("'f8f8f8'") == 0) {

bgcolor = "'d0f0ff'";

} else {

bgcolor = "'f8f8f8'";

}

}

out.println("<tr height = 30 bgcolor = " + bgcolor + "><td>" + s.name + "</td>");

for (String p : problems) {

String sp = s.id + "|" + p;

Integer score = schoolPrb.get(sp);

if (score != null && score > 0) {

out.print("<td align = center>");

out.print(score);

out.print("</td>");

} else {

out.print("<td>&nbsp;</td>");

}

}

out.print("<td align = center>" + s.solved + "</td>");

out.print("<td align = center>" + place + "</td>");

out.println("</tr>");

}

out.println("</table>");

out.println("</body></html>");

out.close();

}

}

Приложение 3. Алгоритм проверки школьных тестов


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

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!