Вспомогательные классы задачника
Приведенный в данном пункте класс PT описан в файле PT.java.
Данный файл входит в состав дистрибутива задачника Programming Taskbook и автоматически
подключается к любому проекту-заготовке, созданному для выполнения задания на языке Java.
Класс PT: общее описание
public class PT
{
// Метод, инициализирующий задание:
public static void task(String name)
// Методы, обеспечивающие ввод исходных данных:
public static boolean getBoolean()
public static int getInt()
public static double getDouble()
public static char getChar()
public static String getString()
public static Node getNode()
// Метод, обеспечивающий вывод результатов:
public static void put(Object... a)
// Методы, предназначенные для отладки программ:
public static void show(Object a)
public static void showLine(Object a)
public static void showLine()
public static void hideTask()
}
Класс PT предоставляет средства для инициализации требуемого задания,
организации ввода-вывода данных, а также вывода отладочной информации.
В программах на языке Java решение
задания оформляется в виде функции solve (метода класса потомка PT),
в которой и вызываются методы класса PT. В программе не требуется создавать объекты класса PT,
поскольку все его методы являются классовыми.
В двух следующих пунктах описываются особенности, связанные с различными методами класса PT.
Инициализация заданий, ввод-вывод данных
Метод task инициализирует задание с указанным именем name. Он должен
вызываться в начале метода solve, выполняющего это задание (до вызова методов
ввода-вывода getput). Если в методе solve, не вызван метод task, то при
запуске программы будет выведено окно с сообщением «Не вызвана функция task
с именем задания».
Имя задания name должно включать имя группы заданий и порядковый номер в
пределах группы (например, "Begin3" ). Регистр букв в имени группы может быть
произвольным. Если указана неверная группа, то программа выведет сообщение об
ошибке «Указана неверная тема задания»
(список всех доступных групп можно получить с помощью программных модулей PT4Demo и PT4Load). Если указан
недопустимый номер задания, то программа выведет сообщение, в котором будет
указан диапазон допустимых номеров для данной группы. Если после имени задания
в параметре name указан суффикс «?» (например, "Begin3?" ), то
программа будет работать в демонстрационном режиме.
Метод task может также использоваться для
генерации и вывода на экран html-страницы с текстом задания или группы заданий.
Для этого необходимо указать в качестве параметра name имя конкретного задания или группы
заданий и суффикс «#», например, "Begin3#" или
"Begin#" . Дополнительные сведения о генерации html-страниц с описаниями заданий приводятся
в разделе, посвященном демонстрационному режиму задачника.
Начиная с версии 4.13, задачник обеспечивает автоматическое тестирование программы на нескольких
наборах исходных данных при ее однократном запуске. Для отключения этой возможности достаточно
указать в параметре Name после имени задания суффикс «!» (например, "Begin3!" );
в этом случае при запуске программы она будет протестирована на единственном наборе исходных данных,
и для проверки правильности решения программу потребуется запустить несколько раз (как в предыдущих версиях
задачника).
Если метод task вызывается в программе несколько раз, то все
последующие его вызовы игнорируются. Исключением является ситуация, когда
метод используется для генерации html-страницы с описанием нескольких заданий или групп
заданий; в этом случае учитываются все вызовы данного метода.
Начиная с версии 4.12, параметр name может содержать суффикс «_ru»
или «_en», позволяющий явным образом задать язык интерфейса
(русский или английский соответственно) для окна задачника и выполняемого задания.
В версиях 4.124.14 специальные суффиксы «?», «#» и «!» должны указываться перед данным суффиксом,
например, "Begin3#_en" ; начиная с версии 4.15, суффиксы могут указываться в любом порядке.
В случае нескольких вызовов метода task (для генерации
html-страницы) учитывается только суффикс, указанный при первом вызове метода.
При отсутствии суффикса используется язык интерфейса, определенный в качестве основного для данного рабочего каталога
(в универсальном варианте задачника основной язык интерфейса можно настроить с помощью программного модуля PT4Load,
используя его контекстное меню).
Методы группы get обеспечивают ввод исходных данных в программу,
выполняющую учебное задание. Они должны вызываться после вызова метода task;
в случае их вызова до вызова метода task при запуске программы будет выведено
сообщение об ошибке «В начале программы не вызвана функция task с
именем задания».
Используемая функция ввода должна соответствовать типу очередного элемента
исходных данных; в противном случае выводится сообщение об ошибке
«Неверно указан тип при вводе исходных данных» (такое сообщение
будет выведено, например, если очередной элемент данных является символом, а для
его ввода используется функция getInt).
При попытке ввести больше исходных данных, чем это предусмотрено в
задании, выводится сообщение об ошибке «Попытка ввести лишние исходные
данные». Если исходные данные, необходимые для решения задания, введены
не полностью, то выводится сообщение «Введены не все требуемые исходные
данные».
Метод put обеспечивает вывод на экран результирующих данных, найденных
программой, и их сравнение с контрольными данными (т. е. с правильным
решением). Как и методы группы get, метод put должен вызываться после вызова
метода task; в противном случае при запуске программы будет выведено сообщение
об ошибке «В начале программы не вызвана функция task с именем
задания».
Благодаря использованию параметра типа Object, снабженного многоточием,
при вызове метода put можно указывать произвольное число параметров. Параметры
могут иметь тип boolean, int, double, char, String и Node. В качестве параметров метода put
можно указывать не только переменные, но и выражения (в частности, константы
соответствующего типа, а также нулевую ссылку null.
Заметим, что нулевые ссылки, как и объекты типа Node, требуется
выводить только в заданиях групп Dynamic
и Tree (и их аналогов GCDyn и GCTree, появившихся в версии задачника 4.15).
При попытке указания данных других типов
программа генерирует стандартное исключение IllegalArgumentException с сообщением об ошибке
«The put method has an argument of invalid type» (сообщение на английском языке означает, что
данная ошибка обнаружена без обращения к ядру задачника).
Тип параметра должен не только быть допустимым, но и соответствовать типу
очередного элемента результирующих данных; в противном случае выводится
сообщение об ошибке «Неверно указан тип при выводе результатов».
При вызове метода put программа
осуществляет контроль за соответствием количества требуемых и выведенных
результирующих данных. Если программа выведет недостаточное или избыточное
количество результирующих данных, то после проверки этих данных появится
сообщение «Выведены не все результирующие данные» или,
соответственно, «Попытка вывести лишние результирующие данные».
Класс Node
public static class Node
{
// Конструкторы:
public Node()
public Node(int data)
public Node(int data, Node next)
public Node(int data, Node next, Node prev)
public Node(Node left, Node right, int data)
public Node(Node left, Node right, int data, Node parent)
// Свойства:
public int getData()
public void setData(int value)
public Node getNext()
public void setNext(Node value)
public Node getPrev()
public void setPrev(Node value)
public Node getLeft()
public void setLeft(Node value)
public Node getRight()
public void setRight(Node value)
public Node getParent()
public void setParent(Node value)
// Метод, освобождающий ресурсы, используемые объектом Node:
public void dispose()
}
Класс Node является внутренним классом класса PT;
он используется в заданиях групп Dynamic
и Tree и их аналогов GCDyn и GCTree. В заданиях на
стеки и очереди (Dynamic1Dynamic28) при работе с объектами типа Node
используются только свойства Data и Next; в заданиях на двусвязные списки
(Dynamic29Dynamic80) используются свойства Data, Next и Prev. В большинстве заданий на
бинарные деревья (группа Tree) используются свойства Data, Left и Right;
в заданиях на обработку бинарных деревьев с обратной связью
(Tree48Tree56 и Tree70Tree71) дополнительно используется свойство Parent.
Варианты конструктора класса Node позволяют задавать значения требуемых свойств при создании
объекта; прочие свойства инициализируются нулевыми значениями
(числом 0 для свойства Data, нулевой ссылкой null для остальных свойств).
При завершении работы с объектом типа Node требуется вызвать
его метод dispose, освобождающий ресурсы, выделенные для этого
объекта (исключение делается только для тех объектов, которые передаются обратно
задачнику в качестве результирующих данных). Если в задании требуется вызвать
метод dispose для некоторых объектов, но этот вызов не выполняется, то при запуске
программы выводится сообщение об ошибке «Не вызван метод dispose для
объекта типа Node». При выполнении заданий групп GCDyn и GCTree, появившихся в версии 4.15,
использовать метод dispose не требуется.
Все исходные и результирующие данные-ссылки в заданиях группы Dynamic
имеют тип Node; их ввод и вывод должен осуществляться с помощью методов
getNode и put класса PT.
Вывод отладочной информации
С помощью описываемых далее методов можно выводить отладочную информацию
непосредственно в окно задачника (в специальный раздел отладки).
Начиная с версии 4.22, в раздел отладки можно выводить текстовые данные,
содержащие любые символы Юникода.
Метод show отображает элемент данных
в разделе отладки окна задачника. В качестве параметра a можно указывать элемент данных
любого типа; этот элемент будет автоматически преобразован к своему строковому представлению.
Если текущая экранная строка в разделе отладки уже содержит некоторый текст, то
выводимая строка снабжается начальным пробелом и приписывается к предшествующему тексту,
за исключением случая, когда при таком приписывании размер
полученного текста превысит ширину области данных (равную 80 символам).
В последнем случае вывод строки осуществляется с начала
следующей экранной строки; если же и в этой ситуации строка превысит
ширину области данных, то строка будет выведена на нескольких
экранных строках, причем разрывы текста будут выполняться по
пробельным символам строки, а при отсутствии пробелов при
достижении очередного фрагмента строки длины, равной 80.
Строковый параметр a может содержать явные команды перехода на новую
экранную строку. В качестве таких команд можно использовать или
символ с кодом 13 («возврат каретки» '\r' ),
или символ с кодом 10 («переход на новую
строку» '\n' ), или их комбинацию в
указанном порядке ("\r\n" ).
С помощью операции сцепления + можно выводить
в раздел отладки числовые данные вместе с предшествующим комментарием, например:
show("a = " + a);
Здесь a переменная числового типа.
Метод showLine является модификацией метода show; после вывода данных в раздел отладки
он дополнительно осуществляет автоматический переход на следующую экранную строку.
Если метод showLine вызывается без параметров, то он
просто обеспечивает переход на новую экранную строку в разделе отладки.
Метод hideTask обеспечивает автоматическое скрытие всех разделов окна
задачника, кроме раздела отладки. Если раздел отладки в окне задачника
не отображается (в частности, если программа запущена в
демонстрационном режиме), то вызов метода hideTask игнорируется.
Игнорируются также все повторные вызовы данного метода.
Скрыть/восстановить основные разделы окна
задачника после его отображения на экране можно также с помощью клавиши
пробела или соответствующей команды контекстного меню раздела
отладки.
|