Вспомогательные классы задачника
Приведенные в данном пункте классы описаны в пространстве имен PT4,
реализованном в сборке pt4net.dll. При создании проектов-заготовок с помощью
модуля PT4Load данная сборка подключается к созданным проектам автоматически.
Класс PT: общее описание
[C#]
public class PT: object
{
// Метод, инициализирующий задание:
public static void Task(string name);
// Методы, обеспечивающие ввод исходных данных:
public static bool GetBool();
public static int GetInt();
public static double GetDouble();
public static char GetChar();
public static string GetString();
public static Node GetNode();
// Метод, обеспечивающий вывод результатов:
public static void Put(params object[] a);
// Методы, предназначенные для отладки программ:
public static void Show(object a);
public static void ShowLine(object a);
public static void ShowLine();
public static void HideTask();
}
[VB.NET]
Public Class PT
Inherits Object
' Метод, инициализирующий задание:
Public Shared Sub Task(name As String)
' Методы, обеспечивающие ввод исходных данных:
Public Shared Function GetBool() As Boolean
Public Shared Function GetInt() As Integer
Public Shared Function GetDouble() As Double
Public Shared Function GetChar() As Char
Public Shared Function GetString() As String
Public Shared Function GetNode() As Node
' Метод, обеспечивающий вывод результатов:
Public Shared Sub Put(ParamArray a() As Object)
' Методы, предназначенные для отладки программ:
Public Shared Sub Show(a As Object);
Public Shared Sub ShowLine(a As Object);
Public Shared Sub ShowLine();
Public Shared Sub HideTask();
End Class
Класс PT предоставляет средства для инициализации требуемого задания,
организации ввода-вывода данных, а также вывода отладочной информации.
В программах на языках C# и VB.NET решение
задания оформляется в виде процедуры Solve, в которой, как правило, и вызываются
методы класса PT. В
программе не требуется создавать объекты класса PT, поскольку все его методы
являются классовыми.
В двух следующих пунктах описываются особенности, связанные с различными методами класса PT.
Инициализация заданий, ввод-вывод данных
Метод Task инициализирует задание с указанным именем name. Он должен
вызываться в начале процедуры Solve, выполняющей это задание (до вызова методов
ввода-вывода GetPut). Если в процедуре Solve, не вызван метод Task, то при
запуске программы будет выведено окно с сообщением «Не вызвана процедура
Task с именем задания».
Имя задания name должно включать имя группы заданий и порядковый номер в
пределах группы (например, "Begin3"). Регистр букв в имени группы может быть
произвольным. Если указана неверная группа, то программа выведет сообщение об
ошибке, в котором будут перечислены названия всех имеющихся групп. Если указан
недопустимый номер задания, то программа выведет сообщение, в котором будет
указан диапазон допустимых номеров для данной группы. Если после имени задания
в параметре name указан символ «?» (например, "Begin3?"), то
программа будет работать в демонстрационном режиме.
Начиная с версии 4.8, метод Task может также использоваться для
генерации и вывода на экран html-страницы с текстом задания или группы заданий.
Для этого необходимо указать в качестве параметра name имя конкретного задания или группы
заданий и символ «#», например, "Begin3#" или
"Begin#". Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся
в разделе, посвященном демонстрационному режиму задачника.
Если метод Task вызывается в программе несколько раз, то все
последующие его вызовы игнорируются. Исключением является ситуация, когда
метод используется для генерации html-страницы с описанием нескольких заданий или групп
заданий; в этом случае учитываются все вызовы данного метода.
Методы группы Get обеспечивают ввод исходных данных в программу,
выполняющую учебное задание. Они должны вызываться после вызова метода Task;
в случае их вызова до вызова метода Task при запуске программы будет выведено
сообщение об ошибке «В начале программы не вызвана процедура Task с
именем задания».
Следует обратить внимание на то, что в варианте задачника для языков
платформы .NET (C# и VB.NET) методы ввода оформлены как функции (в то время
как варианты задачника для языков Pascal, Visual Basic и C++ для ввода используют
процедуры). Это соответствует общей идеологии стандартной библиотеки .NET
Framework, в которой ввод данных всегда выполняется с помощью функций.
Используемая функция ввода должна соответствовать типу очередного элемента
исходных данных; в противном случае выводится сообщение об ошибке
«Неверно указан тип при вводе исходных данных» (такое сообщение
будет выведено, например, если очередной элемент данных является символом, а для
его ввода используется функция GetInt).
При попытке ввести больше исходных данных, чем это предусмотрено в
задании, выводится сообщение об ошибке «Попытка ввести лишние исходные
данные». Если исходные данные, необходимые для решения задания, введены
не полностью, то выводится сообщение «Введены не все требуемые исходные
данные».
Метод Put обеспечивает вывод на экран результирующих данных, найденных
программой, и их сравнение с контрольными данными (т. е. с правильным
решением). Как и методы группы Get, метод Put должен вызываться после вызова
метода Task; в противном случае при запуске программы будет выведено сообщение
об ошибке «В начале программы не вызвана процедура Task с именем
задания».
Благодаря использованию параметра-массива, снабженного атрибутом params,
при вызове метода Put можно указывать произвольное число параметров. Параметры
могут иметь тип bool, int, long, double, char, string, Node для C# и Boolean, Integer,
Long, Double, Char, String, Node для VB.NET. В качестве параметров метода Put
можно указывать не только переменные, но и выражения (в частности, константы
соответствующего типа, а также нулевую ссылку null для C#, Nothing для
VB.NET). Заметим, что нулевые ссылки, как и объекты типа Node, требуется
выводить только в заданиях групп Dynamic
и Tree. Если в списке параметров указываются
параметры недопустимого типа, то при выполнении программы выводится
сообщение об ошибке «В методе Put указан параметр недопустимого
типа».
Тип параметра должен не только быть допустимым, но и соответствовать типу
очередного элемента результирующих данных; в противном случае выводится
сообщение об ошибке «Неверно указан тип при выводе результатов».
Как и в случае методов группы Get, при вызовах метода Put программа
осуществляет контроль за соответствием количества требуемых и выведенных
результирующих данных. Если программа выведет недостаточное или избыточное
количество результирующих данных, то после проверки этих данных появится
сообщение «Выведены не все результирующие данные» или,
соответственно, «Попытка вывести лишние результирующие данные».
Вывод отладочной информации
Методы Show, ShowLine и HideTask были добавлены в класс PT в версии 4.9 задачника Programming Taskbook.
С их помощью можно выводить отладочную информацию
непосредственно в окно задачника (в специальный раздел отладки).
Метод Show отображает элемент данных
в разделе отладки окна задачника. В качестве параметра a можно указывать элемент данных
любого типа; этот элемент будет автоматически преобразован к своему строковому представлению.
Если текущая экранная строка в разделе отладки уже содержит некоторый текст, то
выводимая строка снабжается начальным пробелом и приписывается к предшествующему тексту,
за исключением случая, когда при таком приписывании размер
полученного текста превысит ширину области данных (равную 80 символам).
В последнем случае вывод строки осуществляется с начала
следующей экранной строки; если же и в этой ситуации строка превысит
ширину области данных, то строка будет выведена на нескольких
экранных строках, причем разрывы текста будут выполняться по
пробельным символам строки, а при отсутствии пробелов при
достижении очередного фрагмента строки длины, равной 80.
Строковый параметр a может содержать явные команды перехода на новую
экранную строку. В качестве таких команд можно использовать или
символ с кодом 13 («возврат каретки» '\r' для C#, ChrW(13) для VB.NET),
или символ с кодом 10 («переход на новую
строку» '\n' для C#, ChrW(10) для VB.NET), или их комбинацию в
указанном порядке ("\r\n" для C#, ChrW(13) & ChrW(10) для VB.NET).
С помощью операции сцепления (+ в C#, & в VB.NET) можно выводить
в раздел отладки числовые данные вместе с предшествующим комментарием, например:
[C#]
Show("a = " + a);
[VB.NET]
Show("a = " & a);
Здесь a переменная числового типа.
Метод ShowLine является модификацией метода Show; после вывода данных в раздел отладки
он дополнительно осуществляет автоматический переход на следующую экранную строку.
Если метод ShowLine вызывается без параметров, то он
просто обеспечивает переход на новую экранную строку в разделе отладки.
Метод HideTask обеспечивает автоматическое скрытие всех разделов окна
задачника, кроме раздела отладки. Если раздел отладки в окне задачника
не отображается (в частности, если программа запущена в
демонстрационном режиме), то вызов метода HideTask игнорируется.
Игнорируются также все повторные вызовы данного метода.
Скрыть/восстановить основные разделы окна
задачника после его отображения на экране можно также с помощью клавиши
пробела или соответствующей команды контекстного меню раздела
отладки.
Класс Node: общее описание
[C#]
public sealed class Node: object, IDisposable
{
// Конструкторы:
public Node();
public Node(int aData);
public Node(int aData, Node aNext);
public Node(int aData, Node aNext, Node aPrev);
public Node(Node aLeft, Node aRight, int aData);
public Node(Node aLeft, Node aRight, int aData,
Node aParent);
// Свойства:
public int Data { get; set; }
public Node Next { get; set; }
public Node Prev { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
public Node Parent { get; set; }
// Метод, освобождающий ресурсы, используемые объектом Node:
public void Dispose();
}
[VB.NET]
Public NotInheritable Class Node
Inherits Object
Implements IDisposable
' Конструкторы:
Public Sub New()
Public Sub New(aData As Integer)
Public Sub New(aData As Integer, aNext As Node)
Public Sub New(aData As Integer, aNext As Node, _
aPrev As Node)
Public Sub New(aLeft As Node, aRight As Node, _
aData As Integer)
Public Sub New(aLeft As Node, aRight As Node, _
aData As Integer, aParent As Node)
' Свойства:
Public Property Data() As Integer
Public Property Next() As Node
Public Property Prev() As Node
Public Property Left() As Node
Public Property Right() As Node
Public Property Parent() As Node
' Метод, освобождающий ресурсы, используемые объектом Node:
Public Sub Dispose() Implements IDisposable.Dispose
End Class
Класс Node используется в заданиях групп Dynamic
и Tree. В заданиях на
стеки и очереди (Dynamic1Dynamic28) при работе с объектами типа Node
используются только свойства Data и Next; в заданиях на двусвязные списки
(Dynamic29Dynamic80) используются свойства Data, Next и Prev. В большинстве заданий на
бинарные деревья (группа Tree) используются свойства Data, Left и Right;
в заданиях на обработку бинарных деревьев с обратной связью
(Tree48Tree56 и Tree70Tree71) дополнительно используется свойство Parent.
Варианты конструктора класса Node позволяют задавать значения требуемых свойств при создании
объекта; прочие свойства инициализируются нулевыми значениями
(числом 0 для свойства Data, нулевой ссылкой null/Nothing для остальных свойств).
Следует обратить внимание на то, что данный класс реализует интерфейс
IDisposable, поэтому при завершении работы с объектом типа Node требуется вызвать
его метод Dispose, освобождающий неуправляемые ресурсы, выделенные для этого
объекта (исключение делается только для тех объектов, которые передаются обратно
задачнику в качестве результирующих данных). Если в задании требуется вызвать
метод Dispose для некоторых объектов, но этот вызов не выполняется, то при запуске
программы выводится сообщение об ошибке «Не вызван метод Dispose для
объекта типа Node».
Все исходные и результирующие данные-ссылки в заданиях группы Dynamic
имеют тип Node; их ввод и вывод должен осуществляться с помощью методов
GetNode и Put класса PT.
|