Из опыта создания универсальных тестовых редакторов
; Write(c,'&'); {запись в файл конца ввода}
Window(55,10,80,15);
TextBackGround(cyan); {окно правильного ответа}
clrscr;
Write('Правильный ответ: ');
Readln(b); {ввод правильного ответа}
Writeln(u,b);
End;
close(u); {закрытие файлов и окон}
Reset(u);
Readln(u);
close(c);
Window(55,10,80,15);
TextBackGround(black);
clrscr;
End;
В этой, как и в других функциях, работающих с файлами, я столкнулся с
проблемой записи тестов в файлах. Во-первых, я решил разделить сам тест и
ответы к нему. Тест находится в файле с расширением qs, а ответы к нему- в
файле с расширением qso. Второй проблемой стала остановка чтения вопроса,
ведь вопросы должны выводиться не подряд, а по очереди. В связи с этим я
использовал символ «&» в конце каждого вопроса и указал программе читать до
этого символа, но сам символ не выводить. Можно было использовать счетчик
строк, который останавливает программу после прочтения двух строк (вопрос и
варианты ответов), но в случае сбоя тест приходит в негодность. Далее
требовалось разместить данные о названии теста, количестве вопросов, пароле
и т. п. Я разместил их по этим двум файлам. Опытные программисты заметят:
зачем было использовать текстовые файлы, ведь можно было применить работу с
типом «запись» и сохранять данные в нетипизированных файлах, и шифровщик бы
не потребовался. Действительно, но использование типа «запись» не позволяет
создавать тесты с динамическим числом ответов на вопрос. Это возможно лишь
путем использования в записи динамического массива. Но это сделает работу с
файлом очень сложной а сам файл будет занимать много места на диске по
сравнению с обычным текстовым.
Естественно, что при поиске файла программа может его не найти, в этом
случае выдается ошибка поиска. Требовалось ее обойти, выдавая собственное
сообщение программы. Это осуществляется следующим образом: задается
директива компиллятора на его отключение $I-, проверяется нулевой результат
IORESULT=0, выдается сообщение и компиллятор включается снова $I+. Я
использовал эту функцию компиллятора там, где необходимо осуществить поиск
файла. Такая функция обхода компилятора называется обработкой сообщений и
является составляющей объектного програмимирования.
Функция открытия теста выглядит сложнее. Она открывает указанный файл,
считывает сначала пароль входа и запрашивает его, затем приступает к
выполнению теста. На экран выводится вопрос и ожидается ввод цифры
правильного ответа. Причем включается таймер и по завершении работы с
тестом или по истечении времени программа выходит из данной функции и
передает управление подпрограмме подсчета результатов и регистрации:
Procedure OpenF;
label l1;
Var f1:string; {объявление локальных переменных}
Begin
p:=0;
Window(10,10,53,15);
TextBackGround(black);
TextColor(black);
clrscr;
Window(20,10,66,15); {начальное окно}
TextBackGround(blue);
clrscr;
Writeln('какой файл открыть ');
Readln(a); {ввод пути к файлу без расширения}
a:=a+'.ts'; {прибавление расширения}
Assign(c,a); {связь переменной с файлом вопросов}
f1:=a;
a:=a+'o'; {изменение расширения}
Assign(u,a); {связь переменниой с файлом ответов}
delete(a,length(a),1);
Assign(b1,'c:pascalregistr.dat'); {связь переменной с файлом
отчета}
Append(b1); {открытие файла отчета для дозаписи}
Reset(c); {открытие файла вопросов для чтения}
Window(20,10,66,15); {закрытие начального окна}
TextBackGround(black);
clrscr;
Reset(u);
Read(c,b); {считывание пароля}
Readln(c,b);
z:=ord(b)-ord('0'); {установка времени}
z1:=z;
Window(10,10,40,12); {окно пароля}
TextBackGround(magenta);
clrscr;
Readln(u,a);
If length(a)>2 Then Begin{проверка наличия в файле пароля}
Write('введите пароль ');
Readln(f); {ввод пароля}
If a<>f Then Begin
Write('пароль неверный');
GoTo l1; {выход из процедуры}
End;
End
else Begin
close(u);
Reset(u);
End;
 
| | скачать работу |
Из опыта создания универсальных тестовых редакторов |