При использовании заданий групп Exam сохраняются основные особенности задачника: автоматическое предоставление программе учащегося исходных данных и автоматическая проверка правильности предложенного решения. Следует отметить, что эти особенности оказываются наиболее полезными при решении задач повышенной сложности (группа ExamTaskC), так как в них, как правило, должны использоваться наборы исходных данных большого размера.
При выполнении заданий групп Exam учащийся должен обеспечивать надлежащее форматирование выходных данных (в других группах заданий это не требуется, поскольку средства вывода электронного задачника выполняют форматирование автоматически).
Отказ от использовании специальных средств ввода-вывода приводит к тому, что любые ошибки ввода-вывода уже не обрабатываются задачником и обычно приводят к сообщениям об ошибке времени выполнения. Это обстоятельство несколько затрудняет поиск ошибок, но в то же время позволяет приблизить его к реальному процессу отладки программы, не использующему подсказки" задачника.
Модуль PT4
Описанные в данном разделе типы и процедуры будут доступны в программе, если к ней с помощью оператора uses подключен модуль PT4 (см. пример программы, использующей задачник Programming Taskbook). Дополнительные типы данных PNode и TNode
type
PNode = ^TNode;
TNode = record
Data: integer;
Next: PNode;
Prev: PNode;
Left: PNode;
Right: PNode;
Parent: PNode;
;
Типы PNode и TNode используются в заданиях групп Dynamic и Tree. В заданиях на стеки и очереди (Dynamic1-Dynamic28) при работе с записями типа TNode используются только поля Data и Next; в заданиях на двусвязные списки (Dynamic29-Dynamic80) используются поля Data, Next и Prev. В большинстве заданий на бинарные деревья (группа Tree) используются поля Data, Left и Right; в заданиях на обработку бинарных деревьев с обратной связью (Tree48-Tree56 и Tree70-Tree71) дополнительно используется поле Parent.
Все исходные и результирующие данные-указатели в заданиях имеют тип PNode; их ввод и вывод должен осуществляться с помощью процедур GetP и PutP (в системе PascalABC.NET указатели, как и другие данные, можно получать из задачника и передавать ему с помощью стандартных процедур ввода-вывода read и write).
В программе учащегося не следует повторно описывать типы PNode и TNode.
Процедура инициализирует задание с именем Name. Она должна вызываться в начале программы, выполняющей это задание (до вызова процедур ввода-вывода). Если в программе, подключившей модуль PT4, не указана процедура Task, то при запуске программы будет выведено окно с сообщением Не вызвана процедура Task с именем задания".
Имя задания Name должно включать имя темы и порядковый номер в пределах темы (например, 'Begin3'). Регистр букв в имени темы может быть произвольным. Если указана неверная тема задания, то программа выведет сообщение об ошибке, в котором будут перечислены названия всех имеющихся тем. Если указан недопустимый номер задания, то программа выведет сообщение, в котором будет указан диапазон допустимых номеров для данной темы. Если после имени задания в параметре Name указан символ ? (например, 'Begin1?'), то программа будет работать в демонстрационном режиме.
Начиная с версии 4.8, процедура Task может также использоваться для генерации и вывода на экран html-страницы с текстом задания или группы заданий. Для этого необходимо указать в качестве параметра Name имя конкретного задания или группы заданий и символ #, например, 'Begin3#' или 'Begin#'. Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся в разделе, посвященном демонстрационному режиму задачника.
Если при первом вызове процедуры Task в параметре не указывается символ #, то все последующие вызовы процедуры Task игнорируются. Если при первом вызове процедуры Task в параметре указывается символ #, то игнорируются все последующие вызовы процедуры Task, не содержащие этот символ. С помощью нескольких вызовов процедуры Task, содержащей в параметре символ #, можно обеспечить генерацию html-страницы с описанием нескольких групп заданий, причем в каждой группе при этом можно отображать только некоторые задания.
procedure GetB(var X: boolean);
procedure GetC(var X: char);
procedure GetN(var X: integer);
procedure GetR(var X: real);
procedure GetS(var X: string);
procedure GetP(var X: PNode);
Процедуры обеспечивают ввод исходных данных в программу, выполняющую учебное задание. Они должны вызываться после вызова процедуры Task; в случае их вызова до вызова процедуры Task при запуске программы будет выведено сообщение об ошибке В начале программы не вызвана процедура Task с именем задания".
Используемая процедура ввода должна соответствовать типу очередного элемента исходных данных; в противном случае выводится сообщение об ошибке Неверно указан тип при вводе исходных данных" (такое сообщение будет выведено, например, если очередной элемент данных является символом, а для его ввода используется процедура GetN).
При попытке ввести больше исходных данных, чем это предусмотрено в задании, выводится сообщение об ошибке Попытка ввести лишние исходные данные". Если исходные данные, необходимые для решения задания, введены не полностью, то выводится сообщение "Введены не все требуемые исходные данные".
При использовании задачника в системе PascalABC.NET вместо процедур группы Get можно использовать обычные процедуры ввода read. procedure PutB(X: boolean);
procedure PutC(X: char);
procedure PutN(X: integer);
procedure PutR(X: real);
procedure PutS(X: string);
procedure PutP(X: PNode);
Процедуры обеспечивают вывод на экран результирующих данных, найденных программой, и их сравнение с контрольными данными (то есть с правильным решением). Как и процедуры группы Get, эти процедуры должны вызываться после вызова процедуры Task; в противном случае при запуске программы будет выведено сообщение об ошибке «В начале программы не вызвана процедура Task с именем задания».
В отличие от процедур группы Get, в качестве параметра процедур группы Put можно указывать не только переменные, но и выражения (в частности, константы соответствующего типа). Используемая процедура должна соответствовать типу очередного элемента результирующих данных, в противном случае выводится сообщение об ошибке «Неверно указан тип при выводе результатов».
Как и в случае процедур группы Get, при вызовах процедур группы Put программа осуществляет контроль за соответствием количества требуемых и выведенных результирующих данных. Если программа выведет недостаточное или избыточное количество результирующих данных, то после проверки этих данных появится сообщение «Выведены не все результирующие данные» или, соответственно, «Попытка вывести лишние результирующие данные».