Programming Taskbook


E-mail:

Пароль:

Регистрация пользователя   Восстановление пароля

 

ЮФУ

Электронный задачник по программированию

©  М. Э. Абрамян (Южный федеральный университет), 1998–2022

 

Teacher Pack | Общие сведения | Внешние группы учебных заданий

PrevNext


Внешние группы учебных заданий

Общее описание

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

Электронный задачник Programming Taskbook предоставляет преподавателю обширный набор заданий по различным темам, связанным с базовым и продвинутыми курсами программирования, а также дополнительные средства для просмотра формулировок заданий и генерации программ-заготовок для различных языков и сред программирования. Файлы дополнений, появившиеся в версии 4.14 задачника, дают возможность разрабатывать индивидуальные заготовки для различных заданий, входящих в состав задачника.

Однако до версии 4.15 задачник не имел средств, упрощающих разработку и использование на лабораторных занятиях серий учебных программ различного назначения, включающих как демонстрационные программы, не связанные с конкретными заданиями из задачника, так и программы-заготовки различной степени детализации для решения определенного набора заданий (в том числе и входящих в задачник). Файлы дополнений, расширяющие возможности преподавателя по созданию индивидуальных программ-заготовок, не позволяли разрабатывать подобные серии программ по следующим причинам:

  • они не давали возможности выделить из имеющейся группы некоторую часть заданий, которую следовало рассмотреть на занятии,
  • они не позволяли описать в одном файле дополнений заготовки для заданий из различных групп,
  • они не имели средств для простого описания программ, не связанных с заданиями электронного задачника.

В то же время, идеи, положенные в основу использования файлов дополнений, вполне могли быть развиты в направлении, позволяющем создавать «расширенные» файлы дополнений, обладающие описанными выше дополнительными возможностями. В результате развития этих идей в версии 4.15 электронного задачника была реализована возможность создания и использования файлов внешних групп, которые можно рассматривать как файлы дополнений специального вида.

Файлы внешних групп могут содержать часть заданий из некоторой группы задачника, объединять задания из различных групп, а также включать заготовки заданий, не связанных с заданиями из задачника. Внешние группы могут подразделяться на несколько внешних наборов заданий (подобно тому, как группа RB для системы PascalABC.NET, содержащая задания для исполнителя Робот, подразделяется на несколько наборов, связанных с различными темами: циклы, условные операторы и т. п.). Таким образом, внешние группы позволяют гибко компоновать различные задания, обеспечивая для этого два уровня компоновки (группы–наборы). Кроме того, они не требуют разработки дополнительных динамических библиотек: для определения новой внешней группы достаточно описать ее в текстовом файле, используя формат файла дополнений и некоторые дополнительные переключатели, специфичные для файлов внешних групп.

Для создания заготовки задания из внешней группы, как и для обычного задания из задачника, достаточно использовать программный модуль PT4Load.

Следует заметить, что аналогичная расширенная функциональность была ранее частично реализована в системе PascalABC.NET, позволяя использовать программу PT4Load для генерации заготовок, связанных с исполнителями Робот и Чертежник (группы RB и DM соответственно, каждая из которых содержит несколько наборов заданий). Однако для подобного расширения доступных групп требовалось явное редактирование файла настроек loadpabc.dat, имеющего особый формат, и, кроме того, нельзя было задавать индивидуальные заготовки для различных заданий одной группы или одного набора и выполнять перекомпоновку и объединение этих заданий.

С появлением внешних групп подключение к программе PT4Load новых наборов заданий можно выполнить гораздо более простым и гибким способом: достаточно разместить в рабочем или системном каталоге новые текстовые файлы, аналогичные файлам дополнений. Кроме того, новые возможности доступны не только для системы PascalABC.NET, но и для других сред, поддерживаемых задачником.

Наряду с программой PT4Load внешние группы могут обрабатываться и новой версией программы PT4Demo, позволяющей просматривать задания из внешних групп в двух режимах: в окне задачника и в виде html-документа.

Для возможности использования внешних групп для конкретной среды необходимо, чтобы в подкаталоге задачника, связанном с данной средой (или в подкаталоге PT4 системного каталога PascalABC.NET при использовании среды PascalABC.NET) находился специальный файл загрузки с расширением dat и префиксом _load (например, для системы PascalABC.NET этот файл должен иметь имя _loadpabc.dat, для системы Lazarus — _loadlpr.dat и т. д.). Данный файл обеспечивает генерацию «заготовки по умолчанию» для любых заданий из внешних групп, не связанных с электронным задачником. При отсутствии этого файла внешние группы не обрабатываются программой PT4Load, хотя могут быть просмотрены в программе PT4Demo.

При организации просмотра внешних файлов программа PT4Demo использует специальную динамическую библиотеку PT-Ext.dll, которая должна находится в подкаталоге Lib системного каталога задачника. Если попытаться просмотреть содержимое внешнего файла дополнений при отсутствии библиотеки PT-Ext.dll, то будет выведено соответствующее сообщение об ошибке.

В версии задачника 4.22 появилась возможность создавать файлы внешних групп в кодировке UTF-8; для этого достаточно указать в какой-либо строке файла переключатель [UTF-8]. Более подробно эта возможность описана в соответствующем пункте раздела «Использование файлов дополнений».

Именование внешних групп

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

(1) префикс в имени файла внешней группы должен, наряду с текстом «PT4», содержать завершающий символ «-» (тире), например, PT4-ABC.txt;

(2) длина имени внешней группы может достигать 15 символов (в отличие от 9 символов для файлов дополнений, связанных с группами электронного задачника);

(3) допускается составное имя: «группа»–«набор», в котором имя группы отделяется от имени набора символом «-» (дефис). В этом (и только в этом) случае имя группы может оканчиваться цифрой (имя набора должно всегда оканчиваться буквой). Суммарная длина имени группы и имени набора (без учета дефиса) по-прежнему не должна превышать 15 символов.

Имена файлов внешних групп, как и обычных файлов дополнений, могут дополняться суффиксами, определяющими локаль («_ru» или «_en») и язык программирования (например, «_PascalABC_» или «[PascalABC]»). Порядок поиска файлов внешних групп совпадает с порядком поиска файлов дополнений.

Регистр в именах внешних групп учитывается при отображении группы в окне программы PT4Load (и при генерации имен программ-заготовок), но не учитывается при сравнении групп. Таким образом, например, для системы PascalABC.NET при наличии в рабочем каталоге двух файлов с именами PT4-ABC.txt и PT4-abc_PascalABC_.txt в набор доступных групп будет включена только группа abc из файла PT4-abc_PascalABC_.txt (так как в силу явного указания языка программирования файл PT4-abc_PascalABC_.txt будет обработан раньше, чем файл PT4-ABC.txt). Если же файл PT4-ABC.txt находится в рабочем каталоге, а файл PT4-abc_PascalABC_.txt — в системном каталоге (в случае PascalABC.NET это подкаталог PT4/Lib), то в набор групп будет включена группа ABC из файла PT4-ABC.txt, так как вначале обрабатываются файлы, обнаруженные в рабочем каталоге.

При наличии нескольких файлов с составными именами групп вида «группа»–«набор», в которых текст «группа» отличается только регистром букв, все эти файлы связываются с одной группой, имя которой совпадает с текстом «группа», взятым из первого (в алфавитном порядке) имени «группа»–«набор». Например, при наличии имен «DEMO-a», «Demo-b» и «demo-c» все они будут связаны с одной группой с именем «DEMO», так как имя в этом регистре связано с набором «a», который является первым в алфавитном порядке. Заметим, что при упорядочивании имен в алфавитном порядке регистр не учитывается; в частности, имя «a» считается большим, чем имя «B» (а цифры считаются меньшими, чем буквы).

Одновременное использование файлов с похожими простыми и составными именами групп может приводить к конфликтам, которые разрешаются следующим образом. Если имеется несколько файлов, для которых имена групп или составные имена «группа»–«набор» будут совпадать, если из них удалить дефис и не учитывать регистр букв, то будет обработан только файл с составным именем, имеющий имя группы наименьшей длины; прочие файлы будут исключены из рассмотрения (например, при наличии файлов PT4-ABCD.txt, PT4-A-BCD.txt, PT4-AB-CD.txt и PT4-ABC-D.txt будет обработан только второй файл, определяющий набор BCD для группы A). Если после исключения описанных выше файлов окажется, что имеется файл с простым именем группы «группа» и файл с составным именем «группа»–«набор», причем имена групп в этих файлах совпадают (без учета регистра букв), то первый файл (с именем «группа») не будет обрабатываться. Например, при наличии файлов PT4-A.txt и PT4-AB.txt в том же каталоге, в котором расположены приведенные выше четыре файла, файл PT4-A.txt обработан не будет, поскольку он конфликтует с файлом PT4-A-BCD.txt, определяющим ту же группу A и набор BCD. Заметим, что файл PT4-AB.txt будет обработан, так как он не конфликтует с файлом PT4-A-BCD.txt, а файл PT4-AB-CD.txt, с которым он мог бы конфликтовать, был ранее исключен из рассмотрения как конфликтующий с файлом PT4-A-BCD.txt.

Имена внешних групп не могут совпадать с именами стандартных или дополнительных групп, входящих в состав задачника.

Для варианта задачника, включенного в систему PascalABC.NET, имеется еще одно ограничение на имена внешних групп: в качестве имен таких групп нельзя использовать имена, совпадающие с именами групп RB и DM с наборами заданий для исполнителей Робот и Чертежник (как простыми, так и составными, например, запрещены не только имена RB и DM, но и имена RBa, RB-a, DMa, DM-a, поскольку в стандартные группы RB и DM входит набор с именем a).

В списке доступных групп, отображаемом в окне программы PT4Load, вначале располагаются стандартные группы электронного задачника (в случае варианта задачника, связанного с PascalABC.NET, перед этими группами указываются стандартные группы RB и DM), затем дополнительные группы электронного задачника, определенные в dll-файлах, например, группы заданий по подготовке к ЕГЭ или по технологии LINQ (в алфавитном порядке), и в конце списка — внешние группы (также в алфавитном порядке). Заметим, что в списке указываются только имена групп заданий; если с какой-либо внешней группой связаны несколько наборов, то для получения списка этих наборов надо ввести имя группы. Отмеченная особенность позволяет сократить размер списка групп, выводимого в окне программы PT4Load.

Порядок расположения доступных групп в соответствующем выпадающем списке, расположенном в окне программы PT4Demo, совпадает с описанным выше: вначале идут стандартные группы задачника, затем его дополнительные группы (определенные в dll-файлах), а в конце — внешние группы. При этом имена внешних групп дополнительно снабжаются начальным дефисом, а если имя является составным, то дефис указывается также между именем группы и именем набора. Таким образом, в списке программы PT4Demo отображаются и имена всех доступных групп, и имена наборов, входящих в эти группы.

Особенности определения заготовок для заданий из внешних групп

В файлах, определяющих внешние группы, можно использовать все переключатели и управляющие последовательности, доступные для файлов дополнений. В частности, можно использовать переключатели языка и переключатели номера.

Для успешной обработки файла, определяющего внешнюю группу, требуется, чтобы в нем был определен хотя бы один номер, связанный с текущим языком программирования (иными словами, чтобы в пределах действия переключателя для данного языка, например [=PascalABC], содержался хотя бы один переключатель номера). Переключатель языка может отсутствовать, если в имени файла присутствует суффикс, определяющий язык (например, «_PascalABC_» или «[PascalABC]»). Напомним, что суффикс, определяющий язык, может обрамляться либо квадратными скобками, либо символами подчеркивания. Символы подчеркивания рекомендуется использовать, если файл, определяющий внешнюю группу, предполагается размещать в удаленных репозиториях.

Максимальный номер из тех номеров, которые связаны в файле внешней группы с текущим языком программирования, определяет количество заданий в определяемой группе (или наборе). Если для каких-либо меньших номеров файл не содержит заготовок, то для этих номеров создаются стандартные заготовки, определенные в специальном шаблонном файле PT4__.txt (с двумя символами подчеркивания), размещенном в подкаталоге Lib системного каталога задачника. По умолчанию этот файл создает пустую программу. Например, для языка PascalABC.NET эта программа имеет следующий вид:

     begin
     end.

Отсутствие текста заготовки для какого-либо задания внешней группы почти всегда должно рассматриваться как ошибка разработчика группы (поскольку стандартная заготовка, определенная в файле PT4__.txt, не является содержательной программой). Однако имеется важное исключение, связанное с заданиями из электронного задачника, включаемыми во внешние группы. Если для некоторого номера задания внешней группы указан переключатель #, определяющий задание из задачника и подробно описываемый далее, то при отсутствии текста заготовки для задания с этим номером (или в случае указания начального фрагмента заготовки, в котором отсутствует оператор вызова метода task) создается стандартная заготовка, соответствующая той группе, к которой относится выбранное задание (а в случае явного указания начального фрагмента заготовки этот фрагмент добавляется в начало стандартной заготовки). Например, при использовании переключателя [#ExamBegin1] будет создана стандартная заготовка для задания группы ExamBegin1 (содержащая в случае языка PascalABC.NET директиву подключения модуля PT4Exam).

Если для указанного задания определена специальная заготовка (указанная в файле дополнений, связанном с данной группой заданий), то именно она используется в качестве стандартной при обработке внешних групп. Например, при создании стандартных заготовок для заданий группы ExamCheck будут использованы заготовки, определенные в файле дополнений PT4ExamCheck_ru.txt.

Стандартные заготовки не отображаются в окне задачника и в html-документе при просмотре внешней группы с помощью модуля PT4Demo.

В качестве примера файлов, определяющих внешние группы, можно использовать демонстрационные файлы, входящие в состав программы PTVarMaker, начиная с версии 3.0 (см. команды «? | 5 Пример внешней группы (PT4)» и «? | 6 Пример внешней группы (PABC)»).

Настройки файлов внешних групп

Строки, расположенные в файле внешней группы до первого переключателя, считаются комментариями и не обрабатываются. Исключение составляют строки, начинающиеся с текста «Topic1=», «Topic2=» и «Author=» (регистр букв в этих словах не учитывается).

Строка, следующая за текстом «Topic1=», определяет описание группы. Назначение строки, следующей за текстом «Topic2=», зависит от того, является ли имя группы простым или составным. В случае простого имени текст, связанный с «Topic2=», считается дополнительным описанием данной группы (если основное описание отсутствует, то в качестве основного используется описание, указанное в разделе «Topic2=»). Если имя группы является составным (вида «группа»–«набор»), то текст, связанный с «Topic2=», считается описанием набора, определенного в этой внешней группе. Строки описаний используются при выводе информации о группе в программах PT4Load и PT4Demo.

Строка, начинающаяся с текста «Author=», определяет сведения об авторе внешнего файла (а также о годе разработки внешней группы и т. п.). При наличии данных сведений они отображаются в начальной части html-документа, сгенерированного программой PT4Demo для данной внешней группы; в программе PT4Load эта информация не используется.

В конце любой из строк, начинающихся с текста «Topic1=», «Topic2=» и «Author=», не следует указывать точку (если точка, тем не менее, указана, то она автоматически удаляется).

Для определения описания группы в случае составных имен «группа»–«набор» с одинаковыми именами «группа» достаточно указать это описание (в разделе «Topic1=») в единственном файле с подобным именем. Если описание группы указывается в нескольких таких файлах, то выбирается то из них, которое связано с первым в алфавитном порядке набором (пустые описания группы не учитываются). Например, если во всех файлах для групп demo-a, demo-b, demo-c будет определено непустое описание группы demo, то будет использовано описание группы из файла demo-a.

Перед первым символом в описании группы или набора можно указать модификатор «^»; это предотвратит преобразование регистра первого символа в нижний в ситуации, когда желательно всегда использовать верхний регистр (например, в аббревиатурах вида ЕГЭ или LINQ).

При выводе описания внешней группы в программе PT4Demo используются следующие правила:

(1) если имя файла внешней группы не содержит имени набора (т. е. не содержит второго дефиса), то основное и дополнительное описания группы объединяются (после основного описания добавляется точка) и отображаются в окне программы PT4Demo, а также в окне электронного задачника и в html-документе (причем в окне PT4Demo текст отображается на двух экранных строках: на первой строке основное описание, на второй — дополнительное);

(2) если имя файла внешней группы включает имя набора, то, как было сказано выше, раздел «Topic1» считается описанием группы, а раздел «Topic2» — описанием набора, причем описание группы может браться из другого файла, связанного с этой же группой (и другим ее набором). В этом случае в окне программы PT4Demo на отдельных строках отображаются описания группы и набора, в html-документе описание группы является его заголовком, а описание набора — подзаголовком; в окне задачника в качестве описания используется описание набора.

Если во внешней группе используется задание из задачника, то в окне задачника вместо описания внешней группы приводится описание темы, к которой относится данное задание.

В файле, определяющем внешнюю группу, можно задавать текст преамбулы группы, а если файл определяет набор в пределах группы, то можно задавать различные тексты для преамбулы группы и преамбулы набора. Для определения преамбулы внешней группы используются те же переключатели, что и для определения преамбулы в файле дополнений. Текст преамбулы будет отображаться в html-документе, сгенерированном программой PT4Demo для данной внешней группы. Преамбулы, определенные в стандартных группах задачника, во внешних группах не используются, чтобы не перегружать дополнительной информацией создаваемой html-документ. По этой же причине в html-документ с описанием внешней группы не включаются заголовки и подзаголовки из стандартных групп задачника, даже если во внешней группе используются задания из этих стандартных групп. Html-описание внешней группы всегда имеет единственный заголовок и может иметь единственный подзаголовок, если имя группы является составным.

Переключатель [*]

При оформлении «устоявшегося» набора заготовок (подобных наборам, связанным с группами заданий из электронного задачника) возможность явного указания номера для каждой заготовки (и использования одного и того же номера в нескольких местах файла дополнений) повышает наглядность создаваемого текста. Однако в процессе разработки и перекомпоновки заданий для внешних групп необходимость явного указания номера задания может создавать проблемы. Например, при добавлении или удалении задания во внешнюю группу потребуется откорректировать номера всех последующих заготовок.

Для того чтобы минимизировать подобные проблемы, в версии 4.15 задачника в набор переключателей, которые можно использовать при разработке файлов дополнений и внешних групп, добавлен переключатель [*], означающий начало следующего задания, т. е. задания с очередным номером. Если до указанного переключателя номер не задавался, то он определяет задание с номером 1. Если ранее был определен набор номеров (например, в виде диапазона [1-5] или нескольких номеров, указанных в одной строке), то переключатель [*] определяет задание с номером, на 1 большим, чем наибольший номер в предыдущем наборе.

Переключатель [*] должен указываться на отдельной строке файла; в противном случае он игнорируется (т. е. считается переключателем-комментарием).

Хотя переключатель [*] и переключатели с явным указанием номеров можно использовать совместно, предпочтительным вариантом будет следование одной из двух стратегий: либо использование только переключателя [*] (это оправдано, прежде всего, для файлов, определяющих внешние группы заданий), либо использование только переключателей с явным указанием номеров (для файлов дополнений к «стабильным» группам заданий из задачника). Впрочем, при подготовке внешней группы для нескольких языков возможной разумной стратегией будет явное указание первого номера [1] и использование переключателя [*] для последующих номеров в пределах группы, определяемой для каждого языка.

Наряду с «обычным» переключателем [*] в файлах, определяющих внешние группы, можно использовать макропереключатель [*<список заданий>], который описывается далее.

Переключатель [#<имя задания>]

Переключатель [#<имя задания>] был добавлен в набор переключателей в версии 4.15. Он предназначен исключительно для использования в файлах внешних групп, причем только для разделов, связанных с единственным номером (для обычных файлов дополнений и при указании разделов, определяющих несколько номеров заданий, он рассматривается как переключатель-комментарий).

Обрабатываются только переключатели #, входящие в область используемого языка программирования. Если для некоторого номера задания указано несколько переключателей #, то обрабатывается только первый из них. Данный переключатель (как и ранее рассмотренный переключатель [*]) должен располагаться на отдельной строке файла.

Переключатель # используется для тех заготовок, которые связываются с определенными заданиями из задачника. Это позволяет снабжать данные заготовки соответствующими начальными разделами, получаемыми из специальных файлов шаблонов, входящих в состав задачника (кроме того, для сред, использующих многофайловые проекты, это позволяет включать в состав создаваемого проекта дополнительные файлы, связанные с задачником). При наличии переключателя # можно не указывать явным образом заготовку для указанного задания; в этом случае будет использована заготовка из соответствующего файла дополнений, а при его отсутствии — заготовка по умолчанию для данной группы заданий.

Если для некоторого задания указан переключатель #, то программа PT4Demo отображает для этих заданий формулировки, взятые из задачника (как в окне задачника, так и в html-документе), что делает текст соответствующего задания более информативным. Кроме того, для таких заданий в программе PT4Demo указываются расширенные имена: наряду с именем, содержащим название внешней группы и порядковый номер задания, указывается в скобках имя задания, указанное в переключателе # (например, если во втором задании внешней группы ExtGroupDemo используется задание Begin1, то при просмотре этой группы с помощью модуля PT4Demo в окне задачника и в html-документе имя данного задания будет иметь вид ExtGroupDemo2 (Begin1)).

При отсутствии переключателя # модули PT4Load и PT4Demo анализируют текст заготовки, и если он содержит строку вида task <имя задания> в формате одного из языков, используемых в задачнике (т. е. допускается завершающая точка с запятой, скобки, кавычки различных видов), причем имя задания не содержит управляющих последовательностей %{task}, %{group} и %{number}, то с данным текстом заготовки автоматически связывается переключатель вида [#<имя задания>].

Если явно указан переключатель #, то в операторе task вызова задания можно использовать управляющую последовательность %{task}; в этом случае данная управляющая последовательность будет определять имя задания, указанное в переключателе # (а не имя, полученное из имени внешней группы и порядкового номера задания в пределах этой группы).

Возможной, хотя и достаточно редкой, является ситуация, когда заготовка программы содержит строку вида task <имя задания>, но это задание не относится к задачнику. Примером подобных заготовок являются программы для исполнителей Робот и Чертежник в системе PascalABC.NET. Чтобы данные строки не привели к ошибочному добавлению переключателя # к данному заданию, необходимо перед подобными заготовками использовать явно указанный пустой переключатель # без имени задания: [#]. Наличие пустого переключателя означает, что заготовка не должна связываться с задачником, даже если в ней содержится оператор вида task <имя задания>.

Еще одной ситуацией, в которой удобно использовать переключатель #, является включение во внешнюю группу задания из задачника, для которого не требуется создание специальной заготовки. В этом случае для соответствующего задания достаточно указать всего два переключателя:

     [*]
     [#<имя задания>]

В результате в определяемую внешнюю группу заданий будет включено задание из задачника с указанным именем, и для него будет создаваться стандартная заготовка, предусмотренная для соответствующей группы задачника. В программе PT4Demo подобные задания будут отображаться в окне задачника в традиционном виде (включающем формулировку, исходные данные и правильные результаты), а в html-документе будет приведена формулировка данного задания.

Указанная возможность позволяет легко создавать новые группы заданий, представляющие собой перекомпоновки заданий из электронного задачника. Заметим, что для такой задачи имеется альтернативная возможность — создание сводной группы заданий. Сводные группы задания создаются программой «Конструктор вариантов» в виде dll-файлов (в которых, в частности, будут скрыты «истинные» группы, из которых были взяты задания). Подобная возможность полезна при подготовке наборов заданий для проведения контрольных работ. В то же время, оформление заданий в виде внешних групп имеет то основное преимущество, что наряду с заданиями из задачника во внешнюю группу можно добавлять заготовки программ, не связанных с задачником. Для создания подобных внешних групп наиболее удобным средством является макропереключатель *.

При наличии переключателя # с именем задания стандартная заготовка будет использоваться не только в случае пустой заготовки для данного задания (как в приведенном выше примере), но и тогда, когда заготовка не является пустой, однако не содержит строки вида task <имя задания>. В этой ситуации приведенная заготовка считается начальным фрагментом заготовки для данного задания, и используется стандартная заготовка для этого задания, в начало которой добавляется начальный фрагмент. Начальный фрагмент целесообразно использовать в случае, когда не требуется дополнять текст стандартной заготовки, но желательно включить в нее указания к выполнению данного задания (оформленные в виде начальных комментариев программы-заготовки).

Напомним, что в качестве стандартной заготовки применяется заготовка, определенная в файле дополнений для соответствующей группы заданий, или, при отсутствии файла дополнений, заготовка, полученная на основе наиболее подходящего файла шаблонных дополнений (вида PT4_<начальная часть имени группы>.txt), а при отсутствии подходящего файла шаблонных дополнений — из файла PT4_.txt.

Приведем пример, предполагая, что используется среда PascalABC.NET, а внешняя группа имеет имя ExtGroupDemo и для нее определены следующие 4 задания:

     [*]
     begin
       writeln('Hello');
     end.
     [*]
     // Полная заготовка для задания Begin1
     var a: real;
     begin
       Task('Begin1');
       read(a);

     end.
     [*]
     [#Begin1]
     [*]
     [#Begin1]
     // Начальная часть заготовки для задания %{task}

Первая заготовка не связана с задачником, поэтому созданный для данного задания текст не будет отличаться от указанного в файле внешней группы:

     [Файл ExtGroupDemo1.pas]
     begin
       writeln('Hello');
     end.

Во втором задании факт использования задания из задачника будет определен по наличию процедуры Task с именем задания. В заготовке будет использован текст, приведенный в файле, к которому будет добавлена директива подключения модуля PT4:

     [Файл ExtGroupDemo2.pas]
     uses PT4;
     // Полная заготовка для задания Begin1
     var a: real;
     begin
       Task('Begin1');
       read(a);

     end.

В третьем задании факт использования задания из задачника будет определен по наличию переключателя # с именем задания. Поскольку явно указанный текст заготовки отсутствует, будет использован стандартный вариант заготовки, взятый из файла PT4_.txt:

     [Файл ExtGroupDemo3.pas]
     uses PT4;

     begin
       Task('Begin1');

     end.

В четвертом задании факт использования задания из задачника также будет определен по наличию переключателя # с именем задания. Поскольку в тексте заготовки отсутствует вызов процедуры Task, этот текст рассматривается как начальный фрагмент заготовки, который будет добавлен в начало стандартной заготовки для задания Begin1, взятой из файла PT4_.txt:

     [Файл ExtGroupDemo4.pas]
     uses PT4;
     // Начальная часть заготовки для задания Begin1

     begin
       Task('Begin1');

     end.

Начальный фрагмент указывается после директивы uses. В этом фрагменте можно применять управляющую последовательность %{task}, которая преобразуется в имя используемого задания.

В html-документе данный набор заданий будет описан следующим образом (обратите внимание на имена заданий из задачника, которые указываются в скобках после соответствующих имен внешней группы):

ExtGroupDemo1.

     begin
       writeln('Hello');
     end.

ExtGroupDemo2 (Begin1). Дана сторона квадрата a. Найти его периметр P = 4·a.

     // Полная заготовка для задания Begin1
     var a: real;
     begin
       Task('Begin1');
       read(a);

     end.

ExtGroupDemo3 (Begin1). Дана сторона квадрата a. Найти его периметр P = 4·a.

ExtGroupDemo4 (Begin1). Дана сторона квадрата a. Найти его периметр P = 4·a.

     // Начальная часть заготовки для задания Begin1

Особенности применения переключателя [text] для файлов внешних групп

Напомним, что переключатель [text] является парным к переключателю [code] и определяет формат абзаца, т. е. формат обычного текста, в то время как переключатель [code] (установленный по умолчанию) определяет формат листинга. Для файлов дополнений текст, введенный в формате абзаца, подвергается дополнительному преобразованию и не связывается с программами-заготовками, однако отображается в html-документе и в окне задачника.

В случае внешних групп подобная интерпретация текста, введенного в формате абзаца, не является оправданной по двум причинам:

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

Таким образом, для формата абзаца остается лишь одно применение: для определения преамбулы внешней группы (и ее наборов, если группа имеет составное имя).

По указанной причине действие переключателя [text] при определении конкретного задания из внешней группы было изменено следующим образом: данный переключатель по-прежнему обеспечивает переход к формату абзаца, однако для заданий из внешних групп текст в формате абзаца всегда связывается с создаваемой заготовкой и оформляется в ней как комментарий (по правилам используемого языка программирования). В частности, для языков Pascal, PascalABC.NET, C++, C#, Java каждая строка этого текста снабжается начальным префиксом «// » (два символа «/» и пробел), для языков VB и VB.NET начальный префикс имеет вид «» (одинарная кавычка и пробел), а для языков Python и Ruby — вид «».

С учетом отмеченной выше особенности интерпретации переключателя [text] для заданий из внешних групп, последнее задание из примера, рассмотренного в предыдущем пункте, можно было оформить следующим образом:

     [*]
     [text]
     [#Begin1]
     Начальная часть заготовки для задания %{task}

В данном случае был дополнительно указан переключатель [text] и удалены начальные символы «// » для приведенного комментария. В результате будет создана программа-заготовка, не отличающаяся от ранее приведенной.

При определении указаний для нескольких подряд расположенных заданий внешней группы достаточно ввести переключатель [text] единственный раз, поскольку его действие распространяется на весь последующий текст вплоть до появления переключателя [code].

Использование переключателя [text] при определении заданий внешних групп наиболее оправдано в случае, когда в группу включается задание из задачника, для которого не требуется указывать специальную заготовку, однако желательно добавить к стандартной заготовке начальный фрагмент с указаниями. Определение этого фрагмента в режиме [text], во-первых, избавляет разработчика от необходимости указывать специальные символы, превращающие этот фрагмент в комментарий, и, во-вторых, позволяет определить этот фрагмент одновременно для различных языков, поскольку оформление фрагмента в виде комментария по правилам любого используемого языка будет автоматически выполнено при генерации программы-заготовки.

Следует отметить, что в режиме [0] (используемом, в частности, для определения преамбулы) действие переключателя [text] для файлов, определяющих внешнюю группу, не отличается от действия для обычных файлов дополнений.

Макропереключатель [*<список заданий>]

Наряду с переключателем [*], позволяющим перейти к следующему заданию, в версии 4.15 в набор переключателей добавлен макропереключатель [*<список заданий>], который удобно использовать для быстрого включения во внешнюю группу заданий, связанных с некоторой группой задачника, если для этих заданий не требуется определять специальные заготовки.

Список заданий должен иметь вид <имя группы> <список номеров>; при этом макропереключатель [*<имя группы> <список номеров>] преобразуется в последовательность пар переключателей вида

     [*]
     [#<имя группы><номер>]

В качестве номера используются все номера, указанные в списке номеров макропереключателя. В списке номеров можно указывать как отдельные номера, так и диапазоны вида n1n2 (где n1 <= n2). Элементы списка номеров должны разделяться одним или несколькими пробелами, первый элемент списка может быть указан сразу после имени группы. Все номера в списке должны лежать в диапазоне от 1 до 999, номера могут повторяться. Имя группы должно быть указано непосредственно после символа *; оно должно содержать только цифры и латинские буквы. Если нарушаются какие-либо из перечисленных условий, то макропереключатель считается переключателем-комментарием и не обрабатывается.

Приведем пример:

     [*Begin 2 10 11 12 13 5]

Указанный макропереключатель обеспечивает добавление во внешнюю группу следующих заданий из группы Begin (в указанном порядке): Begin2, Begin10, Begin11, Begin12, Begin13, Begin5. Для всех этих заданий будут создаваться заготовки по умолчанию.

Аналогичного результата можно добиться, указав диапазон для последовательных номеров и поместив первый номер после имени группы (не отделяя его от имени пробелом):

     [*Begin2 10-13 5]

Без использования макропереключателя потребовалось бы указать 12 переключателей, разместив каждый из них на отдельной строке:

     [*]
     [#Begin2]
     [*]
     [#Begin10]
     ...
     [*]
     [#Begin5]

Отметим, что после макропереключателя * можно добавить частичную или полную заготовку для последнего из заданий, перечисленных в этом макропереключателе (в приведенном примере — для задания Begin5).

При наличии макропереключателя необходимость в явном указании переключателя # будет возникать, фактически, только в двух особых ситуациях: (1) при использовании переключателя # совместно с явно указанным номером задания (например, номером [1]), (2) при указании переключателя [#] без имени задания для отключения специальной обработки оператора task, присутствующего в заготовке.

Особенности заготовок, не связанных с заданиями из задачника

Как было отмечено выше, важной особенностью внешних групп заданий является то, что в эти группы можно включать программы-заготовки, не связанные с группами задачника. Эти программы могут демонстрировать применение различных средств, связанных с изучаемой темой, они могут также содержать простые задания, формулировки которых надо оформлять в виде комментариев к программе. Вид программы и, в частности, способ вывода ее результатов зависит от используемого языка программирования. Для языков Pascal (для сред Delphi и Lazarus), C++, C#, VB.NET используются консольные приложения. Для языка Visual Basic вывод данных осуществляется в специальное окно «Immediate Window» (для отображения которого на экране предусмотрена команда меню «View | Immediate Window»). Для остальных поддерживаемых языков (PascalABC.NET, Python, Java и Ruby) в интегрированных средах предусматривается специальное окно или раздел вывода, в который и выводятся результаты, полученные программой.

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

В частности, разработчик может добавить в заготовку дополнительные модули или библиотеки, поместив их в раздел [0] (поскольку естественно ожидать, что все задания некоторой группы могут потребовать для своего выполнения одинаковый набор дополнительных модулей). При этом данные раздела [0] будут использоваться как в заготовках, не связанных с заданиями из задачника, так и в заготовках, в которых используются задания из групп, определенных в задачнике. Эта возможность обеспечивается тем обстоятельством, что директивы подключения специального модуля, связанного с задачником, автоматически подключаются к тем заготовкам, которые предназначены для использования заданий из задачника.

Исключением из отмеченного общего правила является оформление заготовок для языка Pascal (среды Delphi и Lazarus). Для данного языка отсутствует возможность независимого подключения модулей: все модули должны быть указаны в одной директиве uses. Поэтому при попытке указать в разделе [0] общую директиву, которая должна использоваться как программами, использующими задачник, так и не связанными с ним обычными консольными приложениями, возникает вопрос: надо ли указывать в этой директиве модуль задачника PT4Tasks? Понятно, что без этого модуля не удастся откомпилировать программы, использующие задания из задачника, а при наличии этого модуля изменится поведение консольных приложений, не требующих подключения задачника.

С целью разрешения этой проблемы модуль PT4Tasks реализован в версии 4.15 таким образом, что при его подключении к консольному приложению он не выполняет инициализирующие и финализирующие действия, связанные с электронным задачником. Таким образом, его включение в набор модулей для консольного приложения не нарушит его работу. Более того, в модуль PT4Tasks включены вспомогательные функции ToConsole(s: string) и FromConsole(s: string), которые удобно использовать для перекодировки русского текста s, выводимого на консоль или прочитанного с консоли (поскольку в консольном окне и в редакторе кода по умолчанию используются различные кодировки: CP866 и CP1521 соответственно).

Итак, при разработке для сред Delphi и Lazarus внешних групп, использующих задания из задачника, в случае необходимости переопределения стандартного набора модулей необходимо обязательно включать в него модуль PT4Tasks. Заметим, что по умолчанию в стандартный набор модулей языка Pascal для внешних групп (как и для файлов дополнений) включаются два модуля: SysUtils и PT4Tasks.

Наряду с модулем PT4Tasks, указанные изменения были внесены в модуль PT4ExamTask, используемый для заданий из электронного задачника для подготовки к ЕГЭ PT for Exam. Это позволяет включать во внешние группы как задания из данного задачника, так и программы, не связанные с задачником. К сожалению, описанные средства не позволяют одновременно включать в одну и ту же внешнюю группу для сред Delphi и Lazarus задания из базового варианта задачника и его расширения PT for Exam. Если такая необходимость все же возникает, то можно определить в этой внешней группе пустой начальный раздел [0] (т. е. раздел, состоящий из единственной пустой строки), а директиву uses с нужными модулями указывать в начале каждого раздела, посвященного заданию с конкретным номером.

Для системы PascalABC.NET указанные проблемы отсутствуют, поскольку в этом варианте языка Pascal можно использовать не одну, а несколько директив uses. В данном случае директива uses PT4, обеспечивающая подключение модуля задачника, автоматически добавляется ко всем заготовкам, связанным с заданиями, взятыми из групп задачника, а директива uses PT4Exam используется для заданий, связанных с подготовкой к ЕГЭ. Для заготовок, не использующих задачник, данная директива не требуется.

Дополнительные управляющие последовательности (версия 4.17)

В версии задачника 4.17 в набор управляющих последовательностей, доступных как для файлов дополнений, так и для файлов внешних групп, были добавлены новые последовательности, предназначенные для упрощения указания перекрестных ссылок на другие задания группы.

При создании внешних групп удобно использовать переключатели [*] для указания новых заданий, поскольку это позволяет легко удалять или добавлять задания (или изменять их порядок), не выполняя перенумерацию заданий. Однако это усложняет действия по указанию, например, имени предыдущего задания группы (если в комментарии желательно сослаться на это задание). Кроме того, последовательность %{group}, которую можно было бы использовать для указания имени группы, возвращает другое имя, если текущее задание связывается с заданием из задачника (см. описание переключателя [#<имя задания>]). Таким образом, если задание связано с задачником, то для ссылки на предыдущее задание данной группы требуется явным образом указать и имя внешней группы, и номер этого предыдущего задания. Если в дальнейшем потребуется переместить это задание на новую позицию в группе, то в ссылке на предыдущее задание придется изменить номер; если будет переименован файл с внешней группой, то в ссылке придется изменить имя группы.

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

Новые управляющие последовательности позволяют избежать подобных корректировок. Имеется 8 вариантов этих последовательностей, в том числе 5 последовательностей с числовым параметром: %{ref}, %{refnum}, ${refcnt}, %{ref-число}, %{ref+число}, %{refnum-число}, %{refnum+число}, %{refcnt-число}, где число содержит от 1 до 3 цифр (т. е. допустимы числа от 0 до 999).

Последовательность %{ref} всегда возвращает имя внешней группы (даже если задание связано с задачником, и поэтому последовательность %{group} возвращает не внешнюю группу, а имя той группы задачника, из которой берется задание). Если задание внешней группы не связано с задачником, то последовательности %{ref} и %{group} возвращают одинаковую строку — имя внешней группы.

Последовательности %{ref-число} и %{ref+число} возвращают полное имя задания, номер которого получает из номера текущего задания вычитанием или прибавлением указанного числа.

Для получения полного имени самого текущего задания можно использовать последовательность %{ref-0} и %{ref+0}; если задание не связано с задачником, то полное имя будет совпадать с %{task}, однако если задание берется из задачника, то %{task} будет возвращать имя задания из задачника, тогда как %{ref-0} и %{ref+0} всегда будет возвращать имя, связанной с внешней группой.

Если при вычитании числа будет получен нулевой или отрицательный номер, то вместо него будет выведены три звездочки: ***. Подобная ситуация возможна, в частности, при вызове управлящих последовательностей %{ref-число} и %{ref+0} в преамбуле (поскольку для преамбулы текущий номер считается равным 0). В то же время, в преамбуле вполне допустимо использовать последовательности вида %{ref+число}, которые будут возвращать полное имя задания с номером, равным значению указанного числа.

Последовательности %{refnum-число} и %{refnum+число} возвращают номер, полученный из номера текущего задания вычитанием или прибавлением указанного числа. Таким образом, последовательность %{ref-число} является сокращенным вариантом комбинации %{ref}%{refnum-число}, а последовательность %{ref+число} — сокращенным вариантом комбинации %{ref}%{refnum+число}. Как и для последовательности %{ref-число}, если при вычитании числа будет получен отрицательный или нулевой номер, то последовательность %{refnum-число} вернет три звездочки.

Последовательность %{refnum} является сокращенным вариантом для последовательностей %{refnum-0} или %{refnum+0}. В частности, получить полное имя текущего задания можно не только с помощью последовательностей %{ref-0} и %{ref+0} (как было отмечено выше), но и с помощью комбинации %{ref}%{refnum}.

Последовательность %{refcnt-число} возвращает номер, полученный из максимального номера задания вычитанием указанного числа. В частности, чтобы получить максимальный номер задания, можно указать %{refcnt-0}. Вместо %{refcnt-0} можно использовать последовательность без числового параметра: %{refcnt}. Заметим, что парная последовательность с операцией + не предусмотрена.

С применением данных последовательжностей указание ссылкок на другие задания той же группы становится очень простым. Например, для того чтобы сослаться на предыдущее задание, достаточно указать последовательность %{ref-1}, причем при (синхронном) перемещении этих заданий на новую позицию в группе или при переименовании самой группы никаких корректировок выполнять не придется. Для того чтобы сослаться в преамбуле на диапазон из 5 последних заданий данной группы, достаточно указать следующий текст: %{ref}%{refcnt-4}%--%{ref}%{refcnt} (здесь использована также последовательность %--, позволяющая ввести короткое тире).

Переключатели режима мультизаголовков [**] и [*число] (версия 4.17)

В версии задачника 4.17 в набор доступных переключателей добавлены переключатели вида [**] и [*число], упрощающие создание фрагментов заготовок для нескольких подряд идущих заданий во внешних группах. Поскольку подобные фрагменты обычно помещаются в начало заготовок, режим, который обеспечивают данные переключатели, назван режимом мультизаголовков.

Для обычных файлов дополнений необходимости в дополнительных переключателях обычно не возникает, так как для задания общих фрагментов, входящих в несколько заданий (даже не обязательно идущих подряд), можно использовать набор переключателей номера, указав его в одной строке, например:

[3][6-11][13][15]

Текст, помещенный ниже этого набора, будет связан со всеми заданиями, номера которых указаны в наборе.

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

[1-20]
Общая часть
[1]
Первое задание
[*]
Второе задание
...

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

Кроме того, следует обратить внимание на то, что первое задание теперь надо оформлять с помощью переключателя [1]. Если для него, как обычно во внешних группах, использовать переключатель [*], то текст «Первое задание» будет связан не с заданием номер 1, а с заданием номер 21, так как появление переключателя [*] всегда добавляет к группе новое задание (а ранее с группой уже было связано 20 заданий).

Добавленные в версии 4.17 переключатели режима мультизаголовков позволяют избавиться от всех перечисленных неудобств. Простейшим вариантом подобного переключателя является [**]. Он позволяет определить начальную часть заготовки, которая будет добавлена ко всем последующим заданиям данной группы. Таким образом, при использовании переключателя [**] приведенный выше пример можно будет переписать следующим образом:

[**]
Общая часть
[*]
Первое задание
[*]
Второе задание
...

Независимо от количества заданий все они будут включать начальную общую часть. Заметим также, что теперь первое задание, как и все прочие, можно начинать с переключателя [*]. Это объясняется тем, что при выходе из режима мультизаголовков (который происходит при появлении любого переключателя номера) переключатель [*] не создает новое задание, а связывается с первым из заданий, определенных в режиме мультизаголовков.

Если переключатель [**] появится уже после определения какого-либо количества заданий, то он будет влиять только на те задания, которые будут определены далее.

Вариант переключателя [*число] позволяет указать, с каким количеством последующих заданий следует связать общие данные. Например, если во внешнюю группу включаются 5 задач из группы Begin и желательно снабдить все эти задачи общей частью, то это можно оформить следующим образом:

[*5]
Общая часть
[*Begin 3 4 6-8]

Для всех последующих заданий общая часть добавляться не будет. Следует обратить внимание на похожий вид переключателя режима мультизаголовков и макропереключателя, позволяющего быстро включить во внешнюю группу задания из задачника. Отличаются они тем, что в макропереключателе обязательным является указание имени группы, тогда как в переключателе режима мультизаголовков допускается указывать только число. Заметим, что число может лежать в диапазоне от 1 до 999.

Важной особенностью переключателя [*число] является то, что он, подобно переключателю [**], действует только на существующие задания. Таким образом, если в предыдущем примере после переключателя [*5] указать только два задания (например, [*Begin 3 4]), то группа будет содержать эти два задания, и каждое из них будет включать указанную общую часть.

Имеется возможность указать два переключателя режима мультизаголовков подряд; в этом случае они будут действовать на начальную часть определенных далее заданий, хотя размер этой части может отличаться для разных мультизаголовков. Пример:

[*5]
Общая часть1
[*2]
Общая часть2
[*Begin 3 4 6-8 11-20]

В данном случае первые пять заданий будут содержать текст общей части 1, а первые два из них — дополнительно текст общей части 2 (в указанном порядке). В завершающие 10 заданий группы (соответствующие заданиям Begin11–Begin20) тексты, связанные с общей частью 1 и 2 включаться не будут.


PrevNext

 

Рейтинг@Mail.ru

Разработка сайта:
М. Э. Абрамян, В. Н. Брагилевский

Последнее обновление:
19.04.2022