пятница, 14 декабря 2012 г.

Автоматизированная проверка программ

При проведении олимпиад по программированию возникает проблема проверки задач. Обычно используют простой способ запуска готовых программ с ручным вводом данных или с помощью тестовых файлов, а затем идет сравнение результатов с исходными.
Такой способ очень затруднителен. Можно написать bat-файл для быстрой проверки уже созданных exe-файлов (выполняемый код программы после компиляции) на готовых тестовых файлах типа inputNN.txt и outputNN.txt, при этом можно не использовать в программе чтение и вывод в файл. Для проверки совпадений используется стандартная программа ДОС для сравнения двух файлов fc.com.
rem taskb.bat name - вызов файла для программы name
echo %1 >test.txt
%1.exe <input01.txt >output.txt
fc.com output.txt output01.txt >>test.txt 

%1.exe <input02.txt >output.txt
fc.com output.txt output02.txt >>test.txt 

rem скопируйте две строчки столько раз, сколько нужно 
rem проверить тестов, например до 10:

%1.exe <input10.txt >output.txt
fc.com output.txt output10.txt >>test.txt

Если в программе используются входные и выходные файлы, то предварительно исходные файлы для ввода данных нужно перекопировать:
rem taskb.bat name
echo %1 >test.txt
copy input01.txt input.txt
%1.ex
fc.com output.txt output01.txt >>test.txt 

copy input02.txt input.txt
%1.ex
fc.com output.txt output02.txt >>test.txt 

rem скопируйте три строчки столько раз, сколько нужно 
rem проверить тестов, например до 10:

copy input10.txt input.txt
%1.ex
fc.com output.txt output10.txt >>test.txt

После этого просматриваем файл test.txt и ищем, сколько раз нашлось сочетание "различия не найдены". Это и будет результатом  - количество пройденных тестов.

Конечно это тоже "ручная проверка", но очень облегчает работу жюри. Но есть в этом и свои подводные камни, так например в программе на Паскале нельзя использовать модуль CRT и соответствующие вызовы процедур CLRSCR, ReadKey, а также нужно исключить пустые Readln, которые учащиеся оставляют для паузы. Кроме этого не все среды программирования создают exe-файл, например: PascalABC (можно воспользоваться компилятором FreePascal), QBasic (можно использовать Turbo Basic, но не очень помогает). При этом нужно проверять на время выполнения программы на каждом тесте. Как поступить в этом случае? Есть готовые системы проверки, которые можно заранее установить и провести проверку:
- contester (не учитывает проверки всех тестов)
- ejudje
- polygon (созданные туры и задачи размещаются на сайте informatics.mccme.ru)
- система проверки, разработанная Епанешниковым А. И.
Попробуйте и вы с помощью языка программирования создать свою программу проверки тестов (один студент в свое время так и сделал). Удачи!

Комментариев нет:

Отправить комментарий