3 Набор задач в системе тестирования

advertisement
Серия изданий
«Научно-образовательные и
научно-информационные
материалы
МГТУ им. Н.Э. Баумана —
национального
исследовательского
университета
техники и технологий»
Департамент образования города Москвы

Ассоциация московских вузов

Московский государственный технический университет
имени Н.Э. Баумана
Кафедра ИУ-9
«Теоретическая информатика и компьютерные технологии»
С.Ю. Скоробогатов, А.В. Макаров, А.Ю. Голубков
Научно-образовательный материал
Автоматизированная система тестирования
для проведения лабораторных работ
по курсам программирования
Москва
МГТУ им. Н.Э. Баумана
2011
1 Введение
Проведение лабораторных работ по курсам программирования требует от
преподавателя четырёх видов деятельности: составление условий задач; объяснение студентам общих принципов и алгоритмов решения задач; проверка правильности работы решений, предоставляемых студентами; анализ исходного
кода решений.
Составление условий задач целесообразно выполнять однократно во время постановки учебного курса. Этот род деятельности, тем самым, не нуждается
в автоматизации.
Объяснение принципов решения задач и анализ исходного кода не могут
быть автоматизированы на данном этапе развития науки и техники. Собственно,
эти два рода деятельности и должны составлять основную работу преподавателя во время проведения лабораторных работ. Если бы их удалось автоматизировать, это повлекло бы за собой отмирание профессии преподавателя.
Что касается проверки правильности предоставляемых студентами решений, то её не только можно, но и нужно проводить автоматически, потому что
проверка вручную по ряду причин не может быть качественно выполнена за разумное время. Во-первых, количество вариантов входных данных, на которых
проверяется программа, для качественной проверки должно быть весьма велико
(не менее нескольких десятков тестов, покрывающих различные частные случаи). Во-вторых, проверка того, что решение укладывается в рамки заданной
алгоритмической сложности и требований по памяти, связана с запуском решения на больших массивах входных данных, которые проблематично вводить
вручную. В-третьих, оценка правильности результата работы решения может
потребовать выполнения сложных вычислений, которые трудно провести в уме.
В настоящее время существует ряд программных средств, позволяющих
автоматизировать тестирование программ (ejudge и др.). К сожалению, эти
2
средства ориентированы в первую очередь на проведение олимпиад по программированию. Использование олимпиадных серверов тестирования для проведения лабораторных работ возможно, но связано с необходимостью менять
сложившийся формат лабораторных работ, превращая их в «соревнования» и
пытаясь так сконфигурировать правила проведения этих «соревнований» на
сервере, чтобы они вписывались в учебный процесс. Кроме этого, олимпиадное
программирование имеет ряд особенностей, отражённых в олимпиадных серверах тестирования и совершенно неприемлемых в практике преподавания.
Например, на соревнованиях по программированию принято скрывать тесты, то
есть участник соревнования не имеет возможности узнать, на каких входных
данных сломалась его программа.
В 2011 году сотрудниками кафедры ИУ-9 МГТУ им. Н.Э. Баумана была
разработана собственная автоматизированная система тестирования T-BMSTU
специально для проведения лабораторных работ по курсам программирования.
Система T-BMSTU реализована в виде распределённого программного комплекса, включающего в себя Web-сервер и несколько серверов тестирования. В
2011 году T-BMSTU была успешно применена для проведения лабораторных
работ по курсам «Алгоритмы и структуры данных» и «Практикум на ЭВМ».
3
2 Архитектура системы
На рисунке 1 показана диаграмма взаимодействия компонентов системы
T-BMSTU. Пользователь взаимодействует через Web-браузер по протоколу
HTTP с Web-сервером, который обеспечивает вход пользователя в систему,
отображение списка имеющихся в системе задач, показ условия выбранной задачи, отправку решения на один из серверов тестирования и отображение вердикта системы тестирования.
База
задач
Web-браузер
пользователя
HTTP
Web-сервер
Решение
Вердикт
Задача
Решение
База
решений
Компилятор
Исполняемый
файл
Кэш
задач
Результат
Тест
Сервер
тестирования
«Песочница»
Рис. 1 – Диаграмма взаимодействия компонентов системы
4
Web-сервер имеет базу задач, составляемую преподавателем. Задача
представляет собой совокупность условия в формате HTML и проверочных
данных. Проверочные данные в простейшем случае представляют собой набор
тестов. Под тестом мы будем понимать вариант входных данных, на которых
должно быть запущено решение, предоставляемое пользователем. Каждый тест
может сопровождаться правильным ответом, с которым сравнивается результат
выполнения решения. Если проверочные данные не содержат правильных ответов, то вместо ответов допускается включать в проверочные данные эталонное
решение. В этом случае подразумевается, что для каждого теста сервер тестирования будет запускать решение пользователя и эталонное решение, а затем
сравнивать результат выполнения обоих решений. Кроме этого, поддерживается
возможность включения в проверочные данные генератора тестов, который
представляет собой программу, запускаемую на сервере тестирования и порождающую набор тестов. В случае наличия генератора проверочные данные могут
вообще не содержать ни одного теста.
Каждое решение, отправляемое Web-серверу пользователем, сохраняется
в базе решений. Преподаватель имеет возможность изучения базы решений. В
будущем в систему T-BMSTU планируется встроить автоматический детектор
плагиата, который будет работать с базой решений, сравнивая между собой решения одной и той же задачи, присланные разными пользователями, и обнаруживая похожие решения.
Для проверки решений Web-сервер взаимодействует с одним или несколькими серверами тестирования. Получив решение от пользователя, Webсервер отправляет это решение и, если нужно, проверочные данные на один из
подключённых к нему серверов тестирования. Сервер тестирования прогоняет
решение через тесты, содержащиеся в проверочных данных или сгенерированные генератором тестов, сравнивает результаты выполнения решения с правильными ответами и выносит вердикт.
5
Так как проверочные данные могут быть весьма велики (десятки мегабайт
для одной задачи), нецелесообразно пересылать их всякий раз вместе с решением. Вместо этого на каждом сервере тестирования расположен кэш задач, в котором хранятся проверочные данные ко всем задачам, решения которых проверялись когда-либо на этом сервере. Web-сервер отправляет проверочные данные
задачи только по запросу сервера тестирования, когда тот обнаруживает, что
данная задача отсутствует в его кэше.
На одном компьютере с сервером тестирования должны быть установлены компиляторы всех языков, на которых могут быть написаны решения. В
данный момент поддерживаются три языка: ANSI C, C++ и Go. В ближайшем
будущем планируется добавление поддержки языков Pascal и Java. Получив
очередное решение, сервер тестирования запускает нужный компилятор и, в
случае успешной компиляции, получает исполняемый файл, который помещается в так называемую «песочницу». «Песочница» представляет собой защищённую площадку для безопасного управляемого запуска решений. Перед каждым запуском в «песочницу» помещается один из тестов, а после выполнения
решения из «песочницы» же извлекается результат работы решения. «Песочница» обеспечивает завершение выполнения решения в случае исчерпания лимита
по времени или по памяти, не даёт запускаемой программе обращаться к файловой системе компьютера, на котором работает сервер тестирования.
2.1 Web-интерфейс системы тестирования
Взаимодействие пользователя с системой тестирования начинается с
формы входа в систему, в которой пользователю предлагается ввести логин и
пароль и нажать кнопку «Войти».
После входа в систему пользователь оказывается на странице «Содержание», вверху которой расположены названия учебных курсов, а ниже размещаются таблицы, в которых перечислены задачи. Каждому учебному курсу соот6
ветствует одна таблица. Каждая таблица имеет шесть столбцов: столбец «Номер» содержит порядковые номера задач; столбец «Название» содержит названия задач; в столбцах «C», «C++» и «Go» располагаются отметки об успешном
прохождении решений, написанных на соответствующих языках программирования.
Названия задач являются ссылками на страницы задач. Каждая страница,
посвящённая задаче, содержит условие задачи, поле редактирования, в которое
можно поместить решение и кнопку «Проверить», нажатие на которую вызывает проверку решения. Вверху страницы находится ссылка «Содержание», позволяющая вернуться к спискам задач.
После выполнения проверки решения пользователь оказывается на странице «Результаты проверки», отображающей вердикт сервера тестирования.
Кроме того, на этой странице располагаются поля «Сообщения компилятора»,
«Входные данные последнего теста», «Ожидаемые результаты» и «Полученные
результаты». Вверху страницы находится кнопка «Вернуться к решению».
В отличие от рядового пользователя, преподавателю дополнительно доступна страница, отображающая статистику успеваемости студентов.
2.2 Структура задачи
Задача для автоматизированной системы тестирования оформляется в виде отдельного каталога, содержащего как информацию для отображения условия задачи через Web-интерфейс, так и средства для тестирования правильности решения, а именно: наборы тестов и правильных ответов, генератор тестов,
эталонное решение и программу проверки.
Генератор тестов, эталонное решение и программа проверки включаются
в задачу в виде исходных текстов на одном из языков программирования, поддерживаемых системой тестирования. В настоящее время это ANSI C, C++ и
7
Go. Язык, на котором написана та или иная программа, определяется расширением файла: «c» для ANSI C, «cpp» для C++ и «go» для языка Go.
Условие задачи находится в файле «text.html». Оно представлено в формате HTML и должно содержать три раздела: текст задачи, формат входных
данных и формат результата выполнения программы. При этом название задачи
в условии не указывается, а находится в отдельном файле «caption.txt».
Каждая задача должна сопровождаться хотя бы одним примером входных
и выходных данных. Примеры располагаются в подкаталоге «samples» в виде
файлов «01», «01.a», «02», «02.a» и т.д. Каждая пара файлов «xx», «xx.a» содержит входные данные и правильный результат работы решения задачи, соответственно.
Задача должна содержать либо набор тестов, либо генератор тестов, либо
и то, и другое одновременно.
Наборы тестов и правильных ответов располагаются в подкаталоге «tests»
в виде файлов «01», «01.a», «02», «02.a» и т.д. При этом правильные ответы могут отсутствовать, если задача включает эталонное решение.
Генератор тестов представляет собой исходный код программы, порождающей набор тестов и правильных ответов в виде файлов «01», «01.a», «02»,
«02.a» и т.д. Генератор располагается в файле с именем «generator.xxx», где
расширение «xxx» указывает язык программирования, на котором он написан.
Генератор может не порождать правильные ответы, если задача включает эталонное решение.
Исходный код эталонного решения располагается в файле с именем «etalon.xxx», где расширение «xxx» указывает язык программирования, на котором
оно написано. Эталонное решение необязательно, если набор тестов в подкаталоге «tests» и набор тестов, порождаемый генератором, содержат правильные
ответы.
8
Сервер тестирования имеет пять встроенных стратегий проверки правильности результата выполнения решения: стратегия побитового сравнения,
стратегия сравнения текста, стратегия сравнения лексем, стратегия сравнения
целых чисел и стратегия сравнения чисел с плавающей точкой.
Стратегия побитового сравнения включается, если задача содержит пустой файл с именем «BINARY». В этом случае результат выполнения решения
должен побитно совпадать с правильным ответом.
Стратегия сравнения текста включается, если задача содержит пустой
файл с именем «TEXT». В этом случае результат выполнения решения должен
совпадать с правильным ответом с точностью до маркеров перевода строки.
Стратегия сравнения лексем включается, если задача содержит пустой
файл с именем «SCAN». Сравнение осуществляется в два этапа. Сначала файл
результата выполнения решения и файл с правильным ответом разбиваются на
фрагменты, разделённые произвольным количеством пробельных символов
(пробелы, символы табуляции и перевода строки). Затем, если количество
фрагментов в обоих файлах совпадает, осуществляется побитовое сравнение соответствующих фрагментов из обоих файлов.
Стратегия сравнения целых чисел является развитием стратегии сравнения лексем. Фрагменты, на которые разбиваются результат выполнения решения и правильный ответ, дополнительно переводятся в целые числа произвольной разрядности. В случае успешного перевода происходит сравнение полученных целых чисел. Стратегия включается, если задача содержит файл с именем
«INTEGER», в котором в текстовом виде записано основание системы счисления от 2 до 36.
Стратегия сравнения чисел с плавающей точкой аналогична стратегии
сравнения целых чисел. Она включается, если задача содержит файл с именем
«FLOAT», в котором в текстовом виде записано количество значащих десятич-
9
ных разрядов. При сравнении используются 64-разрядные числа с плавающей
точкой.
Если встроенные стратегии не подходят для проверки правильности результата выполнения решения, то задача должна содержать отдельную программу проверки. Исходный код программы проверки располагается в файле с
именем «checker.xxx», где расширение «xxx» указывает язык программирования,
на котором она написана. Программа проверки должна считывать результат выполнения решения и правильный ответ из файлов «output» и «answer», выполнять сравнение и возвращать 0 в случае, если результат удовлетворяет правильному ответу, и 1 в противном случае.
2.3 Взаимодействие Web-сервера и сервера тестирования
Как Web-сервер, так и сервер тестирования написаны на языке Go и для
обмена сообщениями используют сетевые именованные типизированные каналы, реализованные в пакете netchan стандартной библиотеки языка Go. При
этом Web-сервер поддерживает работу сразу с несколькими серверами тестирования, что предоставляет возможность разворачивания системы тестирования
T-BMSTU на кластерной вычислительной системе.
Сервер тестирования сам инициирует соединение с Web-сервером. Для
этого он устанавливает соединение с каналом «setup», экспортируемым Webсервером. Канал «setup» направлен от Web-сервера к серверу тестирования. Из
него сервер тестирования считывает пакет Setup, структура которого описана в
таблице 1. В этом пакете записаны сгенерированные Web-сервером уникальные
имена трёх каналов, через которые будет осуществляться взаимодействие Webсервера и сервера тестирования. Получив имена каналов, сервер тестирования
устанавливает соединения с каждым каналом и переходит в режим ожидания
запроса на тестирование решения пользователя. Web-сервер содержит пул подключённых к нему серверов тестирования, и при получении решения от пользо10
вателя выбирает один из свободных серверов тестирования и отправляет ему
запрос.
Таблица 1 – Структура пакета Setup
Имя поля
Тип поля
Описание
QueryChanName
строка
Имя канала запросов
AnswerChanName
строка
Имя канала ответов
TaskChanName
строка
Имя канала проверочных данных
Канал запросов направлен от Web-сервера к серверу тестирования. Из него сервер тестирования получает пакеты Query, структура которых описана в
таблице 2. Каждый пакет описывает одно решение, отправленное на проверку.
Задача, соответствующая решению, определяется значением поля Uid. Это значение является ключом, по которому сервер тестирования получает проверочные данные из кэша задач. Сервер тестирования компилирует полученное решение с использованием компилятора, определяемого значением поля Language
запроса, и если компиляция прошла успешно, прогоняет решение через набор
тестов, используя для этого «песочницу». При этом каждый запуск решения
ограничен по времени выполнения и по объёму используемой оперативной памяти.
Отдельного обсуждения заслуживает поле Task в составе пакета Query.
Оно либо пусто, либо содержит массив байт, в котором находятся сжатые в
tar.gz проверочные данные для задачи. Web-сервер заполняет это поле только по
требованию сервера тестирования. Происходит это следующим образом: если
сервер тестирования не находит в кэше задач проверочные данных для задачи,
решение которой находится в запросе, он отправляет Web-серверу ответ, содержащий вердикт UNKNOWN_TASK, и тогда Web-сервер повторно отправляет запрос, заполнив в нём поле Task.
11
Таблица 2 – Структура пакета Query
Имя поля
Uid
Тип поля
Описание
64-разрядное
Уникальный идентификатор задачи
целое число
TimeLimit
MemoryLimit
32-разрядное
Максимальное время работы ре-
целое число
шения (в миллисекундах)
32-разрядное
Максимальный размер данных в
целое число
адресном пространстве процесса, в
котором запущено решение (в Кб)
32-разрядное
Идентификатор языка, на котором
целое число
написано решение
Solution
строка
Исходный код решения
Task
массив байт
Проверочные данные для задачи (в
Language
tar.gz)
Канал ответов направлен от сервера тестирования к Web-серверу. В него
сервер тестирования записывает свой вердикт в виде пакета Answer, структура
которого описана в таблице 3. Поле Result пакета Answer содержит код, описывающий вердикт сервера тестирования (таблица 4). Если решение успешно откомпилировалось, но не прошло какой-то тест, то данные этого теста также помещаются в пакет.
Таблица 3 – Структура пакета Answer
Имя поля
Result
Тип поля
32-разрядное
Описание
Код результата
целое число
CompilerOutput
строка
Сообщения компилятора
12
строка
FailedTest
Входные данные для теста, не
пройденного решением
строка
SolutionOutput
Ошибочный результат выполнения
решения
строка
RightOutput
Правильный результат для теста,
не пройденного решением.
Таблица 4 – Коды вердикта сервера тестирования
Код
OK
Описание
Компиляция
решения
выполнена
успешно, все тесты пройдены.
COMPILATION_ERROR
Решение не прошло компиляцию,
сообщения компилятора помещены
в поле CompilerOutput.
WRONG_ANSWER
Результат выполнения решения на
одном из тестов был проанализирован и признан ошибочным.
PRESENTATION_ERROR
Формат результата выполнения решения на одном из тестов неправилен и не может быть разобран сервером тестирования.
TIME_LIMIT_EXCEEDED
Выполнение решения на одном из
тестов было прервано из-за превышения лимита времени.
MEMORY_LIMIT_EXCEEDED Выполнение решения на одном из
тестов было прервано из-за превышения лимита памяти.
13
RUN_TIME_ERROR
В процессе выполнения решения на
одном из тестов произошла ошибка
времени выполнения.
INTERNAL_ERROR
Внутренняя ошибка сервера.
UNKNOWN_TASK
Проверочные данные для задачи отсутствуют в кэше задач.
2.4 Организация «песочницы»
Для безопасного управляемого запуска решений применяются четыре
утилиты ОС Linux: утилита «chroot» позволяет изолировать запускаемую программу внутри заданного каталога; утилита «su» запускает программу от имени
специального непривилегированного пользователя; утилита «ulimit» ограничивает ресурсы, доступные программе; утилита «time» измеряет время работы
программы.
Сервер тестирования работает от имени пользователя «root», потому что
только администратору операционной системы разрешено пользоваться утилитой «chroot». Решение задачи изолируется в каталоге «/var/chroot», который,
собственно, и является «песочницей». Это означает, что для решения этот каталог представляется корнем файловой системы, и поэтому доступ к элементам
файловой системы вне этого каталога становится невозможным.
«Песочница» содержит копии всех исполняемых файлов и библиотек, которые могут понадобиться запускаемому решению. Кроме того, в рамках «песочницы» создан непривилегированный пользователь «tbmstu», от имени которого запускается решение. Этому пользователю доступен для записи только каталог «/home/tbmstu» в рамках песочницы (реально «/var/chroot/home/tbmstu»).
Перед каждым запуском решения содержимое этого каталога стирается. Затем в
каталог помещается исполняемый файл решения, а также файл «input», содержащий входные данные очередного теста. Файл «input» направляется в стан14
дартный входной поток запускаемого решения, а стандартный выходной поток
перенаправляется в файл «output».
Когда решение поступает на сервер тестирования, оно компилируется, после чего осуществляется пробный запуск. Пробный запуск позволяет оценить
размер секций кода исполняемого файла решения. Этот размер прибавляется к
значению поля MemoryLimit пакета Query для получения максимального размера оперативной памяти, предоставляемой решению.
Выполнение решения для каждого теста осуществляется под контролем
утилиты «ulimit», которая не позволяет решению использовать больше памяти,
нежели посчитанный максимальный размер. Кроме того, утилита «ulimit» не
разрешает решению порождать дочерние процессы и создавать файлы, суммарный размер которых превышает 100 Мб.
Время выполнения решения контролируется самим сервером тестирования. Если решение на каком-то тесте работает вдвое дольше, чем указано в поле
TimeLimit пакета Query, сервер тестирования принудительно завершает выполнение решения. Сервер тестирования задаёт грубую верхнюю границу времени
выполнения приложения, потому что неспособен производить точное измерение времени.
За точное измерение времени выполнения решения отвечает утилита
«time». Если решение не было принудительно завершено сервером тестирования, то время, измеренное, утилитой «time», умножается на поправочный коэффициент, зависящий от производительности компьютера, на котором запущен
сервер тестирования, сравнивается со значением TimeLimit, и, в случае превышения этого значения, выносится вердикт с кодом TIME_LIMIT_EXCEEDED.
Из-за того что организация «песочницы» требует активного использования утилит ОС Linux, сервер тестирования не может работать в ОС Windows.
Однако, предположительно, его можно развернуть на FreeBSD и MacOS X.
15
3 Набор задач в системе тестирования
В 2011 году для автоматизированной системы тестирования T-BMSTU
был подготовлен набор задач. При этом проверочные данные для тридцати задач были разработаны сотрудниками кафедры ИУ-9, а две задачи были импортированы из системы ejudge.
Для учебного курса «Алгоритмы и структуры данных» были подготовлены задачи, решение которых охватывает темы, рассмотренные в процессе чтения лекций по курсу:
1. Сумма чисел, кратных 3 или 5.
Предлагается составить программу, вычисляющую сумму натуральных
чисел от 1 до 1000, кратных 3 или 5.
2. Сумма чётных чисел Фибоначчи.
Нужно составить программу, вычисляющую сумму чётных чисел
Фибоначчи, не превышающих 4000000.
3. Наибольший простой делитель.
Необходимо составить программу, вычисляющую наибольший простой делитель заданного числа.
4. Наибольший палиндром.
Предлагается составить программу, выполняющую поиск наибольшего
палиндрома, полученного путём умножения двух трёхзначных чисел.
5. Пифагорова тройка.
Нужно найти пифагорову тройку, сумма которой равна заданному числу.
6. Делители треугольного числа.
Необходимо составить программу, вычисляющую наименьшее треугольное число, имеющее заданное количество делителей.
7. Обращение массива.
16
Предлагается составить функцию, переставляющую элементы любого
массива в обратном порядке.
8. Операции с матрицами.
Нужно составить программу, реализующую операции сложения и
умножения матриц.
9. Максимальный элемент.
Необходимо составить функцию, вычисляющую индекс первого максимального элемента в произвольном массиве.
10. Поиск делением пополам.
Требуется составить программу, выполняющую поиск заданного числа
в массиве целых чисел, отсортированном по возрастанию, методом деления пополам.
11. Подсчёт слов в строке.
Предлагается составить программу, вычисляющую количество слов в
строке при условии, что слова разделяются одним или несколькими
пробелами.
12. Транспонирование матрицы.
Нужно составить функцию, выполняющую транспонирование целочисленной матрицы произвольного размера.
13. Рисование рамки.
Необходимо составить программу, выполняющую рисование рамки заданного размера вокруг текстовой строки.
14. Конкатенация строк.
Требуется составить функцию, выполняющую конкатенацию произвольного количества строк.
15. Периодическая строка.
17
Нужно составить программу, которая определяет, является ли введённая из стандартного потока ввода строка периодической, то есть представляющей собой повторение два или более раз некоторой подстроки.
16. Поиск в упорядоченной матрице.
Предлагается составить программу, выполняющую поиск заданного
числа в целочисленной матрице произвольного размера, элементы которой отсортированы по возрастанию как по строкам, так и по столбцам.
17. Сортировка вставками.
Предлагается составить функцию, выполняющую сортировку произвольного массива методом вставок.
18. Сортировка Шелла.
Нужно составить программу, выполняющую сортировку массива строк
методом Шелла.
19. Сортировка пузырьком.
Необходимо составить программу, осуществляющую сортировку массива целых чисел в порядке убывания количества разрядов в десятичной записи числа. Программа должна реализовывать модифицированный двунаправленный пузырьковый алгоритм.
20. Сортировка подсчётом сравнений.
Предлагается составить программу, выполняющую сортировку слов в
предложении методом подсчёта сравнений.
21. Пирамидальная сортировка.
Нужно составить функцию, выполняющую пирамидальную сортировку произвольного массива.
22. Сортировка слиянием и вставками.
Необходимо составить программу, осуществляющую сортировку массива целых чисел в порядке возрастания. В программе должен быть ре18
ализован алгоритм сортировки слиянием, рекурсивную функцию которого нужно модифицировать таким образом, чтобы для коротких последовательностей выполнялась сортировка вставками.
23. Быстрая сортировка и сортировка прямым выбором.
Необходимо составить программу, осуществляющую сортировку массива целых чисел в порядке убывания. В программе должен быть реализован алгоритм быстрой сортировки, рекурсивную функцию которого нужно модифицировать таким образом, чтобы для коротких последовательностей выполнялась сортировка прямым выбором.
24. Сортировка букв в строке.
Нужно составить программу, осуществляющую сортировку латинских
букв в строке в алфавитном порядке. В программе должен быть реализован алгоритм сортировки распределением.
25. Поразрядная сортировка дат.
Необходимо составить программу, осуществляющую сортировку последовательности дат по возрастанию. В программе должен быть реализован алгоритм поразрядной сортировки, адаптированный для случая, когда ключи представляются в системе счисления с основаниями,
зависящими от разряда.
26. Поразрядная сортировка целых чисел.
Требуется составить программу, осуществляющую сортировку последовательности 32-разрядных целых чисел со знаком по возрастанию. В
программе должен быть реализован алгоритм поразрядной сортировки.
27. Периодические префиксы.
Предлагается составить программу, выполняющую поиск всех периодических префиксов заданной строки.
28. Поиск всех вхождений подстроки в строку (КМП).
19
Нужно составить программу, осуществляющую поиск всех вхождений
подстроки S в строку T. В программе должен быть реализован алгоритм Кнута-Морриса-Пратта, изменённый таким образом, чтобы при
нахождении очередного вхождения S в строку T алгоритм не завершался, а продолжал сканировать строку T.
29. Поиск всех вхождений подстроки в строку (Бойер-Мур).
Необходимо составить программу осуществляющую поиск всех вхождений подстроки S в строку T. В программе должен быть реализован
алгоритм Бойера-Мура.
30. Расширенная эвристика стоп-символа.
Требуется составить функцию, осуществляющую поиск первого вхождения подстроки S в строку T. В программе должен быть реализован
вариант алгоритма Бойера-Мура, в котором не используется эвристика
совпавшего суффикса, а эвристика стоп-символа расширена.
31. Порождение языка по грамматике.
Нужно составить программу, выполняющую порождение всех возможных предложений, длина которых не превышает n, для языка, определяемого заданной КС-грамматикой.
32. LL(1)-грамматика.
Предлагается составить программу, которая по КС-грамматике вычисляет множества FIRST и FOLLOW для нетерминальных символов и
определяет, является ли эта КС-грамматика LL(1)-грамматикой.
33. Арифметическое выражение
Нужно составить программу, вычисляющую значение скобочного
арифметического выражения, введённого из стандартного потока ввода.
34. Нерекурсивная быстрая сортировка.
20
Требуется составить программу, осуществляющую сортировку массива
целых чисел в порядке возрастания. В программе должен быть реализован нерекурсивный алгоритм быстрой сортировки, использующий в
своей работе стек заданий.
35. Кольцевой буфер.
Предлагается реализовать основные операции над очередью, представленной в виде кольцевого буфера, динамически растущего при переполнении.
36. Очередь с операцией Maximum.
Нужно реализовать через двойной стек набор операций Enqueue,
Dequeue, QueueEmpty и Maximum для работы с очередью целых чисел.
Операции Enqueue, QueueEmpty и Maximum должны работать за константное время, а операция Dequeue -- за амортизированное константное время.
37. Слияние отсортированных массивов.
Необходимо составить программу, объединяющую k отсортированных
по возрастанию массивов целых чисел в один отсортированный массив
за время O(n lg k), где n – общее количество элементов во всех входных
массивах. Для слияния массивов нужно воспользоваться очередью с
приоритетами.
38. Моделирование работы вычислительного кластера.
Предлагается составить программу, моделирующую параллельное выполнение большого количества заданий на кластерной вычислительной
системе.
39. Сортировка списка вставками.
Нужно составить программу, выполняющую сортировку двунаправленного кольцевого списка целых чисел по возрастанию. В программе
должен быть реализован алгоритм сортировки вставками.
21
40. Переворачивание списка.
Требуется реализовать операцию переворачивания для однонаправленного списка строк. Алгоритм переворачивания должен использовать в
своей работе стек элементов списка.
41. Сортировка списка пузырьком.
Необходимо составить программу, выполняющую сортировку однонаправленного списка. В программе должен быть реализован алгоритм
сортировки пузырьком.
42. Ранги элементов в списке с пропусками.
Предлагается реализовать операцию Rank, которая вычисляет порядковый номер элемента списка с пропусками в среднем за логарифмическое время.
43. Ранги вершин бинарного дерева поиска.
Нужно реализовать для бинарного дерева поиска операцию SearchByRank, которая возвращает вершину дерева с заданным номером в
отсортированной по ключу последовательности входящих в дерево
вершин.
44. Построение сбалансированного бинарного дерева поиска.
Требуется разработать нерекурсивный алгоритм, выполняющий построение имеющего минимально возможную высоту бинарного дерева
поиска, содержащего все числа из данного отсортированного по возрастанию массива целых чисел.
45. Разреженный массив.
Необходимо реализовать основные операции над разреженными массивами, представленными в виде бинарных деревьев поиска.
Для учебного курса «Практикум на ЭВМ» набор задач выглядит следующим образом:
1. Flip Game.
22
Требуется составить программу, которая находит минимальное количество ходов, за которое можно решить головоломку.
2. Решение СЛАУ методом Гаусса.
Нужно составить программу, выполняющую решение системы линейных алгебраических уравнений методом Гаусса в рациональных числах.
3. Минимальный путь на карте.
Требуется составить программу, вычисляющую минимальную длину
пути на карте от одной точки до другой.
4. Сопоставление с образцом.
Предлагается составить программу, считывающую из стандартного потока ввода объектное выражение языка Рефал и образец и вычисляющую количество решений сопоставления этого выражения с образцом.
5. Вычисление выражений в польской записи.
Необходимо составить программу, вычисляющую значение выражения
в польской записи с использованием рекурсии.
6. Экономное вычисление выражений в польской записи.
Нужно составить программу, вычисляющую количество операций, которые нужно выполнить для экономного вычисления выражения в
польской записи.
7. Параллельное экономное вычисление выражений в польской записи.
Требуется составить программу, вычисляющую минимальное количество тактов, за которое вычислитель с заданным количеством параллельно работающих вычислительных ядер выполнит экономное вычисление выражения в польской записи.
8. Копирующий сборщик мусора.
23
Необходимо составить программу, которая моделирует работу сборщика мусора. Алгоритм сборщика мусора должен иметь линейную
сложность и сохранять порядок следования блоков памяти.
9. Вычисление длинных выражений в польской записи.
Нужно составить программу, вычисляющую значение выражения в
польской записи без использования рекурсии.
10. Перевод последовательности кодовых точек в UTF-8.
Предлагается составить программу, выполняющую перевод последовательности кодовых точек в стандарте Unicode в форму кодирования
текста UTF-8.
11. Перевод из UTF-8 в последовательность кодовых точек.
Требуется составить программу, выполняющую перевод массива байт,
представляющего образ текста в UTF-8, в последовательность кодовых
точек в стандарте Unicode.
12. Идеальный путь.
Необходимо составить программу, которая вычисляет специальным
образом определённый путь из одной комнаты лабиринта до другой.
13. Выравнивание.
Нужно разработать модуль выравнивания текста для гипотетического
текстового редактора.
24
4 Заключение
Разработанная на кафедре ИУ-9 автоматизированная система тестирования T-BMSTU была успешно внедрена в учебный процесс в 2011 году.
Автоматизированная система позволила не только повысить качество
проверки лабораторных работ по курсам «Алгоритмы и структуры данных» и
«Практикум на ЭВМ», но и способствовала накоплению больших массивов задач и тестов, усиливая тем самым методическое обеспечение этих курсов.
В будущем планируется расширение системы для поддержки большего
количества языков программирования, а также разработка наборов задач и тестов для других учебных курсов.
25
Download