МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ им. М.В.ЛОМОНОСОВА ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ

advertisement
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ им. М.В.ЛОМОНОСОВА
ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
НАУЧНО-ИССЛЕДОВАТЕЛЬСКАЯ ЛАБОРАТОРИЯ ЭВМ
НАУЧНЫЙ ОТЧЕТ
РЕАЛИЗАЦИЯ КАРМАННОГО ВАРИАНТА
АВТОМАТИЗИРОВАННОЙ СИСТЕМЫ ОБУЧЕНИЯ "НАСТАВНИК"
(стартовая версия)
Заведующий НИЛ ЭВМ
к.т.н.
Н.П.Брусенцов
Исполнитель вед.н.сотр.
НИЛ ЭВМ,к.т.н.
С.П.Маслов
2001 г.
Наставник на PSION
2
АННОТАЦИЯ
В отчете содержится описание стартовой версии АСО "Наставник" в
карманном варианте. Система реализована на органайзере фирмы PSION,
модель Organiser II XP путем расширения имеющегося у него ассортимента функций. Программа, реализующая функцию АСО "Наставник", написана
на языке OPL. Обосновывается целесообразность создания карманного варианта АСО, приводятся краткие данные об органайзере и языке OPL. Описаны внешний "облик" системы, организация и кодирование управляющей
информации и обучающая программа. Приводятся сведения об объеме используемой памяти и быстродействии системы - задержках реакции на ответы обучаемого. Список литературы содержит 4 названия.
Работа должна была быть выполнена в первой половине 1998 г. По
не зависящим от автора причинам этого не произошло и описываемая здесь
реализация производилась в
инициативном
порядке в июне-августе
2000г. Отчет написан в январе 2001г.
Наставник на PSION
3
ВЕДЕНИЕ
Автоматизированная Система Обучения (АСО) "Наставник" [1] существует с начала 70 годов, реализована в многочисленных вариантах [2] и
используется поныне. Это говорит о том, что система действительно позволяет достигнуть заявленных целей и имеет свою "нишу" в существующем
многообразии компьютерных обучающих систем.
Вместе с тем распространенность системы могла бы быть существенно
большей, если бы ее потенциальным пользователем не приходилось преодолевать значительные трудности при попытке заиметь "Наставник" у себя.
Несмотря на усилия разработчиков облегчить этот процесс, лишь очень
небольшое число энтузиастов доводили дело до конца. По этой причине, в
частности, не удалось в желаемой степени привлекать силы пользователей
для создания новых курсов, а это, в свою очередь, не способствовало
расширению сферы применения системы.
Основным препятствием является то, что даже имея возможность приобрести многие компоненты системы в готовом виде, потенциальный владелец сталкивался с "ручным трудом" значительного объема - работами по
размещению минитерминалов, соединению их друг с другом и с управляющим
компьютером, установке источников питания и т.д.
Одним из возможных вариантов решения проблемы могло бы быть создание "карманного" варианта системы - компактного устройства, внешне
подобного простому калькулятору, но содержащему в себе все необходимое
для выполнения функций "Наставника". Карманную систему не нужно устанавливать, она всегда готова к употреблению, ее можно носить с собой и
использовать в любом месте - дома, в транспорте и т.д. Если такое устройство оснащено к тому же стандартным связным портом (типа RS-232C
или InfraRed), то дополнительно можно решить еще две проблемы: загрузку в устройство из "большого" компьютера управляющей информации по
различным курсам и "выгрузку" из него архива (информации о том, как
конкретный обучающийся проходил данный курс). Таким образом, сохраняя
все имеющиеся достоинства (о которых много написано в приведенных в
библиографии источниках), система приобрела бы дополнительные качества
- мобильность и автономность.
Одновременно отпала бы необходимость "ручного труда" при установке системы. При этом оказывается возможным как автономное, так и коллективное использование системы - связь карманных "Наставников" с
центральным компьютером также осуществляется штатными встроенными или
дополнительно приобретаемыми средствами.
Относительно того, каким должен быть "карманный Наставник" высказываются различные мнения. Согласно одному из них он обязательно должен представлять собой специализированное устройство отечественного
производства, предназначенное исключительно для обучения. Реализовать
единичный экземпляр-макет устройства на основе микропроцессора вполне
возможно, однако автору настоящего отчета кажется неоправданной такая
узкая его специализация. Организация массового производства специализированного устройства в нынешних условиях мало реальна.
Другое решение, предложенное и реализованное автором настоящего
отчета, основывается на использовании для этой цели выпускаемых в настоящее время многими фирмами и в широком ассортименте устройств типа
карманных калькуляторов, электронных записных книжек, электронных органайзеров, переводчиков и т.д. Перечисленные устройства имеют в своем
составе микропроцессор, клавиатуру и индикатор и реализуют свои штат-
Наставник на PSION
4
ные функции программным путем. При наличии некоторого запаса программной памяти к имеющимся функциям можно добавить еще одну: работу в системе "Наставник". Для этого их программное обеспечение (т.н. firmware)
должно быть пополнено новой компонентой.
В данном отчете содержится описание "карманного Наставника", реализованного с использованием второго подхода. В качестве основы была
взята модель английской фирмы PSION - Organiser II XP. Выбор именно
этой модели обусловлен в значительной мере конъюктурными причинами на тот момент (конец 1997г.) эта было единственное доступное по цене
устройство с возможностью программирования пользовательских задач невычислительного характера. Хотя названная модель на настоящий момент
может считаться устаревшей, встроенный в нее процедурный язык программирования OPL (на котором написан "Наставник") используется и в других, более современных (и более дорогих) изделиях PSION-а. Т.о. система легко может быть "пересажена" на них. Можно привести и дополнительные доводы в пользу проведенной работы.
Реализация системы в карманном варианте имеет особенности, которые трудно заранее предвидеть. Сколько потребуется программной памяти
и памяти для хранения управляющей информации, как лучше ее организовать, при каком минимальном быстродействии микропроцессора система еще
будет оставаться интерактивной и др.? Созданный стартовый вариант системы дает ответы на многие вопросы такого рода.
Немаловажно и другое: большинство устройств, потенциально пригодных для реализации "Наставника", не имеют штатных средств пополнения
firmware силами пользователя. Такого рода деятельность возможна лишь
при содействии фирмы-изготовителя. Опыт автора говорит о том, что убедить последнюю, даже обещая ей на словах "златые горы", непросто. Если
же, помимо посулов, демонстрируется работающее устройство фирмы-конкурента, можно рассчитывать на более благоприятное отношение.
Стартовый вариант по сравнению со штатным несколько урезан. Реализована только подсистема "Обучение". Секций не должно быть более 31
и они должны иметь сплошную нумерациею. Не ведется архив. Нет упражнений типа ПП, обязательных упражнений и ссылок на абзацы. Однако, для
всего этого оставлено место и при необходимости "недоделки" могут быть
устранены.
Наставник на PSION
5
ОРГАНАЙЗЕР МОДЕЛИ PSION Organiser II-XP
ПРОЦЕДУРНЫЙ ЯЗЫК ПРОГРАММИРОВАНИЯ OPL
(краткое описание)
Технические данные Organiser II-XP
Размеры: 142 х 78 х 29,3 мм.
Вес (без батарейки и доп. памяти): 250 гр.
Индикатор: две строки по 16 символов, выполненный в виде
точечной матрицы на жидких кристаллах
Клавиатура: всего 36 клавиш, включая клавиши редактирования,
управления курсором, буквенные, цифровые, MODE
(режим) и ON/CLEAR (вкл./очистка)
Микропроцессор: HD6303X с тактовой частотой 3,6864 МГц
Память: ОЗУ 32КВ (из них свободно 23,5КВ), ПЗУ 32КВ
Дополнительные модули: ОЗУ (Rampak) 32КВ с автон.питанием
ППЗУ (Datapak) 8/16/32/64/128КВ
CommLink - порт RS-232C
Время: встроенные кварцевые часы, идущие и при выключении
Питание: от алкалиновой батарейки 9В или сетевого адаптера
Устройство имеет широкий набор встроенных функций
(Выбираются из MAIN MENU (ГЛАВНОГО МЕНЮ):
FIND,SAVE,ERASE - записная книжка с поиском и стиранием
CALC - простой калькулятор
TIME - кварцевые часы
ALARM - будильники
PROG - программирование на встроенном процедурном языке OPL
COPY - копирование внутренней памяти в дополнительную память
INFO - данные о свободной и использованной внутренней памяти
RESET - общий сброс
OFF
- ручное выключение (выключается также автоматически)
Автоматическое выключение устроено таким образом, что если клавиши не нажимаются более 90 секунд, устройство "засыпает" - переходит в
режим с малым энергопотреблением - и индикатор погасает. Из этого состояния его выводят нажатием клавиши ON/CLEAR, после чего можно продолжать работать с того места, на котором "заснули". Для "Наставника это
оказывается удобным - каждый обучаемый может работать в своем темпе.
Ненужные конкретному пользователю функции можно временно убирать
из MAIN MENU. Дополнительные функции (процедуры), реализованные в
PROG, например функцию NAST ("Наставник"), можно поместить в MAIN MENU
и вызывать оттуда.
Карманный "Наставник" реализован на встроенном в Organiser II-XP
процедурном языке программирования OPL (Organiser Programming Language) [3]. В режим программирования на OPL входят, вызывая функцию PROG,
поэтому опишем ее более подробно:
Подменю PROG (приводится не полностью): NEW, EDIT, RUN, ERASE
поддерживает полный цикл написания, редактирования, выполнения и отладки, сохранения и стирания программ-процедур на OPL. В принципе существуют и кросс-средства написания и отладки программ для Organiser-а
на PC, но по материальным причинам они были недоступны.
Наставник на PSION
6
Процедурный язык программирования OPL.
В руководстве о нем сказано следующее: "Специально разработан для
управления вашими базами данных и для полного использования всех возможностей машины". В рекламных буклетах говориться о сходстве OPL с
BASIC-ом. Автор не является профессиональным программистом и данная
работа - его первый опыт. Поэтому он заранее приносит извинения потенциальному читателю за возможные "излишества" при описании языка OPL и
написанной на нем программы. Тем не менее представляется целесообразным рассказать здесь немного об OPL хотя бы для того, чтобы читателю
не приходилось слишком часто обращаться к фирменному руководству [3].
Программы, написанные на OPL, представляют собой набор процедур,
одна из которых является главной. С нее начинается выполнение всей
программы. В нашем случае это процедура NAST. В ней задаются параметры
текущего курса - его №, пределы отношения числа правильных попыток
к числу ответов и предельное число возвратов. В описываемом стартовом
варианте имеется единственный тест-курс. При необходимости в NAST можно реализовать меню, позволяющее выбрать желаемый курс из нескольких.
Процедуры содержат переменные - глобальные и локальные. Допустимы
переменные трех типов: действительные числа с плавающей точкой (не помечаются), целые (помечаются символом % в конце имени) и символьные
(помечаются символом $; при объявлении нужно указать максимальное число символов). Возможно использование массивов. Переменные разных типов
(в том числе и символьные!) можно смешивать, руководствуясь определенными правилами. Значения переменных в конкретной процедуре можно задавать, объявляя глобальные переменные, вводить с клавиатуры или передавать из других процедур в виде параметров.
Процедуры могут существовать в двух формах: исходной (пользовательской) и транслированной. Процедуру в исходной форме можно редактировать; транслированная процедура предназначена только для выполнения.
На самом деле транслированная процедура не является процедурой, написанной в машинных кодах, как это можно было бы предположить, а представляет собой несколько измененную исходную процедуру, что позволяет
OPL упростить и ускорить процесс ее интерпретации. По объему транслированная процедура приблизительно вдвое больше исходной. При написании
и отладке запоминаются обе формы процедур - только при соблюдении этого условия работает встроенная диагностика. После завершения отладки
необходимость в хранении процедуры в исходной форме отпадает и она может быть удалена для экономии памяти. (На самом деле это делается следующим образом: пересылают через связной порт в PC тексты процедур в
обеих формах, затем стирают их в Organiser-е, а обратно загружают
только транслированные).
В качестве средств управления программой OPL содержит команды организации циклов DO/UNTIL и WHILE/ENDWH, внутри которых возможно использование команды BREAK. Имеется команда GOTO и возможность установки меток. Ветвление по условиям осуществляется при помощи команд
IF/ELSEIF/.../ELSE/ENDIF.
Список команд включает в себя также набор арифметических операций, операций сравнения и логические операции AND, OR, NOT.
Данные хранятся в виде файлов. Несмотря на то, что в одном файле
можно объединять данные разных типов - действительные, целые и символьные - все они хранятся в символьном представлении. Таким образом
хранение, например, целых с большим числом значащих цифр оказывается
далеко не таким экономным, каким можно было бы предположить. (Эти тонкости совершенно не отражены в фирменном описании и автор на этом чуть
не погорел!) Файлы имеют сугубо последовательную структуру: после того, как файл создан и наполнен, нельзя заменять ничего внутри него, а
только удалять, либо прибавлять к концу.
Наставник на PSION
7
Файлы состоят из однотипных записей, количество которых не ограничено. Записи могут содержать до 16 полей. При создании файла необходимо определить какого типа данные будут помещаться в конкретном поле.
Размер записи ограничен 254 символами (байтами)
Записи последовательно пронумерованы. Делать запись текущей можно
посредством команды POSITION X (X- № записи). В описываемой реализации на запись удачно "легла" управляющей информации одной секции.
В OPL имеется много операций, предназначенных для работы с символьными переменными. Поскольку в представлении автора такие операции
(а также некоторые другие) могут быть специфичными для OPL, ниже будет
дано описание тех из них, которые были использованы в программе.
A$=CHR$(код ASCII) A$ - символ с кодом ASCII
A%=ASC(строка) A% - код ASCII первого символа строки
GEN$(число,ширина поля) - симв.предст. числа в поле зад.шир.
L$=LEFT$(строка,целое) L$ - левая часть строки длины целое
R$=RIGHT$(строка,целое) R$ - правая часть строки длины целое
L%=LOC(строка,символ) L% - позиция, в строке, где есть символ
L%=LEN(строка) L% - длина строки
M$=MID$(строка,цел.1,цел.2) M$ - цел.1 символов,от позиции цел.2
R$=REPT$(строка,целое) R$ - строка, повторенная целое число раз
I%=INT(число) I% - целая часть числа
R=RND R - случайное действительное от 0 до 1
K%=KEY K% - код ASCII нажатой клавиши
K%=GET ожидает нажатия клавиши и присвоит K% ее код ASCII
AT<№ позиции>,<№ строки> - устанавливает курсор
KSTAT<1-4> - задает режим клавиатуры (3-цифровой)
EOF True, если достигнут конец файла, False, если нет.
Написание и отладка программ на OPL.
Процедуры, из которых состоит программа, пишутся и отлаживаются
по отдельности. Несмотря на ограниченный объем внутренней памяти (32KB
ПЗУ и 32KB ОЗУ, из которых 23,5KB выделено пользователю) OPL имеет
достаточно развитые отладочные и диагностические средства. Автор упоминает об этом с полной ответственностью, поскольку ему - непрофессиональному программисту - удалось написать и отладить достаточно сложную
программу за срок менее месяца. На этапе трансляции производится синтаксический анализ текста с выдачей "зашитых" в ПЗУ 63 сообщения об
ошибках. Проверка происходит и на этапе выполнения транслированной
процедуры. При этом даже, хотя и приблизительно, указывается неправильное место в ней.
Наставник на PSION
8
КАК РАБОТАТЬ С КАРМАННЫМ "НАСТАВНИКОМ"
На рисунке, расположенном ниже, показано как выглядит органайзер,
работающий в режиме карманной АСО. Как видно из рисунка задействовованы только клавиша "O/C" (ON/CLEAR), включающая систему, цифровые
клавиши от "1" до "8" для ответов и клавиша "EXE", которая соответствует обычно используемой клавише ",". Остальные клавиши заблокированы
и нажатия на них ни к каким последствиям не приводят.
Работа с клавиатурой не требует пояснений. Поскольку Organiser
II-XP рассчитан на англоязычного пользователя надписи на индикаторе и
все выдачи делаются на английском языке. В OPL предусмотрено определение до 8 специальных символов и при большом желании систему можно русифицировать. На рисунке показывается соответствие английских надписей
русским и приведены выдачи на индикатор сообщения об успешном завершении обучения и сообщений, эквивалентных отсылке к преподавателю.
Более совершенный индикатор дал возможность организовать выдачу в
поле справок (|inf|) поясняющей информации как при успешном окончании
обучения: EoK - конец курса; так и при досрочном его прекращении: S=0
- попытка возврата в нулевую секцию и R>4 - допустимое число возвратов
(4) исчерпано. Это уместно поскольку при автономной работе преподавателя может не оказаться рядом. Как делать рубежный контроль - неясно.
k|sec|exr|rp|inf
X
XX
XX
X XXX
PSION Organiser II XP
O/C mode
↑
↓
←
→
A
B
C
D
E
F
G
H
7
8
K
L
M
N
4
5
6
R
S
T
1
2
3
X
shift
space
Y
Z
delete
EXE
k|sec|exr|rp|inf
press<EXE>
к|сек|упр|от|спр
нажми<EXE>
k|sec|exr|rp|inf
X XX XX X XX
k|sec|exr|rp|inf
X XX XX X XX
**GOOD!THE END**
**ХОРОШО!КОНЕЦ**
X XX XX
EoK
X XX XX
EoK
(конец курса)
WRONG! TRY AGAIN
ПЛОХО!ПРОБУЙ ЕЩЕ
X XX XX X S=0
X XX XX X S=0
(нулевая секция)
WRONG! TRY AGAIN
ПЛОХО!ПРОБУЙ ЕЩЕ
X XX XX X R>4
X XX XX X R>4
(более 4 возвратов)
Наставник на PSION
9
ПРЕДСТАВЛЕНИЕ УПРАВЛЯЮЩЕЙ ИНФОРМАЦИИ
в карманном варианте АСО "Наставник" на PSION Organiser II-XP
Управляющая информация (УИ) - это совокупность данных, описывающих реакцию системы на ответы обучаемых. Существуют представления УИ:
пользовательское, файловое и рабочее. Пользовательское представление
(ПП) служит для подготовки УИ составителем нового курса с целью последующего ввода ее в Organiser и преобразования в файловое представление (ФП). В ФП УИ хранится в Organiser-е. Рабочее представление (РП)
получается из ФП и существует только для текущего упражнения на том
этапе, когда оно предъявляется обучаемому.
Пользовательское представление (ПП):
Существует "штатное" ПП, используемое в других реализациях "Наставника" [2]. На основе этого представления формируется внутреннее
представление УИ, которое может быть разным у различных систем. В описываемом здесь карманном варианте предусмотрены подготовка и загрузка
в органайзер УИ во внутреннем (файловом) представлении из персонального компьютера или из модуля дополнительной памяти. В этом случае ПП,
использованное при подготовке УИ, естественно, не будет отличаться от
штатного. Однако, в карманный вариант заложена также возможность автономной подготовки УИ непосредственно в самом органайзере. В принципе,
при этом можно было бы сохранить штатное ПП, но для упрощения процесса
перекодирования и сокращения объема резидентной программы подготовки
УИ принято все числовые значения, в том числе и однозначные, записывать двухсимвольными фрагментами вида: <xx> (x-цифры от 0 до 9).
Например: 1 секция (упражнение, справка) записывается: 01
21 секция (упражнение, справка) записывается: 21
Если в ПП указывают на выдачу только справки, записывают единственный фрагмент - <xx> (№ справки).
Если в ПП указывают на выдачу вспомогательного упражнения, записывают два фрагмента подряд - <xx><xx> (Первый фрагмент - № справки, второй - № упражнения). (В отличие от штатного варианта здесь
отсутствует разделитель фрагментов "-").
Если в ПП указывают на выдачу упражнения на повторение, записывают подряд три фрагмента - <xx><xx><xx> (Первый фрагмент - № справки, второй - № секции, третий - № упражнения).
Если в ПП указывают на реакцию на правильный (или частично правильный) ответы, записывают односимвольные фрагменты <+> (или <*>) - в
точности так, как это делается в штатном варианте.
Перечисленные последовательности, состоящие из 1,2,4 или 6 байтов, называются элементами ПП УИ. Элементы отделяются друг от друга
пробелами. Одна строка соответствует одному упражнению. Последний символ строки - обязательно пробел.
Например: Запись "21 0214 133006 + "
Означает: на 1-ый ответ выдать справку 21, на 2-ой - справку 2 и
вспомогательное упражнение 14 в той же секции, на 3-ий - справку 13 и
упражнение 6 в 30 секции, на 4-ый - сообщение "правильный ответ".
(Резидентная программа автономной подготовки УИ в самом
зере не завершена и настоящем отчете не описывается).
органай-
Наставник на PSION
10
Файловое представление (ФП).
Представление называется файловым поскольку оно используется при
формировании файла "A:ED",B,.. с УИ по изучаемому курсу. Каждой секции
курса соответствует одна запись в файле. Количество секций (записей) в
описываемой реализации не может превышать 31 и нумероваться они должны
начиная от 1 без пропусков. Запись (секция) может содержать до 16 полей. "Нулевое" поле содержит информацию о секции. Остальные поля (максимально 15) содержат УИ упражнений в этой секции.
ФП является максимально экономной формой представления - управляющая информация, содержащая реакцию с выдачей только справки или сообщения "правильный ответ", занимает один байт; информация по поводу выдачи справки и вспомогательного упражнения в той же секции занимает
два байта; информация по поводу выдачи справки и упражнения на повторение в другой секции занимает три байта.
Структуру "нулевого" поля рассмотрим на следующем примере:
B.E0=BBBBBBSSSSHHNNN
Описываемая секция содержит шесть основных (B-типа, с 1 по 6) упражнений, четыре итоговых (S-типа, с 7 по 10), два вспомогательных
(H-типа, 11 и 12). Всего в данной секции 12 упражнений из допустимых
15 (в последних трех позициях поля секции стоит символ N).
При переходе на данную секцию ее поле копируется в переменную
GS$, отражающую текущее состояние секции - информацию о том, выдавались ли в ней основные и итоговые упражнения и какие. Сказанное иллюстрируется фрагментом программы:
USE B
POSITION GS%
GS$=B.E0
активизация файла B
переход на секцию № GS%
копирование нулевого поля в GS$
При необходимости выбрать случайным образом упражнение определенного типа используется процедура RN:(P$) (см. листинги процедур). Процедура выясняет имеются ли в текущей секции не заданные ранее упражнения типа P$ и выдает № свободного упражнения GE% заданного типа.
Затем символ в позиции переменной GS%, соответствующей выданному упражнению, заменяется символом N. Если в секции отсутствует упражнение
искомого типа, выдается GE%=0.
Например:
GS$=BBNBNBSSNSHHNNNN уже использованы.
указывает
на то,
что упражнения 3,5 и 9
Поля упражнений в файле, хранящем УИ, содержат непрерывную последовательность символов файлового представления УИ, соответствующую
последовательности фрагментов пользовательского представления. Пробелы
в ПП игнорируются.
Соответствие представлено в таблицах 1, 2 и 3:
Поясним идею организации ФП УИ на основе приведенного примера:
Запись в ПП
21 0214 133006 +
ей соответствует
Поле в ФП
E2^=nv+
Наставник на PSION
11
Элементы в ПП и символы в ФП несут информацию о реакции системы
на ответы, которые дают обучаемые. Обратим внимание на то, что символы
в ФП, в отличие от элементов в ПП, записаны подряд, без пробелов. Поступить таким образом (и достигнуть экономии объема файла) позволило
то, что любая реакция на ответ обязательно начинается со справки. Т.о.
можно определить последовательность символов в ФП, соответствующую
элементу в ПП, как последовательность, содержащую не более трех символов, начинающуюся символом-справкой, а заканчивающуюся символом, предшествующим символу-справке. Следует уточнить, что реакция на правильный ответ по существу является ни чем иным, как справкой.
В приведенной далее таблице показано соответствие кодов ПП, ФП и
РП для справок (левая часть), секций (средняя часть) и упражнений
(правая часть).
Чтобы определить № справки следует из кода ASCII символа в ФП,
соответствующего выбранному ответу, отнять 48. № справки "правильный
ответ" будет "-4" или "-5".
Чтобы определить № секции, содержащей упражнения на повторение
или вспомогательное, следует из кода ASCII символа в ФП отнять 80.
Чтобы определить № упражнений на повторение или вспомогательного
следует из кода ASCII символа в ФП отнять 112.
Рабочее представление (РП).
РП существует для единственного текущего упражнения № GE% и хранится в символьном массиве GE$(8,3). Массив формируется с помощью
процедуры CE:, которая "разбирает" поле текущего упражнения GE%, скопированного процедурой CS: в переменную GU$ и помещает символы, соответствующие элементам ПП, в массив GE$.
Информация о реакции системы на ответ № GN% в текущем упражнении
GE% содержится в элементах массива GE$(GN%). Отметим, что в РП, как
это имело место в ФП, тоже используется символьное представление УИ.
Преобразование символов в числа (№№ справок, секций и упражнений) происходит для единственного элемента массива непосредственно при определении текущих значений, вообще говоря, трех чисел: GI%, GS% и GE%.
Это иллюстрируется на основе приведенного ранее примера:
ФП GU$
E2^=nv+
РП GE$()
Массив 8 х 3 элемента
№ эл-та 1
2
3
4
GE%
v
GS%
^
n
GI%
E
2
=
+
8
Наставник на PSION
Эл-т
ПП
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
+
*
Справки
ФП
ASCII
симв
код
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
+
*
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
43
42
12
РП
Эл-т
№№
ПП
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
-5
-4
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Таблица
Секции
ФП
ASCII
симв
код
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
РП
№№
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Упражнения
ФП
Эл-т
ASCII
ПП
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
симв
код
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
q
r
s
t
u
v
w
x
y
z
{
|
}
→
←
РП
№№
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Наставник на PSION
13
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
карманного варианта АСО "Наставник" на PSION Organiser II-XP
Программа карманного варианта АСО "Наставник" состоит из 16 процедур разного объема и сложности. Процедуры вложены друг в друга и вся
программа работает таким образом, что из головной процедуры вызывается
процедура второго уровня, которая, в свою очередь, вызывает процедуру
третьего уровня и т.д. Каждая процедура после выполнения своих функций
передает управления процедуре, откуда он была вызвана. Существуют процедуры, которые могут быть вызваны с любого уровня. Блок-схема всей
программы показана на рисунке на следующей странице. Там же приведены
краткие описания процедур.
Объяснение устройства и функционирования программы производится
на основе снабженного комментариями листинга всех процедур. Имеющаяся
у Organaiser-а возможность вставлять комментарии в текст процедуры не
используется ради экономии памяти. Кроме комментариев к отдельным
строкам листинга дается общий комментарий для каждой из процедур. Для
наиболее сложных из них - DK: и ED: - имеются блок-схемы. Автор отчета
недостаточно знаком с используемыми для изображения блок-схем стандартными обозначениями, а во время написания программы не имел возможности пополнить свои познания в этом. Поэтому он употребляет собственные обозначения, к тому же еще и разностильные. Автор надеется, что
читатели не будут испытывать от этого особых затруднений.
В некоторых процедурах используются вложенные конструкции типа IF
или WHILE. Для облегчения понимания в таких случаях при первом появлении соответствующего оператора в комментарии к нему в скобках стоит
однозначное число - № конструкции. Все последующие операторы имеют
комментарий с тем же №. Так, операторы: IF..ELSEIF.. .ELSE.. .ENDIF
прокомментированы: если(3)..если(3)..иначе(3)..конец IF(3)
Наставник на PSION
14
БЛОК-СХЕМА
программы карманного варианта АСО "Наставник"
NAST:


HD:
OP:

DK:





KK:
KE:
C:
P:
ED:


CE:
RN:

CS:


K:
CN:


FW:
RT:
Краткое описание процедур
NAST:HD: OP: DK: KK: KE: C:
P:
ED: CN: K:
FW: RT: CE: CS: RN: -
Главная, задает параметры текущего курса
Задает глоб.перем., выводит нач.и кон.картинку на индикатор
Открывает файл, содержащий УИ
Обслуживает клавиатуру и индикатор
Срабатывает при нажатии клавиши "EXE"
Срабатывает при вводе ответа или нажатии клавиши "EXE"
Очищает заданную часть индикатора
Выводит №№ секции, упражнения и справки в нужном виде
Анализирует ответ и управляет выдачей вспомог./повт. упр-ий
Анализирует правильный ответ и управляет движением по курсу
Выбирает фрагмент УИ текущего упражнения
Управляет продвижением вперед по курсу
Управляет продвижением назад по курсу
Преобразует УИ из ФП в РП
Копирует текущую УИ из файла в переменную GU$
Выбирает случайным образом № упражнения
Наставник на PSION
15
Процедура NAST:
Главная процедура системы.
Показывается в MAIN MENU, откуда ее можно запустить.
1. Определяет и задает глобальные переменные, характеризующие
параметры текущего курса: его № GK%, верх. и нижн. пределы
отношения числа правильных ответов к числу попыток GL0% и GL1%,
допустимое число возвратов GD%.
2. Вызывает процедуру HD:, которая начинает сеанс обучения. По
завершении сеанса нажатием любой клавиши осуществляется возврат в
MAIN MENU.
NAST:
GLOBALGK%,GL0%,GL1%,GD%
GK%=1:GL0%=30:GL1%=70:GD%=4
HD::GET
курс; нижн-верхн.пределы; число возвратов
Задание начальных значений
Переход на HD:; ожидание нажатия
Процедура HD.
1. Задает текущие глобальные переменные (и определяет некоторые):
№ секции GS%, упражнения GE%, справки GI%, ответа GN%,
допустимое число ответов для данного упражнения GL%, число правильных
ответов GP%, число попыток GR%, их отношение GQ%, число возвратов D%.
№ секции S% и упражнения E%, запоминаемых при переходе на
вспомогательное или повторное упражнение (в CE:). Копия поля секции
GS$(15) (определяется при входе в секцию). Копия поля упражнения
GU$(30) (определяется в CS:). Массив реакций на ответы GE$(8,3)
(определяется в CE:). Тип упражнения GT$(1) - ("B/S"-осн./итог.).
2. Печатает на дисплее "шапку" k|sec|exr|rp|inf.
3. Открывает файл "A:ED",B, содержащий УИ.
4. Случайным образом выбирает упражнение типа "B".
5. Начинает сеанс, вызывая процедуру DK:
6. По завершению сеанса выдает на дисплей соответствующие сообщения.
HD:
GLOBAL GS%,GE%,GI%,GN%,GL%
GLOBAL GP%,GR%,GQ%,D%,S%,E%
GLOBAL GS$(15),GU$(30),GE$(8,3),GT$(1)
GLOBAL I$(1),J$(1)
GS%=1 :GQ%=1 :GT$="B" :D%=0 :S%=0 :E%=0
AT 1,1
I$=CHR$(124)
PRINT "k";I$;"sec";I$;"exr";I$;"rp";I$;"inf";
OP:
POSITION GS%
GS$=B.E0$
RN:(GT$)
CE:
DK:
AT 1,1
J$=CHR$(33)
IF GI%=42
PRINT "**GOOD"+J$+"THE END**";
ELSEIF GI%=40 OR GI%=41
PRINT "WRONG";J$;" TRY AGAIN";
ENDIF
┐
├определ.глоб.перем.
┘
перем.для "|" и "!"
задание тек.глоб.перем.
поставить курсор в 1,1
определить символ "|"
выдать k|sec|exr|rp|inf
открыть файл "A:ED",B,
выбрать секцию GS%
копир. поле секции в GS$
случайно выбрать упр-ие
сформ.массив GE$()
обслуж.дисп/клав DK:
поставить курсор в 1,1
определить символ "!"
если успех, то
выдать **GOOD!THE END**
если неудача, то
выдать WRONG! TRY AGAIN
конец IF
Наставник на PSION
16
Процедура DK.
Реализует "внешнюю" часть функционирования АСО:
1. Выдачу на индикатор №№ курса |k|, секции |sec| и упражнения
|exr|; циклический вызов этих №№ при нажатии клавиши "EXE".
2. Ввод и редактирование ответа |rp|
3. Выдачу справки или подтверждения правильности ответа |inf|.
4. Выдачу сообщения о причине неудачи в поле |inf|: "OK" вместо "ПР" и
"AR" (All right) вместо ПП; "S=0" при невозможности перейти назад и
"R>GD%" при исчерпании числа возвратов.
Использует KK:, KE:, ED:, C:() и P:(). Выполняется циклически при
нажатии клавиши "EXE". Вызывает ED: лишь после ввода ответа GN%.
 Вход из HD:
├─сохранить №№ сек.(GS%) и упр.(GE%)
├─t0::
├─вывод "press<EXE>"
│ ┌───┐
└→│
│
┌←│KK:│ждать"<EXE>"
│ └───┘
├─вывод № курса (GK%)
├─t1::
│ ┌───┐
└→│
│
┌←│KK:│ждать"<EXE>"
│ └───┘
├─вывод № секции (GS%)
├─t2::
│ ┌───┐
└→│
│
┌←│KK:│ждать"<EXE>"
│ └───┘
├─вывод № упр. (GE%)
├─t2::
│ ┌───┐
└→│
│ждать"<EXE>"
┌←│KE:│или № ответа (GN%) + "<EXE>"
 └───┘
если нажата только "<EXE>" (GN%=0),
перейти на t0;
иначе - вызвать ED:
 ┌───┐
└→│
│определение реакции (GI%)
┌←│ED:│на введенный ответ
│ └───┘
├──────────────────────────────────────────┐


если GI% № спр.,вывести его;
иначе (конец сеанса) если реакция типа "ПР" или "ПП", вывести "R>GD%" или "EoK"
вывести "OK" или "AR";

│ ┌───┐
возвр. в HD:
└→│
│
┌←│KK:│ждать"<EXE>"
 └───┘
если секция не изменилась,
сохранить № упр.,перейти на t2
иначе - сохранить № упр.и сек.,перейти на t1
Наставник на PSION
17
Процедура DK.
Осуществляет "внешнюю" (стандартную) часть функционирования АСО:
1. Выдачу на индикатор №№ курса |k|, секции |sec| и упражнения
|exr|; циклический вызов этих №№ при нажатии клавиши "EXE".
2. Ввод и редактирование ответа |rp|
3. Выдачу справки или подтверждения правильности ответа |inf|.
4. Выдачу сообщения о причине неудачи в поле |inf|: "OK" вместо "ПР" и
"AR" (All right) вместо ПП; "S=0" при невозможности перейти назад и
"R>GD%" при исчерпании числа возвратов.
DK: использует процедуры KK:, KE:, ED:, C:() и P:(). Выполняется
циклически при нажатии клавиши "EXE" (аналогична клавише "," в обычном
"Наставнике"). Вызывает ED: (формирование реакции на ответ) лишь после
ввода ответа.
DK:
LOCAL TS%,TE% :TS%=GS% :TE%=GE%
t0::
AT 1,2 :PRINT "
press<EXE>
";
KK:
PRINT CHR$(15)
AT 1,2 :PRINT GK%
t1::
KK:
AT 4,2 :P:(TS%)
t2::
KK:
AT 8,2 :P:(TE%)
KE:
IF GN%=0
AT 1,2 :C:(9) :GOTO t0::
ELSE :ED:
ENDIF
AT 15,2
IF GI%>0 AND GI%<32 :P:(GI%)
ELSEIF GI%=-5 :PRINT "OK"
ELSEIF GI%=-4 :PRINT "AR"
ELSE
AT 14,2
IF GI%=40 :PRINT "S=0"
ELSEIF GI%=41 :PRINT "R>";GD%
ELSEIF GI%=42 :PRINT "EoK"
ENDIF
RETURN :ENDIF
KK:
AT 11,2 :C:(6)
IF GS%=TS% :AT 7,2 :C:(3)
TE%=GE% :GOTO t2::
ELSE :AT 3,2 :C:(7)
TS%=GS% :TE%=GE% :GOTO t1::
ENDIF
TS%,TE% хранят текущие GS% и GE%
метка t0
вывод в нижн.строке "press<EXE>"
ждать нажатия "EXE"
очистить нижнюю строку
вывод № курса
метка t1
ждать нажатия "EXE"
вывод № секции в |sec|
метка t2
ждать нажатия "EXE"
вывод № упражнения в |exr|
ждать "EXE" или ответа + "EXE"
если только "EXE", то
очист.верхн.стр.,перейти на t0
иначе (есть ответ) - вызвать ED:
конец IF
курсор в позицию |inf|
если № справки - вывести его
если прав.ответ - вывести "OK"
если неполн.ответ - вывести "AR"
иначе
курсор в 14 позицию нижн.строки
если некуда возвр.- вывести "S=0"
если исчерпаны возвраты - "R>GD%"
если конец курса - "EoK"
конец IF
возврат в HD:; конец IF
ждать нажатия "EXE"
очистить |rp|inf
если сек.не изм.,очистить |exr|,
сохранить GE%.,перейти на t2
иначе - очистить |sec|exr|,
сохранить GS% и GE%,перейти на t1
конец IF
Наставник на PSION
18
Процедуры KK:,KE:,C:(P%) и P:(P%), используемые DK:
Процедура KK.
Ожидает нажатия клавиши "EXE" и возвращается в DK: только после этого.
KK:
LOCAL K% :K%=0
t::
K%=GET
IF K%=13 :RETURN
ELSE GOTO t::
ENDIF
объявляет K% и устанавливает K%=0
метка для GOTO
ожидает наж.клавиши и присв.K% ее ASCII-код
если это код клавиши "EXE", то возврат;
иначе - перейти на t
конец IF
Процедура KE.
Осуществляет ввод и редактирование № ответа GN%. Возвращается в
DK: при нажатии клавиши "EXE". Если ответ не вводился, остается GN%=0.
KE:
LOCAL K%,T% :GN%=0
KSTAT 3
DO
T%=KEY :K%=T%-48
IF K%>0 AND K%<GL%+1
AT 12,2 :PRINT K%
GN%=K%
ENDIF
UNTIL T%=13
объявляет K% и T%, устанавливает GN%=0
устанавливает клавиатуру на ввод цифр
делать
T% ASCII-код клав.;сдвиг: K%=T%-48 (код"1"-49)
если введено допустимое значение ответа (1-GL%),
вывести его в |rp|
и присвоить GN%
конец IF
пока не будет нажата клавиша "EXE" (код 13)
Процедура C:(P%).
Выводит P% пробелов вправо от позиции курсора.
C:(P%)
PRINT REPT$(" ",P%);
Процедура P:(P%)
Выводит одно или двузначное целое число P% так, что его последняя
цифра устанавливается в позиции курсора.
P:(P%)
PRINT GEN$(P%,-2)
Наставник на PSION
19
Процедура ED:
Обработчик правильных и неправильных ответов на упр-ия всех типов.
Имеет 6 ветвей. Содержит счетчики попыток и правильных ответов.
Анализирует элемент УИ GE$(GN%), соответствующий ответу GN%.
1-й байт=-5 - пр.отв; 1-й байт-справка, 2-й всп.упр., 3-й повт.упр.
При всп./пов. - запоминают текущий контекст - E%=GE%, S%=GS% и
назначают новые GE%,GS%, взяв их значения из УИ.
Контекст восстанавливают и делают S%,E%=0 при прав.отв. на всп./повт.
При прав.отв., если S%,E%≠0 - это отв.на всп./повт.упр.,иначе на B/S.
При справке, если S%,E%≠0 - не выполнено B/S, иначе - всп./повт.упр.
Вход из DK:

определить длину L%
элемента упр.инф.GE$(GN%);
вычислить № справки GI%

├─────────────┐


если GI%=-5
иначе
(прав.отв.)

│
├─────────────┬─────────────┐
│



│
если L%=1
если L%=2
если L%=3
│
(справка)
(всп.упр.)
(пов.упр.)




┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ контекста │ │ контекста │ │ запомнить│ │ запомнить│
│
нет?
│ │
нет?
│ │ контекст │ │ контекст │
│ S%,E%=0? │ │ S%,E%=0? │ │
E%=GE% │ │
E%=GE%, │
│ да
нет │ │ да
нет │ │
│ │
S%=GS% │
└─┬───────┬─┘ └─┬───────┬─┘ └─────┬─────┘ └─────┬─────┘
│

│
│


│ ┌────┴───┐ │
│
назначить
назначить
│ │восстан.│ │
│
вспомог.упр.
повторное упр.
│ │контекст│ │

возврат в DK: возврат в DK:
│ │ GS%=S%,│ │ не выполнено
│ │ GE%=E%,│ │ всп./повт.упр.
│ │ S%,E%=0│ │ задать его снова,
│ └────┬───┘  возврат в DK:
│
│ не выполнено
│
│ осн./итог.упр.
│
│ задать его снова,
│
 возврат в DK:
│ выполнено всп./повт.упр.,
│ но не выполнено осн./итог.упр.
│ задать отложенное осн./итог.упр.,
│ зачесть попытку (GQ%=GQ%+1),
 возврат в DK:
осн./итог.упр.выполнено верно
учесть пр.ответ (GP%=GP%+1);
вызвать CN: возврат в DK:
Наставник на PSION
ED:
LOCAL L%
USE B
L%=LEN(GE$(GN%))
GI%=K%:(1)-48
IF GI%=-5
IF S%=0 AND E%=0
GP%=GP%+1
CN: :RETURN
ELSE
IF E%<>0 :GE%=E% :E%=0
ENDIF
IF S%<>0 :GS%=S% :S%=0
POSITION GS%
ENDIF
CE: :GQ%=GQ%+1
RETURN
ENDIF
ELSE
IF L%=1
IF S%=0 AND E%=0
GQ%=GQ%+1 :RETURN
ELSE :RETURN
ENDIF
ELSEIF L%=2
IF E%=0
E%=GE%
GE%=K%:(2)-112
ELSE
GE%=K%:(2)-112
ENDIF
CE: :RETURN
ELSEIF L%=3
IF E%=0
E%=GE%
GE%=K%:(3)-112
ELSE
GE%=K%:(3)-112
ENDIF
IF S%=0
S%=GS%
GS%=K%:(2)-80
ELSE
GS%=K%:(2)-80
ENDIF
POSITION GS%
CE: :RETURN
ENDIF
ENDIF
20
объявляет длину элемента УИ
активизирует файл B, с УИ
определить длину элемента № GN%
вычислить значение "№ справки"
если(1) ответ-"ПР" ("+" - GI%=-5),
и, если(2) он дан на упр-ие типа "B/S",
то учет правильного ответа;
переход в CN:, а по выходе - возврат в DK:
иначе(2) ("+" на всп./повт. упр-ие)
если(3) менялось упр.-восстановить GE%
конец IF(3)
если(4) менялась сек.-восстановить GS% и
установить указатель секции (записи в B)
конец IF(4)
переход в CE:; учет попытки
возврат в DK:
конец IF(2)
иначе(1)
если(5) только справка (одинобайтный элемент)
и, если(6) было упр-ие типа "B/S",
учет попытки и возврат в DK:
иначе(6) (всп./повт. упр.) - возврат в DK:
конец IF(6)
если(5) вызов вспомогательного упражнения,
и, если(7) он первый,
запомнить текущее GE%,
вычислить № вспом. упр-ия
иначе(7) просто вычислить № вспом. упр-ия;
конец IF(7)
переход в CE:, а по выходе - возврат в DK:
если(5) вызов упражнения на повторение,
и, если(8) № упр-ия не сохранялся,
запомнить текущее GE%,
вычислить № повторн. упр-ия;
иначе(8) (сохранение GE% было) просто вычислить № повторн. упр-ия;
конец IF(8)
если(9) № секции не сохранялся запомнить текущее GS%,
вычислить № секции с повт.упр-ием,
иначе(9) (сохранение GS% было) просто вычислить № секции с повт.упр-ием,
конец IF(9)
установить указатель секции (записи в B)
переход в CE:, а по выходе - возврат в DK:
конец IF(5)
конец IF(1)
Процедура K%:(P%)
Возвращает в вызывающую процедуру ED: код ASCII P%-го байта GN%-го
элемента массива GE$().
K%:(P%)
RETURN ASC(MID$(GE$(GN%),P%,1))
Наставник на PSION
21
Процедура CN:
Обработчик правильных ответов только на упражнения типа B/S.
Вычисляет отношение GR% правильных ответов к попыткам.
Если GR%>GL1% и, если ответ был на итоговое упражнение, вызывает
FW:(вперед); если ответ был на основное упражнение - назначает итоговое, а если таковые исчерпаны - вызывает FW: и возвращается в ED:
Если GR%<GL0% и, если ответ был на основное упражнение, вызывает
RT:(назад); в противном случае назначает основное упражнение, а если
таковые исчерпаны - вызывает RT: и возвращается в ED:
В обоих случаях, если упражнения имеются - засчитывается попытка ответа и делается возврат в ED:
Если GL0%<GR%<GL1%, назначается упражнение текущего типа, а если они
исчерпаны - вызывается RT: и делается возврат в ED: Если упражнения
имеются - засчитывается попытка ответа и делается возврат в ED:
Вызов процедуры CE: - формирование массива элементов УИ для текущего
упражнения - делают в разных местах программы.
CN:
GR%=GP%*100/GQ%
IF GR%>GL1%
IF GT$="S" :FW:
RETURN
ELSE :GT$="S"
RN:("S")
IF GE%=0 :FW:
RETURN
ELSE :GQ%=GQ%+1 :CE:
RETURN
ENDIF
ENDIF
ELSEIF GR%<GL0%
IF GT$="B" :RT:
RETURN
ELSE :GT$="B"
RN:("B")
IF GE%=0 :RT:
RETURN
ELSE :GQ%=GQ%+1 :CE:
RETURN
ENDIF
ENDIF
ELSE
RN:(GT$)
IF GE%=0 :RT:
RETURN
ELSE :GQ%=GQ%+1 :CE:
RETURN
ENDIF
ENDIF
вычисл. отнош. GR% (прав.отв./попытки)
если(1) GR%>GL1%
и, если(2) тек.упр. итоговое - вперед
возврат в ED:
иначе(2) - назначить тек.упр. итоговым
выбрать его случ.образом
если(3) упр-ия исчерпаны - вперед
возврат в ED:
иначе(3) зачесть попытку; перейти в CE:
возврат в ED:
конец IF(3)
конец IF(2)
иначе(1), если GR%<GL0%
и, если(4) тек.упр. основное - назад
возврат в ED:
иначе(4), - назначить тек.упр. основным
выбрать его случ.образом
если(5) упр-ия исчерпаны - назад
возврат в ED:
иначе(5) зачесть попытку; перейти в CE:
возврат в ED:
конец IF(5)
конец IF(4)
иначе(1) - (GL0%<GR%<GL1%)
выбр. случ.обр. упр. текущ.типа
если(6) упр-ия исчерпаны - назад
возврат в ED:
иначе(6) зачесть попытку; перейти в CE:
возврат в ED:
конец IF(6)
конец IF(1)
Наставник на PSION
22
Процедура FW:
Вызывается CN: Осуществляет переход в следующую секцию (запись №
GS%+1 в файле B с УИ). Проверяет возможность перехода (конец файла).
Если невозможен - устанавливает GI%=42 для сигнализации об этом
процедурам DK: и HD: и возвращается в CN: Если переход возможен,
назначает текущее упражнение основным, копирует информацию о новой
секции в GS$, присваивает начальные значения GP% и GQ%, выбирает
случайным образом основное упражнение и возвращается в CN:
FW:
USE B
GS%=GS%+1
POSITION GS%
IF EOF
GI%=42
RETURN
ENDIF
GT$="B"
GS$=B.E0$
GP%=0 :GQ%=1
RN:("B") :CE:
активизирует файл B, с УИ
перейти в следующую секцию
установить указатель секции (записи в B)
если конец файла с упр.инф.
присвоить GI%=42
возврат в CN:
конец IF
назначить тек.упр. основным
считать информацию о секции из файла
присвоить значения GP% и GQ%
выбр. случ.обр. основное упр.; перейти в CE:
Процедура RT:
Вызывается CN: Осуществляет переход в предыдущую секцию (запись №
GS%-1 в файле B с УИ). Увеличивает на 1 счетчик возвратов и проверяет
его.
Если возвраты не исчерпаны, уменьшает на 1 GS% и проверяет не является
ли эта секция нулевой. Если да - GI%=40 для сигнализации DK: и HD: и
возврат в CN:
В противном случае назначает текущее упражнение основным, копирует
информацию о новой секции в GS$, присваивает начальные значения GP% и
GQ% и выбирает случайным образом основное упражнение, после чего
возвращается в CN: Если возвраты исчерпаны - GI%=41 и возврат в CN:
RT:
USE B
D%=D%+1
IF D%<=GD%
GS%=GS%-1
IF GS%=0
GI%=40 :RETURN
ENDIF
GT$="B"
GS$=B.E0$
GP%=0 :GQ%=1
RN:("B") :CE:
RETURN
ELSE :GI%=41
RETURN
ENDIF
активизирует файл B, с упр. информацией
увеличивает счетчик возвратов
если(1) возвраты еще не исчерпаны,
перейти в предыдущую секцию
если(2) это нулевая секция,
присвоить GI%=40; возврат в CN:
конец IF(2)
назначить тек.упр. основным
считать информацию о секции из файла
присвоить значения GP% и GQ%
выбр. случ.обр. основное упр.; перейти в CE:
возврат в CN:
иначе(1) (число возвр.исчерп.); присвоить GI%=41
возврат в CN:
конец IF(1)
Наставник на PSION
23
Процедура CE:
Преобразует управляющую информацию (УИ) текущего упражнения № GE%
из файлового представления (ФП) в рабочее (РП). При помощи процедуры
CS: помещает в GU$ требуемое поле файла "A:ED",B, и посимвольно его
анализируют. Если анализируемый символ - № справки или код правильного ответа (ASCII-коды от 41 до 80), то переходят к очередному
элементу массива GE$() и копируют в него обнаруженный символ. Затем
переходят к следующему символу. В противном случае (анализируемый символ не № справки) - его просто присоединяют к текущему значению
элемента массива GE$(). В результате сплошная последовательность символов в ФП в поле упражнения распределяется по элементам массива
GE$(). Каждый элемент обязательно начинается символом-справкой.
Последнее значение локальной переменной E% является предельным числом
ответов в данном упражнении. Оно присваивается переменной GL%, используемой в процедуре KE:.
CE:
LOCAL L%,N%,E%
CS:(GE%)
L%=LEN(GU$)
N%=1
E%=0
WHILE L%<>N%-1
IF ASC(MID$(GU$,N%,1))>41 AND SC(MID$(GU$,N%,1))<80
E%=E%+1
GE$(E%)=MID$(GU$,N%,1)
N%=N%+1
ELSE
GE$(E%)=GE$(E%)+MID$(GU$,N%,1)
N%=N%+1
ENDIF
ENDWH
GL%=E%
объявление
в GU$ УИ тек.упр.
L%-длина GU$
счетч.симв.GU$
№ элем.GE$()
пока L%<>N%-1
если № справки
задать след.элем.
копир.N%-ый симв.
след.симв.из GU$
иначе (не справ.)
добав.к текущ.эл.
след.симв.из GU$
конец IF
конец WHILE
присвоить GL%=E%
Процедура CS:(P%)
Копирует в переменную GU$ поле P%-ого упражнения из текущей записи
(секции) файла "A:ED",B, хранящего УИ
CS:(P%)
USE B
IF P%=1 :GU$=B.E1$
ELSEIF P%=2 :GU$=B.E2$
ELSEIF P%=3 :GU$=B.E3$
ELSEIF P%=4 :GU$=B.E4$
ELSEIF P%=5 :GU$=B.E5$
ELSEIF P%=6 :GU$=B.E6$
ELSEIF P%=7 :GU$=B.E7$
ELSEIF P%=8 :GU$=B.E8$
ELSEIF P%=9 :GU$=B.E9$
ELSEIF P%=10 :GU$=B.EA$
ELSEIF P%=11 :GU$=B.EB$
ELSEIF P%=12 :GU$=B.EC$
ELSEIF P%=13 :GU$=B.ED$
ELSEIF P%=14 :GU$=B.EE$
ELSEIF P%=15 :GU$=B.EF$
ENDIF
активизирует файл B
если P%= 1, скопир.
если P%= 2, скопир.
если P%= 3, скопир.
если P%= 4, скопир.
если P%= 5, скопир.
если P%= 6, скопир.
если P%= 7, скопир.
если P%= 8, скопир.
если P%= 9, скопир.
если P%=10, скопир.
если P%=11, скопир.
если P%=12, скопир.
если P%=13, скопир.
если P%=14, скопир.
если P%=15, скопир.
конец IF
с УИ
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
в GU$
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
поле
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
тек.секц.
Наставник на PSION
24
Процедура RN:(P$)
Случайным образом выбирает символ "P$" из переменной GS$ (копия поля
секции B.E0$); определяет № его позиции R% в GS$ и корректирует
содержимое GS$, заменяя выбранный символ символом "N". Если в GS$
не содержится упражнений искомого типа, выдает GE%=0.
RN:(P$)
LOCAL R%,M$(1)
IF LOC(GS$,P$)=0
GE%=0
RETURN
ELSE
DO
R%=INT(RND*15+1)
M$=MID$(GS$,R%,1)
UNTIL M$=P$
ENDIF
GS$=LEFT$(GS$,R%-1)+"N"+RIGHT$(GS$,15-R%)
GE%=R%
парам.P$ - тип упр.("B/S")
R%-случ.целое 1-15;
если в GS$ нет упр. типа P$,
присвоить GE%=0 (упр-ий нет)
возврат
иначе (упр.есть)
делать:
задать случ.число от 1 до 15
извлекать R%-й байт из GS$
пока он не будет равен P$
конец IF
вместо извл-ого вставить "N"
присвоить GE%=R%
Процедура OP:
Открывает файл УИ с именем "A:ED" и логическим именем B. Файл содержит
16 полей вида EX$, где X - 16-ричные цифры от 0 до F.
(В приведенном ниже тексте процедуры перечень полей разделен на две
части. Это обусловлено ограничением на длину печатной строки - в ней
не может быть более 70 символов. В тексте процедуры перенос недопустим
и все поля должны быть записаны одной строкой).
OP:
OPEN "A:ED",B,E0$,E1$,E2$,E3$,E4$,E5$,E6$,E7$,E8$,E9$,
EA$,EB$,EC$,ED$,EE$,EF$
Наставник на PSION
25
ЗАКЛЮЧЕНИЕ
Программа испытывалась на коротком тест-курсе, состоящем из трех
секций. Автор надеется, что все возможные траектории выполнения программы и все допустимые сочетания управляющей информации в этом курсе
задействованы. На тест-курсе удалось оценить время реакции системы.
Для описываемой реализации изначально представлялось не очевидным будет ли система интерактивной. Опасения основывались, во-первых, на
том, что выполнение программы на OPL происходит в режиме интерпретации
и, во-вторых, на том, что тактовая частота 3,6864 МГц, которой обладает микропроцессор HD6303X, невелика. Реально оказалось, что время реакции системы на ответ не превышает 1 секунды. Наиболее узким местом
была "разборка" поля упражнения, осуществляемая процедурой CE:. Чтобы
повысить скорость пришлось отказаться от выделения нескольких повторяющихся частей CE: в отдельные процедуры более низкого уровня. Это сразу дало сокращение времени реакции втрое. По-видимому такого рода резервы у системы еще имеются.
Данные об объеме памяти, занимаемой программой:
Тексты процедур на OPL - 3507 байт
Транслированные тексты - 6533 байт
В "Наставнике" допустимы секции с 15 упражнениями, в каждом из
которых может быть до 8 ответов. В ФП секции курса соответствует запись в файле, которая не может быть длиннее 254 байтов. Для оценки
влияния этого ограничения рассмотрим гипотетическую секцию с 15 упражнениями по 8 ответов. В каждом упражнении из 8 ответов 3 вызывают
вспомогательное упражнение, а 2 - упражнение на повторение. В ФП запись, соответствующая такой секции, будет содержать байтов:
(15-инф.о сек.)+(15х8=120-справки)+(15х3=45-всп.)+(15х4=60-повт.)=240
Таким образом даже в этой практически невероятной ситуации место
еще остается. Реально же размеры записей-секций существенно меньше.
Программа "Наставника", состоящая только из транслированных процедур, имеет размер 6,5KB, что составляет около четверти объема пользовательского ОЗУ органайзера. УИ кодируется экономно: так, для наибольшего из написанных в настоящее время учебных курсов "Базисный
ФОРТРАН" [4], УИ занимает около 2,5KB. Таким образом, можно утверждать, что "карманный Наставник" вполне реализуем на простых устройствах типа калькуляторов, электронных записных книжек и т.п.
Автор отдает себе отчет, что в программе наверняка есть ошибки.
Их природа двояка - с одной стороны это результат неискушенности автора в программировании, а с другой - незнание всех тонкостей функционирования системы. Несмотря на существование многочисленных описаний
системы [1,2] и участие автора в создании практически всех ее вариантов, у него порой возникали вопросы, ответа на которые найти не удавалось. В этом случае приходилось действовать по догадке. Автор будет
признателен за любые замечания по существу.
Наставник на PSION
26
ЛИТЕРАТУРА
1. Брусенцов Н.П., Маслов С.П., Рамиль Альварес Х.
Микрокомпьютерная система обучения "Наставник"
- М.: Наука, 1990. - 223с.
2. Брусенцов Н.П., Маслов С.П., Рамиль Альварес Х.
Методическое пособие по разработке учебных материалов
в микрокомпьютерной системе обучения "Наставник"
- М.: Изд-во МГУ. 1992. - 95с.
3. PSION
OrganiserII-XP. Operating manual. 1994.
4. А.Л.Александров, Н.П.Брусенцов, Ю.Ю.Галимов,
В.Ш.Кауфман, Н.Б.Лебедева, С.П.Маслов, Х.Рамиль Альварес.
Базисный Фортран (Учебное пособие).
- М.: Изд-во Моск. ун-та, 1982. - 200с.
Наставник на PSION
27
ОГЛАВЛЕНИЕ
АННОТАЦИЯ
стр
2
ВВЕДЕНИЕ
3
PSION Organiser II-XP и язык OPL
5
КАК РАБОТАТЬ С КАРМАННЫМ "НАСТАВНИКОМ"
8
ПРЕДСТАВЛЕНИЕ УПРАВЛЯЮЩЕЙ ИНФОРМАЦИИ
9
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ
13
БЛОК-СХЕМА ПРОГРАММЫ
14
Процедуры NAST: и HD:
16
Процедура DK: (блок-схема)
16
Процедура DK: (текст)
17
Процедуры KK:,KE:,C:(P%) и P:(P%)
18
Процедура ED: (блок-схема)
19
Процедуры ED: и K%:(P%) (текст)
20
Процедура CN:
21
Процедуры FW: и RT:
22
Процедуры CE: и CS:
23
Процедуры RN:(P$) и OP:
24
ЗАКЛЮЧЕНИЕ
25
ЛИТЕРАТУРА
26
Download