2018-08-02 22:04:49 +03:00
|
|
|
|
<html>
|
|
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
|
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
|
|
|
|
|
<param name="Keyword" value="PNode">
|
|
|
|
|
|
<param name="Keyword" value="TNode">
|
|
|
|
|
|
<param name="Keyword" value="Node">
|
|
|
|
|
|
<param name="Keyword" value="Task">
|
|
|
|
|
|
<param name="Keyword" value="GetB">
|
|
|
|
|
|
<param name="Keyword" value="GetC">
|
|
|
|
|
|
<param name="Keyword" value="GetN">
|
|
|
|
|
|
<param name="Keyword" value="GetR">
|
|
|
|
|
|
<param name="Keyword" value="GetS">
|
|
|
|
|
|
<param name="Keyword" value="GetP">
|
|
|
|
|
|
<param name="Keyword" value="PutB">
|
|
|
|
|
|
<param name="Keyword" value="PutC">
|
|
|
|
|
|
<param name="Keyword" value="PutN">
|
|
|
|
|
|
<param name="Keyword" value="PutR">
|
|
|
|
|
|
<param name="Keyword" value="PutS">
|
|
|
|
|
|
<param name="Keyword" value="PutP">
|
|
|
|
|
|
<param name="Keyword" value="GetBoolean">
|
|
|
|
|
|
<param name="Keyword" value="GetChar">
|
|
|
|
|
|
<param name="Keyword" value="GetInt">
|
|
|
|
|
|
<param name="Keyword" value="GetReal">
|
|
|
|
|
|
<param name="Keyword" value="GetString">
|
|
|
|
|
|
<param name="Keyword" value="GetNode">
|
|
|
|
|
|
<param name="Keyword" value="Put">
|
|
|
|
|
|
<param name="Keyword" value="Show">
|
|
|
|
|
|
<param name="Keyword" value="ShowLine">
|
|
|
|
|
|
<param name="Keyword" value="SetPrecision">
|
|
|
|
|
|
<param name="Keyword" value="HideTask">
|
|
|
|
|
|
</object>
|
|
|
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
|
|
|
|
|
<title></title>
|
|
|
|
|
|
<link rel="StyleSheet" href="../../default.css">
|
|
|
|
|
|
</head>
|
|
|
|
|
|
|
|
|
|
|
|
<body>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<h1>Модуль PT4</h1>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<hr>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Описанные в данном разделе типы и процедуры
|
|
|
|
|
|
будут доступны в программе, если к ней с помощью оператора <code><b>uses</b></code>
|
|
|
|
|
|
подключен модуль <code>PT4</code> (см. <a href="..\CheckedTasks\checkedtasks1.htm">пример</a> программы, использующей задачник
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>Programming Taskbook</b>).
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<a name="node"></a><h2>Дополнительные типы данных PNode и TNode</h2>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>type</b><br>
|
|
|
|
|
|
PNode = ^TNode;<br>
|
|
|
|
|
|
TNode = <b>record</b><br>
|
|
|
|
|
|
Data: integer;<br>
|
|
|
|
|
|
Next: PNode;<br>
|
|
|
|
|
|
Prev: PNode;<br>
|
|
|
|
|
|
Left: PNode;<br>
|
|
|
|
|
|
Right: PNode;<br>
|
|
|
|
|
|
Parent: PNode;<br>
|
|
|
|
|
|
<b>end</b>;
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Типы <code>PNode</code> и <code>TNode</code> используются в заданиях групп Dynamic и Tree. В заданиях на стеки и очереди
|
|
|
|
|
|
(Dynamic1–Dynamic28) при работе с записями типа <code>TNode</code> используются только поля <code>Data</code> и <code>Next</code>;
|
|
|
|
|
|
в заданиях на двусвязные списки (Dynamic29–Dynamic80) используются поля <code>Data</code>, <code>Next</code> и <code>Prev</code>.
|
|
|
|
|
|
В большинстве заданий на бинарные деревья (группа Tree) используются поля <code>Data</code>, <code>Left</code> и <code>Right</code>;
|
|
|
|
|
|
в заданиях на обработку бинарных деревьев с обратной связью (Tree48–Tree56 и Tree70–Tree71) дополнительно используется
|
|
|
|
|
|
поле <code>Parent</code>.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Все исходные и результирующие данные-указатели в заданиях имеют тип <code>PNode</code>;
|
|
|
|
|
|
их ввод и вывод должен осуществляться с помощью процедур <code>GetP</code> и <code>PutP</code> (в системе <b>PascalABC.NET</b>
|
|
|
|
|
|
указатели, как и другие данные,
|
|
|
|
|
|
можно получать из задачника и передавать ему с помощью стандартных процедур ввода-вывода <code>read</code>
|
|
|
|
|
|
и <code>write</code>).
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>В программе учащегося не следует повторно описывать типы <code>PNode</code> и <code>TNode</code>.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<h2>Инициализация задания, ввод–вывод данных</h2>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<a name="task"></a><hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> Task(Name: <b>string</b>);
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Процедура инициализирует задание с именем <code>Name</code>. Она должна
|
|
|
|
|
|
вызываться в начале программы, выполняющей это задание (до вызова
|
|
|
|
|
|
процедур ввода-вывода). Если в программе, подключившей
|
|
|
|
|
|
модуль <code>PT4</code>, не указана процедура <code>Task</code>, то при запуске программы
|
|
|
|
|
|
будет выведено окно с сообщением «<i>Не вызвана процедура Task с
|
|
|
|
|
|
именем задания</i>».</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
Имя задания <code>Name</code> должно включать имя темы и порядковый
|
|
|
|
|
|
номер в пределах темы (например, <code>'Begin3'</code>). Регистр букв в имени темы
|
|
|
|
|
|
может быть произвольным. Если указана неверная тема задания, то
|
|
|
|
|
|
программа выведет сообщение об ошибке, в котором будут
|
|
|
|
|
|
перечислены названия всех имеющихся тем. Если указан
|
|
|
|
|
|
недопустимый номер задания, то программа выведет сообщение, в
|
|
|
|
|
|
котором будет указан диапазон допустимых номеров для данной темы.
|
|
|
|
|
|
Если после имени задания в параметре <code>Name</code> указан символ <code>?</code>
|
|
|
|
|
|
(например, <code>'Begin1?'</code>), то программа будет работать в
|
|
|
|
|
|
<a href="Demo.html"><i>демонстрационном режиме</i></a>.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Начиная с версии 4.8, процедура <code>Task</code> может также использоваться для
|
|
|
|
|
|
генерации и вывода на экран html-страницы с текстом задания или группы заданий.
|
|
|
|
|
|
Для этого необходимо указать в качестве параметра <code>Name</code> имя конкретного задания или группы
|
|
|
|
|
|
заданий и символ <code>#</code>, например, <code>'Begin3#'</code> или
|
|
|
|
|
|
<code>'Begin#'</code>. Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся
|
|
|
|
|
|
в разделе, посвященном демонстрационному режиму задачника.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Если при первом вызове процедуры <code>Task</code> в параметре не указывается символ <code>#</code>, то
|
|
|
|
|
|
все последующие вызовы процедуры <code>Task</code> игнорируются. Если при первом вызове процедуры
|
|
|
|
|
|
<code>Task</code> в параметре указывается символ <code>#</code>,
|
|
|
|
|
|
то игнорируются все последующие вызовы процедуры <code>Task</code>, не содержащие этот символ.
|
|
|
|
|
|
С помощью нескольких вызовов процедуры <code>Task</code>, содержащей в параметре символ <code>#</code>, можно обеспечить
|
|
|
|
|
|
генерацию html-страницы с описанием нескольких групп заданий, причем в каждой группе при этом можно отображать только
|
|
|
|
|
|
некоторые задания.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code>
|
|
|
|
|
|
<b>procedure</b> GetB(<b>var</b> X: boolean);<br>
|
|
|
|
|
|
<b>procedure</b> GetC(<b>var</b> X: char);<br>
|
|
|
|
|
|
<b>procedure</b> GetN(<b>var</b> X: integer);<br>
|
|
|
|
|
|
<b>procedure</b> GetR(<b>var</b> X: real);<br>
|
|
|
|
|
|
<b>procedure</b> GetS(<b>var</b> X: string);<br>
|
|
|
|
|
|
<b>procedure</b> GetP(<b>var</b> X: PNode);<br>
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
<p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
Процедуры обеспечивают ввод исходных данных в программу,
|
|
|
|
|
|
выполняющую учебное задание. Они должны вызываться после вызова
|
|
|
|
|
|
процедуры <code>Task</code>;
|
|
|
|
|
|
в случае их вызова до вызова процедуры <code>Task</code> при запуске программы
|
|
|
|
|
|
будет выведено сообщение об ошибке «<i>В начале программы не
|
|
|
|
|
|
вызвана процедура Task с именем задания</i>».</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Используемая процедура ввода должна соответствовать типу
|
|
|
|
|
|
очередного элемента исходных данных; в противном случае выводится
|
|
|
|
|
|
сообщение об ошибке «<i>Неверно указан тип при вводе исходных
|
|
|
|
|
|
данных</i>» (такое сообщение будет выведено, например, если очередной
|
|
|
|
|
|
элемент данных является символом, а для его ввода используется
|
|
|
|
|
|
процедура <code>GetN</code>).</p>
|
|
|
|
|
|
<p>При попытке ввести больше исходных данных, чем это
|
|
|
|
|
|
предусмотрено в задании, выводится сообщение об ошибке «<i>Попытка
|
|
|
|
|
|
ввести лишние исходные данные</i>». Если исходные данные,
|
|
|
|
|
|
необходимые для решения задания, введены не полностью, то
|
|
|
|
|
|
выводится сообщение «<i>Введены не все требуемые исходные данные</i>».</p>
|
|
|
|
|
|
<p>При использовании задачника в системе <b>PascalABC.NET</b> вместо процедур группы <code>Get</code>
|
|
|
|
|
|
можно использовать обычные процедуры ввода <code>read</code>.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code>
|
|
|
|
|
|
<b>procedure</b> PutB(X: boolean);<br>
|
|
|
|
|
|
<b>procedure</b> PutC(X: char);<br>
|
|
|
|
|
|
<b>procedure</b> PutN(X: integer);<br>
|
|
|
|
|
|
<b>procedure</b> PutR(X: real);<br>
|
|
|
|
|
|
<b>procedure</b> PutS(X: string);<br>
|
|
|
|
|
|
<b>procedure</b> PutP(X: PNode);<br>
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
<p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
Процедуры обеспечивают вывод на экран результирующих
|
|
|
|
|
|
данных, найденных программой, и их сравнение с <i>контрольными
|
|
|
|
|
|
данными</i> (то есть с правильным решением). Как и процедуры группы
|
|
|
|
|
|
<code>Get</code>, эти процедуры должны вызываться после вызова процедуры <code>Task</code>;
|
|
|
|
|
|
в противном случае при запуске программы будет выведено сообщение
|
|
|
|
|
|
об ошибке «<i>В начале программы не вызвана процедура Task
|
|
|
|
|
|
с именем задания</i>».</p>
|
|
|
|
|
|
<p>В отличие от процедур группы <code>Get</code>, в качестве параметра процедур
|
|
|
|
|
|
группы <code>Put</code> можно указывать не только переменные, но и <i>выражения</i> (в
|
|
|
|
|
|
частности, <i>константы</i> соответствующего типа). Используемая
|
|
|
|
|
|
процедура должна соответствовать типу очередного элемента
|
|
|
|
|
|
результирующих данных, в противном случае выводится сообщение об
|
|
|
|
|
|
ошибке «<i>Неверно указан тип при выводе результатов</i>».</p>
|
|
|
|
|
|
<p>Как и в случае процедур группы <code>Get</code>, при вызовах процедур
|
|
|
|
|
|
группы <code>Put</code> программа осуществляет контроль за соответствием
|
|
|
|
|
|
количества требуемых и выведенных результирующих данных. Если
|
|
|
|
|
|
программа выведет недостаточное или избыточное количество
|
|
|
|
|
|
результирующих данных, то после проверки этих данных появится
|
|
|
|
|
|
сообщение «<i>Выведены не все результирующие данные</i>» или,
|
|
|
|
|
|
соответственно, «<i>Попытка вывести лишние результирующие данные</i>».
|
|
|
|
|
|
<p>При использовании задачника в системе <b>PascalABC.NET</b> вместо процедур группы <code>Put</code>
|
|
|
|
|
|
можно использовать обычные процедуры вывода <code>write</code>.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code>
|
|
|
|
|
|
<b>procedure</b> Dispose(<b>var</b> P: PNode);
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
<p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
Данная процедура переопределяет стандартную процедуру <code>Dispose</code> для того, чтобы
|
|
|
|
|
|
контролировать действия учащегося по освобождению памяти при выполнении заданий групп Dynamic и Tree.</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<h2>Класс Node и альтернативный ввод–вывод в стиле .NET</h2>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>В варианте задачника <b>Programming Taskbook</b>, включенном в систему <b>PascalABC.NET</b>, предусмотрен
|
|
|
|
|
|
альтернативный способ организации ввода-вывода, характерный не для традиционного Паскаля,
|
|
|
|
|
|
а для языков платформы .NET. Наличие двух способов ввода-вывода обусловлено тем обстоятельством, что
|
|
|
|
|
|
система <b>PascalABC.NET</b> позволяет разрабатывать программы как в стиле, характерном для
|
|
|
|
|
|
традиционного Паскаля, так и в .NET-стиле, ориентированном на использование стандартных средств платформы
|
|
|
|
|
|
.NET, в том числе ее библиотеки классов.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Кроме новых средств ввода-вывода в варианте задачника для системы <b>PascalABC.NET</b> предусмотрен
|
|
|
|
|
|
класс <code>Node</code>, который следует использовать вместо типов <code>PNode</code> и <code>TNode</code> при
|
|
|
|
|
|
выполнении заданий на динамические структуры «в объектном стиле». Заметим, что в этом случае
|
|
|
|
|
|
необходимо пользоваться группами ObjDyn и ObjTree, в которых (в отличие от групп Dynamic и Tree)
|
|
|
|
|
|
применяется «объектная» терминология, ориентированная на применение классов платформы .NET.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>type</b><br>
|
|
|
|
|
|
Node = <b>class</b>(IDisposable)<br>
|
|
|
|
|
|
. . .<br>
|
|
|
|
|
|
<b>public</b><br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// <i>Конструкторы:</i><br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>constructor</b> Create;<br>
|
|
|
|
|
|
<b>constructor</b> Create(aData: integer);<br>
|
|
|
|
|
|
<b>constructor</b> Create(aData: integer; aNext: Node);<br>
|
|
|
|
|
|
<b>constructor</b> Create(aData: integer; aNext, aPrev: Node);<br>
|
|
|
|
|
|
<b>constructor</b> Create(aLeft, aRight: Node; aData: integer);<br>
|
|
|
|
|
|
<b>constructor</b> Create(aLeft, aRight: Node; aData: integer; aParent: Node);<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// <i>Свойства (доступны для чтения и записи):</i><br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>property</b> Data: integer;<br>
|
|
|
|
|
|
<b>property</b> Next: Node;<br>
|
|
|
|
|
|
<b>property</b> Prev: Node;<br>
|
|
|
|
|
|
<b>property</b> Left: Node;<br>
|
|
|
|
|
|
<b>property</b> Right: Node;<br>
|
|
|
|
|
|
<b>property</b> Parent: Node;<br>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
// <i>Метод, освобождающий ресурсы, используемые объектом Node:</i><br>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
<b>procedure</b> Dispose;<br>
|
|
|
|
|
|
<b>end</b>;
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Класс <code>Node</code> используется в заданиях групп ObjDyn и ObjTree. В заданиях на
|
|
|
|
|
|
стеки и очереди (ObjDyn1–ObjDyn28) при работе с объектами типа <code>Node</code>
|
|
|
|
|
|
используются только свойства <code>Data</code> и <code>Next</code>; в заданиях на двусвязные списки
|
|
|
|
|
|
(ObjDyn29–ObjDyn80) используются свойства <code>Data</code>, <code>Next</code> и <code>Prev</code>. В большинстве заданий на
|
|
|
|
|
|
бинарные деревья (группа ObjTree) используются свойства <code>Data</code>, <code>Left</code> и <code>Right</code>;
|
|
|
|
|
|
в заданиях на обработку бинарных деревьев с обратной связью
|
|
|
|
|
|
(ObjTree48–ObjTree56 и ObjTree70–ObjTree71) дополнительно используется свойство <code>Parent</code>.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Варианты конструктора класса <code>Node</code> позволяют задавать значения требуемых свойств при создании
|
|
|
|
|
|
объекта; прочие свойства инициализируются нулевыми значениями
|
|
|
|
|
|
(числом 0 для свойства <code>Data</code>, нулевой ссылкой <code>nil</code> для остальных свойств).
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Следует обратить внимание на то, что данный класс реализует интерфейс
|
|
|
|
|
|
<code>IDisposable</code>, поэтому при завершении работы с объектом типа <code>Node</code> требуется вызвать
|
|
|
|
|
|
его метод <code>Dispose</code>, освобождающий <i>неуправляемые ресурсы</i>, выделенные для этого
|
|
|
|
|
|
объекта (исключение делается только для тех объектов, которые передаются обратно
|
|
|
|
|
|
задачнику в качестве результирующих данных). Если в задании требуется вызвать
|
|
|
|
|
|
метод <code>Dispose</code> для некоторых объектов, но этот вызов не выполняется, то при запуске
|
|
|
|
|
|
программы выводится сообщение об ошибке «<i>Не вызван метод Dispose для
|
|
|
|
|
|
объекта типа Node</i>».
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Все исходные и результирующие данные-ссылки в заданиях группы ObjDyn и ObjTree
|
|
|
|
|
|
имеют тип <code>Node</code>; их ввод и вывод должен осуществляться с помощью функции
|
|
|
|
|
|
<code>GetNode</code> и процедуры <code>Put</code>, описанных ниже.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code>
|
|
|
|
|
|
<b>function</b> GetBoolean: boolean;<br>
|
|
|
|
|
|
<b>function</b> GetChar: char;<br>
|
|
|
|
|
|
<b>function</b> GetInt: integer;<br>
|
|
|
|
|
|
<b>function</b> GetNode: Node;<br>
|
|
|
|
|
|
<b>function</b> GetReal: real;<br>
|
|
|
|
|
|
<b>function</b> GetString: string;<br>
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Функции обеспечивают ввод исходных данных в программу,
|
|
|
|
|
|
выполняющую учебное задание, причем ввод организуется в стиле,
|
|
|
|
|
|
характерном для платформы .NET (поскольку
|
|
|
|
|
|
в стандартной библиотеке .NET ввод данных <i>всегда</i> выполняется с помощью функций).
|
|
|
|
|
|
Эти функции должны вызываться после вызова процедуры <code>Task</code>;
|
|
|
|
|
|
в случае их вызова до вызова процедуры <code>Task</code> при запуске программы будет выведено
|
|
|
|
|
|
сообщение об ошибке «<i>В начале программы не вызвана процедура Task с
|
|
|
|
|
|
именем задания</i>».
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Используемая функция ввода должна соответствовать типу очередного элемента
|
|
|
|
|
|
исходных данных; в противном случае выводится сообщение об ошибке
|
|
|
|
|
|
«<i>Неверно указан тип при вводе исходных данных</i>» (такое сообщение
|
|
|
|
|
|
будет выведено, например, если очередной элемент данных является символом, а для
|
|
|
|
|
|
его ввода используется функция <code>GetInt</code>).
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>При попытке ввести больше исходных данных, чем это предусмотрено в
|
|
|
|
|
|
задании, выводится сообщение об ошибке «<i>Попытка ввести лишние исходные
|
|
|
|
|
|
данные</i>». Если исходные данные, необходимые для решения задания, введены
|
|
|
|
|
|
не полностью, то выводится сообщение «<i>Введены не все требуемые исходные
|
|
|
|
|
|
данные</i>».
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code>
|
|
|
|
|
|
<b>procedure</b> Put(<b>params</b> A: <b>array of</b> object);
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Процедура <code>Put</code> обеспечивает вывод на экран результирующих данных, найденных
|
|
|
|
|
|
программой, и их сравнение с <i>контрольными данными</i> (то есть с правильным
|
|
|
|
|
|
решением). Как и описанные выше функции группы <code>Get</code>, процедура <code>Put</code> должна вызываться после вызова
|
|
|
|
|
|
процедуры <code>Task</code>; в противном случае при запуске программы будет выведено сообщение
|
|
|
|
|
|
об ошибке «<i>В начале программы не вызвана процедура Task с именем
|
|
|
|
|
|
задания</i>».
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Благодаря использованию параметра-массива, снабженного атрибутом <code><b>params</b></code>,
|
|
|
|
|
|
при вызове процедуры <code>Put</code> можно указывать <i>произвольное</i> число параметров. Параметры
|
|
|
|
|
|
могут иметь тип <code>boolean</code>, <code>integer</code>, <code>real</code>, <code>char</code>, <code>string</code>, <code>Node</code>.
|
|
|
|
|
|
В качестве параметров процедуры <code>Put</code>
|
|
|
|
|
|
можно указывать не только переменные, но и <i>выражения</i> (в частности, <i>константы</i>
|
|
|
|
|
|
соответствующего типа, а также <i>нулевую ссылку</i> <code>nil</code>. Заметим, что нулевые ссылки, как и объекты типа <code>Node</code>, требуется
|
|
|
|
|
|
выводить только в заданиях групп ObjDyn и ObjTree. Если в списке параметров указываются
|
|
|
|
|
|
параметры недопустимого типа, то при выполнении программы выводится
|
|
|
|
|
|
сообщение об ошибке «<i>В методе Put указан параметр недопустимого
|
|
|
|
|
|
типа</i>».
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Тип параметра должен не только быть допустимым, но и соответствовать типу
|
|
|
|
|
|
очередного элемента результирующих данных; в противном случае выводится
|
|
|
|
|
|
сообщение об ошибке «<i>Неверно указан тип при выводе результатов</i>».
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Как и в случае функций группы <code>Get</code>, при вызовах процедуры <code>Put</code> программа
|
|
|
|
|
|
осуществляет контроль за соответствием количества требуемых и выведенных
|
|
|
|
|
|
результирующих данных. Если программа выведет недостаточное или избыточное
|
|
|
|
|
|
количество результирующих данных, то после проверки этих данных появится
|
|
|
|
|
|
сообщение «<i>Выведены не все результирующие данные</i>» или,
|
|
|
|
|
|
соответственно, «<i>Попытка вывести лишние результирующие данные</i>».
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<a name="debug"></a><h2>Вывод отладочной информации
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</h2>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Описываемые далее отладочные средства появились в версии 4.9 задачника Programming Taskbook.
|
|
|
|
|
|
С их помощью можно выводить отладочную информацию
|
|
|
|
|
|
непосредственно в окно задачника (в специальный <a href="debug.html"><i>раздел отладки</i></a>).</p>
|
2018-08-02 22:04:49 +03:00
|
|
|
|
|
|
|
|
|
|
<a name="show"></a>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> Show(S: string);
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Отображает текстовую строку <code>S</code> в разделе отладки окна задачника.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Если текущая экранная строка в разделе отладки уже содержит некоторый текст, то
|
|
|
|
|
|
строка <code>S</code> снабжается начальным пробелом и приписывается к этому тексту,
|
|
|
|
|
|
за исключением случая, когда при таком приписывании размер
|
|
|
|
|
|
полученного текста превысит ширину области данных (равную 80 символам).
|
|
|
|
|
|
В последнем случае вывод строки <code>S</code> осуществляется с начала
|
|
|
|
|
|
следующей экранной строки; если же и в этой ситуации строка <code>S</code> превысит
|
|
|
|
|
|
ширину области данных, то строка <code>S</code> будет выведена на нескольких
|
|
|
|
|
|
экранных строках, причем разрывы текста будут выполняться по
|
|
|
|
|
|
пробельным символам строки <code>S</code>, а при отсутствии пробелов — при
|
|
|
|
|
|
достижении очередного фрагмента строки длины, равной 80.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Строка <code>S</code> может содержать явные команды перехода на новую
|
|
|
|
|
|
экранную строку. В качестве таких команд можно использовать или
|
|
|
|
|
|
символ с кодом 13 («возврат каретки»), или символ с кодом 10 («переход на новую
|
|
|
|
|
|
строку»), или их комбинацию в
|
|
|
|
|
|
указанном порядке (<code>#13#10</code>).
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<a name="shownumber"></a>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> Show(<b>[</b>S: string;<b>]</b> A: integer<b>[</b>; W: integer<b>]</b>);<br>
|
|
|
|
|
|
<b>procedure</b> Show(<b>[</b>S: string;<b>]</b> A: real<b>[</b>; W: integer<b>]</b>);
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Перегруженные варианты процедуры Show, предназначенные для вывода числовых отладочных данных.
|
|
|
|
|
|
Использование этих вариантов позволяет максимально упростить действия
|
|
|
|
|
|
учащегося, связанные с выводом числовых данных, поскольку избавляет
|
|
|
|
|
|
его от необходимости применять стандартные средства языка Pascal,
|
|
|
|
|
|
предназначенные для преобразования чисел в их строковые
|
|
|
|
|
|
представления.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>При вызове приведенных вариантов можно не указывать один или оба параметра,
|
|
|
|
|
|
заключенные в квадратные скобки.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Строковый параметр <code>S</code> определяет необязательный комментарий,
|
|
|
|
|
|
который указывается перед выводимым числом; если параметр <code>S</code>
|
|
|
|
|
|
отсутствует, то комментарий полагается равным пустой строке.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Числовой параметр <code>A</code> определяет выводимое число.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Необязательный целочисленный параметр <code>W</code> определяет
|
|
|
|
|
|
<i>ширину поля вывода</i> (т. е. количество экранных
|
|
|
|
|
|
позиций, отводимое для вывода числа). Если указанной ширины <code>W</code> поля вывода недостаточно, то
|
|
|
|
|
|
значение параметра <code>W</code> игнорируется; в этом случае (а также в случае, если параметр <code>W</code> отсутствует)
|
|
|
|
|
|
используется ширина поля вывода, минимально необходимая для
|
|
|
|
|
|
отображения данного числа. Если число не занимает всего поля вывода, то
|
|
|
|
|
|
оно дополняется слева пробелами (т. е. выравнивается по
|
|
|
|
|
|
<i>правой</i> границе поля вывода). В качестве десятичного разделителя
|
|
|
|
|
|
для чисел с дробной частью используется <i>точка</i>.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Вещественные числа по умолчанию выводятся в формате с
|
|
|
|
|
|
фиксированной точкой и двумя дробными знаками. Изменить формат
|
|
|
|
|
|
вывода вещественных чисел можно с помощью вспомогательной
|
|
|
|
|
|
процедуры <code>SetPrecision</code>, описываемой далее.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<a name="showline"></a>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> ShowLine(<b>[</b>S: string<b>]</b>);<br>
|
|
|
|
|
|
<b>procedure</b> ShowLine(<b>[</b>S: string;<b>]</b> A: integer<b>[</b>; W: integer<b>]</b>);<br>
|
|
|
|
|
|
<b>procedure</b> ShowLine(<b>[</b>S: string;<b>]</b> A: real<b>[</b>; W: integer<b>]</b>);<br>
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Модификации ранее описанных процедур <code>Show</code>; после вывода указанных данных в раздел отладки
|
|
|
|
|
|
дополнительно осуществляют автоматический переход на следующую экранную строку.
|
|
|
|
|
|
Смысл параметров — тот же, что и для соответствующих вариантов процедуры <code>Show</code>.
|
|
|
|
|
|
Параметры, указанные в квадратных скобках, могут отсутствовать.
|
|
|
|
|
|
Если процедура <code>ShowLine</code> вызывается без параметров, то она
|
|
|
|
|
|
просто обеспечивает переход на новую экранную строку в разделе отладки.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
<a name="hidetask"></a>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> HideTask;
|
|
|
|
|
|
</code></blockquote>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Вызов данной процедуры обеспечивает автоматическое скрытие всех разделов окна
|
|
|
|
|
|
задачника, кроме раздела отладки. Если раздел отладки в окне задачника
|
|
|
|
|
|
не отображается (в частности, если программа запущена в
|
|
|
|
|
|
демонстрационном режиме), то вызов процедуры <code>HideTask</code> игнорируется.
|
|
|
|
|
|
Игнорируются также все повторные вызовы данной процедуры.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Скрыть/восстановить основные разделы окна
|
|
|
|
|
|
задачника после его отображения на экране можно также с помощью клавиши
|
|
|
|
|
|
пробела или соответствующей команды контекстного меню раздела
|
|
|
|
|
|
отладки.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a name="setprecision"></a>
|
|
|
|
|
|
<hr noshade size="1">
|
|
|
|
|
|
<blockquote>
|
|
|
|
|
|
<code><b>procedure</b> SetPrecision(N: integer);
|
|
|
|
|
|
</code></blockquote>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<p>Процедура предназначена для настройки формата вывода
|
|
|
|
|
|
<i>вещественных</i> отладочных данных. Если параметр <code>N</code> положителен, то он
|
|
|
|
|
|
определяет количество выводимых дробных разрядов; при этом число
|
|
|
|
|
|
выводится в формате с фиксированной точкой. Если параметр <code>N</code> равен
|
|
|
|
|
|
нулю, то число выводится в формате с
|
|
|
|
|
|
плавающей точкой (экспоненциальном формате); при этом число
|
|
|
|
|
|
дробных знаков для экспоненциального формата
|
|
|
|
|
|
определяется шириной поля вывода (т. е. параметром <code>W</code> процедуры
|
|
|
|
|
|
<code>Show</code> или <code>ShowLine</code>). При отрицательных значениях параметра <code>N</code> выполняется та же
|
|
|
|
|
|
настройка, что и при <code>N = 0</code>.
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Действие текущей настройки числового формата, определенной
|
|
|
|
|
|
процедурой <code>SetPrecision</code>, продолжается до очередного вызова этой
|
|
|
|
|
|
процедуры. До первого вызова процедуры <code>SetPrecision</code> вещественные
|
|
|
|
|
|
числа выводятся в формате с фиксированной точкой и двумя дробными
|
|
|
|
|
|
знаками.
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
|
2025-11-07 16:12:31 +03:00
|
|
|
|
<h2>Особенности модуля PT4Exam</h2>
|
|
|
|
|
|
<p>При выполнении заданий групп ExamBegin и ExamTaskC, связанных с ЕГЭ по информатике,
|
|
|
|
|
|
к программам вместо модуля PT4 подключается модуль <code>PT4Exam</code>. В этом модуле реализована единственная дополнительная
|
|
|
|
|
|
процедура <a href="#task"><code>Task</code></a>, обеспечивающая инициализацию задания с указанным
|
|
|
|
|
|
именем. Все действия по вводу-выводу должны выполняться с использование стандартных
|
|
|
|
|
|
процедур языка Pascal. Отладочные средства модуля <code>PT4</code> в модуле <code>PT4Exam</code> также недоступны,
|
|
|
|
|
|
однако имеется возможность выводить дополнительные данные можно непосредственно в раздел результатов
|
|
|
|
|
|
(хотя при этом решение будет считаться ошибочным).
|
|
|
|
|
|
</p>
|
|
|
|
|
|
<p>Описанные выше ограничения модуля <code>PT4Exam</code> позволяют максимально приблизить полученное
|
|
|
|
|
|
решение к виду, требуемому на экзамене (программа содержит всего две дополнительные конструкции:
|
|
|
|
|
|
директиву подключения модуля <code>PT4Exam</code> и оператор вызова процедуры <code>Task</code>, инициализирующей требуемое задание).
|
2018-08-02 22:04:49 +03:00
|
|
|
|
</p>
|
|
|
|
|
|
</body>
|
|
|
|
|
|
</html>
|
|
|
|
|
|
|