PascalABC.NET

Модуль PT4TaskMakerNET: общее описание


Назначение и состав конструктора учебных заданий

Конструктор учебных заданий PT4TaskMaker позволяет разрабатывать новые группы заданий для электронного задачника Programming Taskbook.

Начиная с версии 4.11, новые группы заданий, доступные для всех поддерживаемых задачником сред, можно разрабатывать не только на языке Pascal, но и на языках C++ и C#, причем конструктор для языка Pascal можно использовать и в среде PascalABC.NET. Конструктор для среды PascalABC.NET реализован в виде модуля PT4TaskMakerNET.

Каждая группа учебных заданий оформляется в виде отдельной динамической библиотеки (dll-файла). Dll-файлы с новыми группами могут находиться либо в рабочем каталоге учащегося, либо в подкаталоге Lib системного каталога задачника. Подключение новых групп происходит автоматически при инициализации задания, поэтому вид проекта-заготовки при работе с новыми группами не отличается от стандартного вида проекта, ориентированного на базовые группы заданий. Кроме того, новые группы автоматически добавляются в список доступных групп в программных модулях PT4Demo и PT4Load. Созданные в виде dll-файлов новые группы заданий могут использоваться не только в любых средах программирования, поддерживаемых универсальным вариантом задачника, но и в среде PascalABC.NET; для этого достаточно разместить dll-файл в подкаталоге PT4\Lib системного каталога PascalABC.NET или в рабочем каталоге учащегося.

Обзор элементов конструктора учебных заданий

Конструктор учебных заданий представляет собой набор констант, функций и процедур, предназначенных для определения каждого из входящих в группу заданий, а также для настройки свойств группы в целом.

Ниже перечислены элементы, входящие в конструктор PT4TaskMaker:

  • процедурный тип TInitTaskProc; в библиотеке с группой заданий должна быть определена основная процедура группы типа TInitTaskProc, позволяющая генерировать задание с требуемым номером;
  • процедура CreateGroup, определяющая общие характеристики группы заданий;
  • процедуры и константы, используемые для создания нового задания и добавления в него формулировки, а также исходных и контрольных данных базовых типов (логического, целочисленного, вещественного, символьного строкового); обычно каждое задание оформляется в виде отдельной процедуры, которая вызывается из основной процедуры группы;
  • процедура UseTask, позволяющая импортировать в создаваемую группу задания из других групп; эта процедура обычно вызывается в основной процедуре группы;
  • процедуры, обеспечивающие добавление комментариев, оформляемых в виде преамбулы к группе и ее подгруппам;
  • функции и константы, позволяющие определить текущее состояние задачника (используемый язык программирования, текущую локаль — русскую или английскую —, текущую версию задачника, а также номер текущего тестового испытания программы, выполняющей задание);
  • функции, предоставляющие разработчику заданий образцы слов, предложений и многострочных текстов;
  • процедуры, позволяющие включать в задание файловые данные;
  • процедуры, позволяющие включать в задание указатели и динамические структуры данных — линейные списки и деревья;
  • процедуры для разработки заданий по параллельному MPI-программированию.

Библиотечные и сводные группы

При разработке новых заданий целесообразно объединять их в группы с именами, содержащими, кроме названия темы, дополнительные сведения, например, версию созданной группы и данные об авторе. Однако допустимые имена групп могут содержать не более 9 символов, что является недостаточным для указания дополнительных сведений. С другой стороны, группы, содержащие только новые задания (библиотечные группы), вряд ли будут использоваться непосредственно в учебном процессе; более целесообразной будет компоновка этих новых заданий с заданиями из соответствующей базовой группы задачника (и, возможно, с заданиями из других библиотечных групп).

Поэтому при разработке группы, содержащей исключительно новые задания (библиотечной группы, или библиотеки заданий) разрешено указывать имя длины более 9 символов (но не более 25).

Библиотечные группы не предназначены для непосредственного использования в учебном процессе. Задания из этих групп можно запускать с помощью процедуры Task, однако они будут отображаться только в демонстрационном режиме (точнее, в режиме «просмотра библиотеки заданий», о чем будет свидетельствовать соответствующий текст, указываемый в окне задачника вместо сведений об учащемся). Библиотечные группы не включаются в список групп, отображаемый в модуле PT4Load, однако доступны для просмотра с помощью модуля PT4Demo (в этом модуле библиотечные группы указываются в конце списка групп).

Для применения на занятиях удобно использовать сводные группы, не содержащие реализации новых заданий, а лишь импортирующие наборы заданий из базовых и дополнительных библиотечных групп и компонующие их в порядке, который требуется преподавателю. При импортировании задания из другой группы у него изменяется название и ключ (которые берутся из характеристик сводной группы), однако сохраняются такие характеристики импортируемой группы, как заголовки подгрупп и сведения об авторе. Имена сводных групп должны содержать не более 9 символов.

Структура проекта с описанием группы заданий

В данном разделе описываются правила, которым должен удовлетворять проект (dll-библиотека), содержащий описание новой группы заданий (см. также раздел «Примеры»).

Каждый проект, реализуемый в виде dll-библиотеки, должен содержать определение единственной группы заданий. Имя библиотеки с группой заданий должно иметь вид PT4<имя группы><маркер локали>, где <маркер локали> является либо пустой строкой, либо имеет вид _ru или _en. Например, группа TMDemoPas может быть реализована в виде библиотек PT4TMDemoPas.dll, PT4TMDemoPas_ru.dll и PT4TMDemoPas_en.dll. Библиотеки с явно указанным маркером локали используются только в варианте задачника, соответствующем данной локали (ru — в русском варианте задачника, en — в английском). Библиотеки, в которых не указан маркер локали, используются в любом варианте задачника (если они не перекрываются библиотекой с явно указанной локалью). Порядок поиска библиотек для требуемой группы следующий: вначале просматривается рабочий каталог учащегося и в нем ищется библиотека с данным именем и явно указанной локалью; если она не найдена, то ищется библиотека с данным именем без маркера локали; если она не найдена, то поиск библиотек (в этом же порядке) выполняется в каталоге Lib системного каталога задачника.

Проект с описанием новой группы должен иметь определенную структуру. Приведем описание структуры проекта, который реализуется на языке Pascal в среде PascalABC.NET:

library PT4MakerDemo;

uses PT4TaskMakerNET;

// процедуры, реализующие конкретные задания
...

procedure InitTask(num: integer);
begin
  // в данной процедуре выполняются вызовы вспомогательных процедур,
  // реализующих все задания группы; номер задания определяется
  // параметром num; для определения процедуры, соответствующей
  // требуемому номеру, обычно используется оператор case
  ...
end;

procedure inittaskgroup;
begin
  // вспомогательная процедура, в которой выполняется вызов стартовой
  // процедуры CreateGroup и могут вызываться процедуры, связанные
  // с добавлением комментариев (преамбул) для группы и ее подгрупп.
  // Все буквы в ее имени должны быть строчными

  CreateGroup('TMDemoAbc', 'Примеры различных задач (конструктор для языка PascalABC.NET)',
    'М. Э. Абрамян, 2013', 'qwqfsdf13dfttd', 8, InitTask);
  ...
end;

procedure activate(S: string);
begin
  // вспомогательная процедура, используемая при подключении библиотеки
  // к задачнику. Все буквы в ее имени должны быть строчными

  ActivateNET(S);
end;

begin
end.

При определении новой группы заданий можно учитывать текущий язык программирования, установленный для задачника, и в зависимости от этого языка по-разному инициализировать некоторые задания группы. Эта возможность является особенно полезной при реализации заданий, связанных с обработкой динамических структур данных, поскольку в языках Visual Basic и 1C подобные задания должны быть недоступны, а в языках Pascal и C++ они должны оформляться по-другому, нежели в языках платформы .NET, Python и Java. См. также пункт, посвященный динамическим структурам данных, в разделе «Примеры».

Разрабатываемые группы заданий желательно снабжать дополнительными комментариями. Эти комментарии не отображаются в окне задачника, однако включаются в html-описание группы в виде преамбулы группы (html-описание группы можно создать, либо вызвав в программе процедуру Task с параметром вида '<имя группы>#', например, 'TMDemoAbc#', либо воспользовавшись кнопкой в окне среды PascalABC.NET. Кроме того, большие группы заданий целесообразно разделять на несколько подгрупп, в каждую из которых также можно добавлять комментарии (преамбулы подгрупп). В преамбулах, как и в формулировках заданий, можно использовать специальные управляющие последовательности, которые позволяют отформатировать текст требуемым образом (в частности, обеспечивают выделение переменных, позволяют использовать в тексте верхние и нижние индексы, специальные символы и т. д.). Форматирование используется и при отображении формулировки задания в окне задачника, и при генерации html-страницы с описанием группы заданий. См. также пункт, посвященный добавлению комментариев, в разделе «Примеры».

Настройка проектов для языка PascalABC.NET и особенности их отладки

Для разработки новой группы заданий в среде PascalABC.NET достаточно подготовить pas-файл с именем, совпадающим с именем создаваемой библиотеки, и структурой, описанной в пункте «Структура проекта с описанием группы заданий». Для данного файла должен быть доступен модуль PT4TaskMakerNET; он может размещаться в этом же каталоге или в подкаталоге Lib системного каталога среды PascalABC.NET.

При нажатии клавиши [F9] будет создана динамическая библиотека с новой группой заданий.

Поскольку в среде PascalABC.NET не предусмотрены средства для определения главного приложения при разработке библиотек, для тестирования новой группы заданий необходимо использовать еще одно приложение, заготовку для которого можно создать с помощью программного модуля PT4Load уже после первой успешной компиляции динамической библиотеки. Впрочем, заготовка является настолько простой, что ее можно создать и непосредственно. Например, для тестирования группы с именем TMDemoAbc достаточно воспользоваться следующей программой:

uses PT4;
begin
  Task('TMDemoAbc1?');
end.

При запуске этой программы на экран будет выведено окно задачника для группы TMDemoAbc в демонстрационном режиме, причем в качестве текущего будет выбрано первое задание данной группы (демонстрационный режим устанавливается благодаря символу «?», указанному после имени задания). Для отображения в окне задачника сразу после запуска программы другого существующего задания этой группы достаточно указать его номер в параметре процедуры Task. Можно также удалить номер, указав символ «?» сразу после имени группы заданий: Task('TMDemoAbc?'). В этом случае при запуске программы будет отображаться последнее задание, входящее в группу.