понедельник, 17 октября 2011 г.

Проверка задач на тестовых файлах

Часто возникает необходимость проверки своих задач на уже готовых тестовых файлах. Для этого приходится неоднократно проводить рутинную работу: изменять имя файла, запускать программу на выполнение и сравнение двух файлов. Последнее требует иногда написание дополнительной программы для сравнения файлов по-символьно. Все это занимает уйму времени. А хочется побыстрее. Предлагаемый мною вариант я использую для проверки программ на школьных олимпиадах.
Итак, у вас есть файлы, например: input1.txt, output1.txt, input2.txt, output2.txt, ..., input10.txt, output10.txt для какой-то задачи. И есть исходный код программы programA, ориентированный на ввод и вывод в файлы input.txt, output.txt (или другие имена, на самом деле это не важно). Нужно предварительно его скомпилировать и получить exe-файл. Кроме этого рассмотрим два варианта:
1) ввод-вывод осуществлен с помощью файлов
2) ввод-вывод осуществлен через стандартный консоль ввода-вывода: клавиатура и монитор.
Все файлы должны быть в одном каталоге.
Пишем bat-файлы:
rem taskA.bat
rem создаем файл для отчета
echo %1 >test.txt
rem организуем цикл по всем тестам от 1 до 10
for %%a in (1 2 3 4 5 6 7 8 9 10) do call bat1.bat %1 %%a

ren bat1.bat
rem копируем  исходный тестовый файл как input.txt
copy input%2.txt input.txt
rem если 1-й вариант, просто запускаем файл
%1.exe
rem если 2-й вариант, то 
%1.exe <input.txt >output.txt
rem  сравниваем два файла с помощью fc.exe 
rem  и выводим результат проверки в файл для отчета
rem  вместо fc.exe можно поставить свою программу 
rem  для проверки двух файлов
echo %2: >>test.txt
fc.exe output%2.txt output.txt >>test.txt

Далее запускаем из командной строки
C:\>taskA.bat programA
И смотрим файл test.txt. Если отличий не найдено, то будет выведено сообщение "различия не найдены". Сколько таких сообщений, столько и верно пройденных тестов. Можно подготовить несколько файлов для разных задач taskB.bat, taskC.bat  и т. д., изменив только числа в скобочках в строке for - это номера тестов. Тогда проверка файлов занимает меньше времени. Но таким образом нельзя проверить на время выполнения, только на правильность прохождения тестов.
Буду рада, если кому-то мои знания помогут!

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

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