Описание языка PascalABC.NET - W Cat
Шрифт:
Интервал:
Закладка:
Данный список является двусвязным циклическим списком (на его цикличность указывают символы <<" и ">>"), однако одна из его связей отсутствует. А именно, элемент 23 (на который указывает указатель P0) не связан с предыдущим элементом 15, т. е. поле Prev элемента 23 содержит ошибочное значение (например, равно nil). При правильно разработанном задании подобная ситуация может возникнуть только для ошибочных списков, созданных в программе учащегося. Заметим, что связь в другом направлении (от 15 к 23) имеется, т. е. поле Next элемента 15 указывает на элемент 23.
Пример 4
PXPY
95 - 63 -.34.- >>
Данный список является односвязным циклическим списком. Он имеет две особенности. Во-первых, на элемент 95 указывают сразу два указателя (PX и PY), и, во-вторых, элемент 34 должен быть размещен в памяти процедурой New при выполнении задания (на это указывают обрамляющие его точки). Подобные элементы, естественно, могут содержаться только в результирующих списках. Они определяются с помощью процедуры SetNewNode.
Пример 5
Так выглядит на экране бинарное дерево глубины 4. С корнем этого дерева (поле Data которого равно 96) связан указатель P1.
Пример 6
Так выглядит на экране бинарное дерево с обратной связью (номера уровней на данной иллюстрации не указаны).
Пример 7
Так выглядит на экране дерево общего вида (номера уровней и имена связанных с деревом указателей на данной иллюстрации не указаны). В данном случае корень дерева 13 имеет три непосредственных потомка: вершины 71, 73 и 29. Напомним, что в дереве общего вида поле Left определяет первую (левую) дочернюю вершину, а поле Right -- очередную (правую) вершину-сестру.
Пример 8
Так выглядит на экране бинарное дерево с включенным режимом прокрутки. Дополнительной особенностью этого дерева является наличие точек около каждой его вершины. Это означает, что данное дерево является результирующим, причем память для всех его вершин должна быть выделена в программе учащегося.
procedure ShowPointer(NP: integer);
Процедура обеспечивает отображение указателя с номером NP при выводе текущего линейного списка или дерева. Например, ее вызов вида ShowPointer(1) обеспечил отображение указателя P1 в примерах 1, 2 и 5. Если указатель номер NP является нулевым, то вызов процедуры ShowPointer игнорируется без вывода сообщения об ошибке. Если указатель с номером NP не является нулевым и не связан ни с одним из элементов списка, то выводится сообщение об ошибке.
С одним элементом списка или дерева можно связать не более двух указателей (исключение составляет последний элемент списка, с которым можно связать не более трех указателей). Порядок вызова процедур ShowPointer для одного и того же элемента списка является произвольным; при отображении указателей, связанных с одним и тем же элементом, они выводятся в отсортированном порядке (например, P3P6). В случае списков имена указателей отображаются над элементом, и при наличии нескольких указателей на один элемент их имена располагаются слева направо. В случае деревьев имена указателей располагаются под элементом, и при наличии нескольких указателей на один элемент их имена располагаются одно под другим. Если количество указателей, связываемых процедурами ShowPointer с данным элементом списка, превосходит максимально допустимое (например, с последним элементом связывается четыре различных указателя), то список связанных указателей дополняется символом ошибки -- звездочкой (например, P1P2P3*). Если с элементом бинарного дерева связывается более двух указателей, то под вторым указателем изображается еще один указатель вида P*. Символ ошибки * выделяется красным цветом.
Если указатель надо связать с элементом списка или дерева, помеченным точками (см. пример 8), то вызов процедуры ShowPointer для данного указателя надо выполнить до того, как для соответствующего элемента списка или дерева будет вызвана процедура SetNewNode (в противном случае при вызове процедуры ShowPointer будет выведено сообщение об ошибке вида Не найден элемент с адресом P1").
[Pascal]
procedure SetNewNode(NNode: integer);
[C++]
void SetNewNode(int NNode);
Процедура определяет для текущего списка элемент с номером NNode (нумерация ведется от 1) как элемент, который требуется разместить в памяти с помощью процедуры New в ходе выполнения задания (подобные элементы выделяются в списке с помощью обрамляющих точек -- см. пример 4). Она также позволяет аналогичным образом выделить элемент текущего дерева (см. пример 8); при этом предполагается, что элементы дерева нумеруются в префиксном порядке (в частности, корень дерева всегда имеет номер 1; по поводу префиксного порядка см. задание Tree13).
Данная процедура может применяться только к результирующим спискам и деревьям (для определения которых используются процедуры группы Result: ResultList, ResultBinTree, ResultTree). Если результирующий список или дерево не содержит элемента с номером NNode, то выводится сообщение об ошибке.
В случае, если указатель на элемент номер NNode требуется отобразить на экране, вызов соответствующей процедуры ShowPointer необходимо выполнить до вызова процедуры SetNewNode.
Если при выполнении задания учащийся будет выделять память (процедурой New для языка Pascal или аналогичными средствами для других языков) для тех элементов результирующего списка или дерева, для которых это не предусмотрено заданием, то соответствующие элементы в результирующем списке (дереве) будут обрамлены точками, что приведет к сообщению Ошибочное решение".
procedure SetDisposedNode(NNode: integer);
Процедура определяет для текущего списка или дерева элемент с номером NNode (нумерация ведется от 1, элементы дерева нумеруются в префиксном порядке), который требуется удалить из динамической памяти в ходе выполнения задания. Данная процедура может применятся только к исходным спискам и деревьям (для определения которых используются процедуры группы Data: DataList, DataBinTree, DataTree). Если исходный список или дерево не содержит элемента с номером NNode, то выводится сообщение об ошибке.
Элементы, помечаемые с помощью процедуры SetDisposedNode, выделяются на экране цветом меньшей яркости. Если они не удаляются из памяти в ходе выполнения задания, то их цвет изменяется на красный и выводится соответствующее сообщение об ошибке.
procedure SetObjectStyle;
Данная процедура устанавливает объектный стиль" для динамических структур и связанных с ними ссылок при выполнении задания в среде PascalABC.NET. Она должна вызываться при формировании заданий, ориентированных на использование не записей TNode и связанных с ними указателей PNode, а объектов класса Node (данный класс определен в вариантах задачника для языков платформы .NET и, в частности, для языка PascalABC.NET).
При разработке заданий класс Node не используется. Даже если разрабатываемая группа заданий ориентирована на его применение, сами задания надо создавать с помощью записей TNode, указателей PNode и описанных выше процедур. Однако для решения подобных задач на языках платформы .NET, а также на языках Python и Java, вместо записей и связанных с ними указателей надо применять объекты класса Node. Среди языков, поддерживаемых версией 4.11 задачника, имеется единственный язык, позволяющий использовать как указатели, так и объекты: это язык PascalABC.NET. Именно поэтому для данного языка предусмотрена процедура SetObjectStyle (в прочих языках, использующих объекты Node, настройка объектного стиля в заданиях на обработку динамических структур выполняется автоматически).
Создавая задания на обработку динамических структур для языка PascalABC.NET, разработчик должен указать учащемуся требуемый способ решения, используя соответствующие термины в формулировке задания (запись" или "объект", "указатель" или "ссылка" и т. п.), а также настроив, при необходимости, вывод динамических структур на объектный стиль", вызвав процедуру SetObjectStyle (по умолчанию применяется "стиль указателей", подробно описанный выше). Процедура SetObjectStyle должна быть вызвана после процедуры CreateTask (необходимо также, чтобы ее вызов располагался перед вызовами любых процедур, обеспечивающих добавление к заданию динамических структур и связанных с ними указателей). В результате ее вызова изменяется отображение этих элементов данных, а именно:
вместо текста ptr для непустого указателя указывается текст Node (т. е. имя непустого объекта типа Node); в стандартном комментарии к указателю вместо буквы P указывается буква A, например, A1 = Node (эту особенность следует учитывать в формулировке задания, используя в ней вместо имен указателей P1, P2 и т. д. имена объектов A1, A2 и т. д.). Аналогичные изменения (символа P на символ A) выполняются и при отображении указателей, связанных с динамическими структурами. Например, односвязный список, приведенный в примере 1, при установке объектного стиля будет иметь следующий вид: