Вспомогательные типы и процедуры задачника
Описанные на данной странице типы и процедуры будут доступны в программе,
если к ней с помощью оператора uses подключен модуль PT4.
Инициализация заданий, ввод-вывод данных
procedure Task(Name: string);
Процедура инициализирует задание с именем Name. Она должна вызываться в
начале программы, выполняющей это задание (до вызова процедур ввода-вывода
GetPut). Если в программе, подключившей модуль PT4, не указана процедура
Task, то при запуске программы будет выведено окно с сообщением «Не
вызвана процедура Task с именем задания».
Имя задания Name должно включать имя группы заданий и порядковый номер в
пределах группы (например, 'Begin3'). Регистр букв в имени группы может быть
произвольным. Если указана неверная группа, то программа выведет сообщение об
ошибке, в котором будут перечислены названия всех имеющихся групп. Если указан
недопустимый номер задания, то программа выведет сообщение, в котором будет
указан диапазон допустимых номеров для данной группы. Если после имени задания
в параметре Name указан символ «?» (например, 'Begin3?'), то
программа будет работать в демонстрационном режиме.
Начиная с версии 4.8, процедура Task может также использоваться для
генерации и вывода на экран html-страницы с текстом задания или группы заданий.
Для этого необходимо указать в качестве параметра Name имя конкретного задания или группы
заданий и символ «#», например, 'Begin3#' или
'Begin#'. Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся
в разделе, посвященном демонстрационному режиму задачника.
Если процедура Task вызывается в программе несколько раз, то все
последующие ее вызовы игнорируются. Исключением является ситуация, когда
процедура используется для генерации html-страницы с описанием нескольких заданий или групп
заданий; в этом случае учитываются все вызовы данной процедуры.
procedure GetB(var A: boolean);
procedure GetN(var A: integer);
procedure GetR(var A: real);
procedure GetC(var A: char);
procedure GetS(var A: string);
procedure GetP(var A: PNode);
Процедуры обеспечивают ввод исходных данных в программу, выполняющую
учебное задание. Они должны вызываться после вызова процедуры Task; в случае их
вызова до вызова процедуры Task при запуске программы будет выведено сообщение
об ошибке «В начале программы не вызвана процедура Task с именем
задания».
Используемая процедура ввода должна соответствовать типу очередного
элемента исходных данных; в противном случае выводится сообщение об ошибке
«Неверно указан тип при вводе исходных данных» (такое сообщение
будет выведено, например, если очередной элемент данных является символом, а для
его ввода используется процедура GetN).
При попытке ввести больше исходных данных, чем это предусмотрено в
задании, выводится сообщение об ошибке «Попытка ввести лишние исходные
данные». Если исходные данные, необходимые для решения задания, введены
не полностью, то выводится сообщение «Введены не все требуемые исходные
данные».
При выполнении заданий в средах Pascal ABC и PascalABC.NET для ввода исходных данных
можно использовать стандартную процедуру Read (с любым количеством параметров).
procedure PutB(A: boolean);
procedure PutN(A: integer);
procedure PutR(A: real);
procedure PutC(A: char);
procedure PutS(A: string);
procedure PutP(A: PNode);
Процедуры обеспечивают вывод на экран результирующих данных, найденных
программой, и их сравнение с контрольными данными (т. е. с правильным
решением). Как и процедуры группы Get, эти процедуры должны вызываться после
вызова процедуры Task; в противном случае при запуске программы будет выведено
сообщение «В начале программы не вызвана процедура Task с именем
задания».
В отличие от процедур группы Get, в качестве параметра процедур группы Put
можно указывать не только переменные, но и выражения (в частности, константы
соответствующего типа). Используемая процедура должна соответствовать типу
очередного элемента результирующих данных, в противном случае выводится
сообщение об ошибке «Неверно указан тип при выводе результатов».
Как и в случае процедур группы Get, при вызовах процедур группы Put
программа осуществляет контроль за соответствием количества требуемых и
выведенных результирующих данных. Если программа выведет недостаточное или
избыточное количество результирующих данных, то после проверки этих данных
появится сообщение «Выведены не все результирующие данные» или,
соответственно, «Попытка вывести лишние результирующие данные».
При выполнении заданий в средах Pascal ABC и PascalABC.NET для вывода результатов
можно использовать стандартную процедуру Write (с любым количеством параметров).
Работа с динамическими структурами
type
PNode = ^TNode;
TNode = record
Data: Integer;
Next: PNode;
Prev: PNode;
Left: PNode;
Right: PNode;
Parent: PNode;
end;
Типы PNode и TNode используются в заданиях групп Dynamic
и Tree. В заданиях на
стеки и очереди (Dynamic1Dynamic28) при работе с записями типа TNode
используются только поля Data и Next; в заданиях на двусвязные списки
(Dynamic29Dynamic80) используются поля Data, Next и Prev. В большинстве заданий на
бинарные деревья (группа Tree) используются поля Data, Left и Right;
в заданиях на обработку бинарных деревьев с обратной связью
(Tree48Tree56 и Tree70Tree71) дополнительно используется поле Parent.
Все исходные и результирующие данные-указатели в заданиях имеют тип
PNode; их ввод и вывод должен осуществляться с помощью процедур GetP и PutP.
В программе учащегося не следует повторно описывать типы PNode и TNode.
procedure Dispose(var P: PNode);
Данная процедура переопределяет стандартную процедуру Dispose. Ее
использование позволяет контролировать действия учащегося по освобождению
памяти при выполнении заданий групп Dynamic и Tree
(см. выше описание типа PNode).
Вывод отладочной информации
Описываемые далее отладочные средства появились в версии 4.9 задачника Programming Taskbook.
С их помощью можно выводить отладочную информацию
непосредственно в окно задачника (в специальный раздел отладки).
procedure Show(S: string);
Отображает текстовую строку S в разделе отладки окна задачника.
Если текущая экранная строка в разделе отладки уже содержит некоторый текст, то
строка S снабжается начальным пробелом и приписывается к этому тексту,
за исключением случая, когда при таком приписывании размер
полученного текста превысит ширину области данных (равную 80 символам).
В последнем случае вывод строки S осуществляется с начала
следующей экранной строки; если же и в этой ситуации строка S превысит
ширину области данных, то строка S будет выведена на нескольких
экранных строках, причем разрывы текста будут выполняться по
пробельным символам строки S, а при отсутствии пробелов при
достижении очередного фрагмента строки длины, равной 80.
Строка S может содержать явные команды перехода на новую
экранную строку. В качестве таких команд можно использовать или
символ с кодом 13 («возврат каретки»), или символ с кодом 10 («переход на новую
строку»), или их комбинацию в
указанном порядке (#13#10).
procedure Show([S: string;] A: integer[; W: integer]);
procedure Show([S: string;] A: real[; W: integer]);
Перегруженные варианты процедуры Show, предназначенные для вывода числовых отладочных данных.
Использование этих вариантов позволяет максимально упростить действия
учащегося, связанные с выводом числовых данных, поскольку избавляет
его от необходимости применять стандартные средства языка Паскаль,
предназначенные для преобразования чисел в их строковые
представления.
При вызове приведенных вариантов можно не указывать один или оба параметра,
заключенные в квадратные скобки.
Строковый параметр S определяет необязательный комментарий,
который указывается перед выводимым числом; если параметр S
отсутствует, то комментарий полагается равным пустой строке.
Числовой параметр A определяет выводимое число.
Необязательный целочисленный параметр W определяет
ширину поля вывода (т. е. количество экранных
позиций, отводимое для вывода числа). Если указанной ширины W поля вывода недостаточно, то
значение параметра W игнорируется; в этом случае (а также в случае, если параметр W отсутствует)
используется ширина поля вывода, минимально необходимая для
отображения данного числа. Если число не занимает всего поля вывода, то
оно дополняется слева пробелами (т. е. выравнивается по
правой границе поля вывода). В качестве десятичного разделителя
для чисел с дробной частью используется точка.
Вещественные числа по умолчанию выводятся в формате с
фиксированной точкой и двумя дробными знаками. Изменить формат
вывода вещественных чисел можно с помощью вспомогательной
процедуры SetPrecision, описываемой далее.
procedure ShowLine([S: string]);
procedure ShowLine([S: string;] A: integer[; W: integer]);
procedure ShowLine([S: string;] A: real[; W: integer]);
Модификации ранее описанных процедур Show; после вывода указанных данных в раздел отладки
дополнительно осуществляют автоматический переход на следующую экранную строку.
Смысл параметров тот же, что и для соответствующих вариантов процедуры Show.
Параметры, указанные в квадратных скобках, могут отсутствовать.
Если процедура ShowLine вызывается без параметров, то она
просто обеспечивает переход на новую экранную строку в разделе отладки.
procedure HideTask;
Вызов данной процедуры обеспечивает автоматическое скрытие всех разделов окна
задачника, кроме раздела отладки. Если раздел отладки в окне задачника
не отображается (в частности, если программа запущена в
демонстрационном режиме), то вызов процедуры HideTask игнорируется.
Игнорируются также все повторные вызовы данной процедуры.
Скрыть/восстановить основные разделы окна
задачника после его отображения на экране можно также с помощью клавиши
пробела или соответствующей команды контекстного меню раздела
отладки.
procedure SetPrecision(N: integer);
Процедура предназначена для настройки формата вывода
вещественных отладочных данных. Если параметр N положителен, то он
определяет количество выводимых дробных разрядов; при этом число
выводится в формате с фиксированной точкой. Если параметр N равен
нулю, то число выводится в формате с
плавающей точкой (экспоненциальном формате); при этом число
дробных знаков для экспоненциального формата
определяется шириной поля вывода (т. е. параметром W процедуры
Show или ShowLine). При отрицательных значениях параметра N выполняется та же
настройка, что и при N = 0.
Действие текущей настройки числового формата, определенной
процедурой SetPrecision, продолжается до очередного вызова этой
процедуры. До первого вызова процедуры SetPrecision вещественные
числа выводятся в формате с фиксированной точкой и двумя дробными
знаками.
|