Описание языка PascalABC.NET - W Cat
Шрифт:
Интервал:
Закладка:
Используемая процедура ввода должна соответствовать типу очередного элемента исходных данных; в противном случае выводится сообщение об ошибке Неверно указан тип при вводе исходных данных" (такое сообщение будет выведено, например, если очередной элемент данных является символом, а для его ввода используется процедура 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 программа осуществляет контроль за соответствием количества требуемых и выведенных результирующих данных. Если программа выведет недостаточное или избыточное количество результирующих данных, то после проверки этих данных появится сообщение «Выведены не все результирующие данные» или, соответственно, «Попытка вывести лишние результирующие данные».
P: PNode);
Данная процедура переопределяет стандартную процедуру Dispose для того, чтобы контролировать действия учащегося по освобождению памяти при выполнении заданий групп Dynamic и Tree.
Класс Node и альтернативный ввод-вывод в стиле .NETВ варианте задачника Programming Taskbook, включенном в систему PascalABC.NET, предусмотрен альтернативный способ организации ввода-вывода, характерный не для традиционного Паскаля, а для языков платформы .NET. Наличие двух способов ввода-вывода обусловлено тем обстоятельством, что система PascalABC.NET позволяет разрабатывать программы как в стиле, характерном для традиционного Паскаля, так и в .NET-стиле, ориентированном на использование стандартных средств платформы .NET, в том числе ее библиотеки классов.
Кроме новых средств ввода-вывода в варианте задачника для системы PascalABC.NET предусмотрен класс Node, который следует использовать вместо типов PNode и TNode при выполнении заданий на динамические структуры в объектном стиле". Заметим, что в этом случае необходимо пользоваться группами ObjDyn и ObjTree, в которых (в отличие от групп Dynamic и Tree) применяется "объектная" терминология, ориентированная на применение классов платформы .NET.
type
Node = class(IDisposable)
. . .
public
// Конструкторы:
constructor Create;
constructor Create(aData: integer);
constructor Create(aData: integer; aNext: Node);
constructor Create(aData: integer; aNext, aPrev: Node);
constructor Create(aLeft, aRight: Node; aData: integer);
constructor Create(aLeft, aRight: Node; aData: integer; aParent: Node);
// Свойства (доступны для чтения и записи):
property Data: integer;
property Next: Node;
property Prev: Node;
property Left: Node;
property Right: Node;
property Parent: Node;
// Метод, освобождающий ресурсы, используемые объектом Node:
procedure Dispose;
;
Класс Node используется в заданиях групп ObjDyn и ObjTree. В заданиях на стеки и очереди (ObjDyn1-ObjDyn28) при работе с объектами типа Node используются только свойства Data и Next; в заданиях на двусвязные списки (ObjDyn29-ObjDyn80) используются свойства Data, Next и Prev. В большинстве заданий на бинарные деревья (группа ObjTree) используются свойства Data, Left и Right; в заданиях на обработку бинарных деревьев с обратной связью (ObjTree48-ObjTree56 и ObjTree70-ObjTree71) дополнительно используется свойство Parent.
Варианты конструктора класса Node позволяют задавать значения требуемых свойств при создании объекта; прочие свойства инициализируются нулевыми значениями (числом 0 для свойства Data, нулевой ссылкой nil для остальных свойств).
Следует обратить внимание на то, что данный класс реализует интерфейс IDisposable, поэтому при завершении работы с объектом типа Node требуется вызвать его метод Dispose, освобождающий неуправляемые ресурсы, выделенные для этого объекта (исключение делается только для тех объектов, которые передаются обратно задачнику в качестве результирующих данных). Если в задании требуется вызвать метод Dispose для некоторых объектов, но этот вызов не выполняется, то при запуске программы выводится сообщение об ошибке Не вызван метод Dispose для объекта типа Node".
Все исходные и результирующие данные-ссылки в заданиях группы ObjDyn и ObjTree имеют тип Node; их ввод и вывод должен осуществляться с помощью функции GetNode и процедуры Put, описанных ниже.
function GetBoolean: boolean;
function GetChar: char;
function GetInt: integer;
function GetNode: Node;
function GetReal: real;
function GetString: string;
Функции обеспечивают ввод исходных данных в программу, выполняющую учебное задание, причем ввод организуется в стиле, характерном для платформы .NET (поскольку в стандартной библиотеке .NET ввод данных всегда выполняется с помощью функций). Эти функции должны вызываться после вызова процедуры Task; в случае их вызова до вызова процедуры Task при запуске программы будет выведено сообщение об ошибке В начале программы не вызвана процедура Task с именем задания".
Используемая функция ввода должна соответствовать типу очередного элемента исходных данных; в противном случае выводится сообщение об ошибке Неверно указан тип при вводе исходных данных" (такое сообщение будет выведено, например, если очередной элемент данных является символом, а для его ввода используется функция GetInt).
При попытке ввести больше исходных данных, чем это предусмотрено в задании, выводится сообщение об ошибке Попытка ввести лишние исходные данные". Если исходные данные, необходимые для решения задания, введены не полностью, то выводится сообщение "Введены не все требуемые исходные данные".
object);
Процедура Put обеспечивает вывод на экран результирующих данных, найденных программой, и их сравнение с контрольными данными (то есть с правильным решением). Как и описанные выше функции группы Get, процедура Put должна вызываться после вызова процедуры Task; в противном случае при запуске программы будет выведено сообщение об ошибке В начале программы не вызвана процедура Task с именем задания".
Благодаря использованию параметра-массива, снабженного атрибутом params, при вызове процедуры Put можно указывать произвольное число параметров. Параметры могут иметь тип boolean, integer, real, char, string, Node. В качестве параметров процедуры Put можно указывать не только переменные, но и выражения (в частности, константы соответствующего типа, а также нулевую ссылку nil. Заметим, что нулевые ссылки, как и объекты типа Node, требуется выводить только в заданиях групп ObjDyn и ObjTree. Если в списке параметров указываются параметры недопустимого типа, то при выполнении программы выводится сообщение об ошибке В методе Put указан параметр недопустимого типа".
Тип параметра должен не только быть допустимым, но и соответствовать типу очередного элемента результирующих данных; в противном случае выводится сообщение об ошибке Неверно указан тип при выводе результатов".
Как и в случае функций группы Get, при вызовах процедуры Put программа осуществляет контроль за соответствием количества требуемых и выведенных результирующих данных. Если программа выведет недостаточное или избыточное количество результирующих данных, то после проверки этих данных появится сообщение Выведены не все результирующие данные" или, соответственно, "Попытка вывести лишние результирующие данные".