АННОТАЦИЯ Этот документ предназначен для пользователей, участвующих в опытной эксплуатации системы "ШКОЛЬНИЦА", и содержит описание ее входного языка (РАПИРА) и основных инструментально-сервисных средств. Предполагается, что читатель знаком с каким-либо языком программирования массового применения и имеет в своем распоряжении персональную ЭВМ АГАТ, оснащенную системой "ШКОЛЬНИЦА".
СОДЕРЖАНИЕ 1. Назначение и условия применения 7 1.1. Назначение и структура системы 7 1.2. Версии системы 8 1.3. Условия применения 8 2. Характеристики программы 10 2.1. Технические характеристики 10 2.2. Характеристики РАПИРА-интерпретатора 10 2.3. Количественные ограничения в РАПИРЕ 11 3. Обращение к системе 12 3.1. Загрузка системы 12 3.2. Копирование дисков 14 3.3. Вызов РАПИРА-интерпретатора 14 3.4. Режимы работы РАПИРА-интерпретатора 16 3.5. Управление диалогом с клавиатуры 17 4. Входные и выходные данные 20 5. Работа с интерпретатором языка РАПИРА 21 5.1. Простые вычисления на РАПИРЕ 21 5.1.1. Вычисление простых выражений 21 5.1.2. Правила записи предписаний в вводимой строке 22 5.1.3. Некоторые дополнительные возможности 24 5.1.4. Диагностика ошибок и их исправление 25 5.2. Структуры данных и операции над ними 226 5.2.1. Объекты языка. Имена и их значения.Присваивание 26 5.2.2. Защита имен 29 5.2.3. Тексты и операции над ними 30 5.2.4. Составные объекты и их формирование 34 5.2.5. Операции над кортежами 36 5.2.6. Операции над множествами 38 5.2.7. Операции над записями 39 5.2.8. Процедуры и функции. Вызов 39 5.2.9. Файлы 40 5.3. Управляющие конструкции 41 5.3.1. Структура программы 41 5.3.2. Общая структура предписания 42 5.3.3. Лексемы 42 5.3.4. Уточненное имя. Присваивание 44 5.3.5. Выражения. Приоритеты операций 45 5.3.6. Условия 47 5.3.7. Условные предписания 49 5.3.8. Циклы 52 5.3.9. Вывод 58 5.3.10. Форматы вывода различных объектов 59 5.3.11. Ввод текстов и данных с клавиатуры 64 5.4. Подготовка и хранение программ 67 5.4.1. Подготовка рабочих дисков 67 5.4.2. Редактирование программных текстов 69 5.4.3. Порядок запуска программ 75 5.4.4. Просмотр каталога диска ээ 76 5.5. Процедуры и функции 77 5.5.1. Основные черты процедурного блока 77 5.5.2. Порядок описания и редактирования процедур 78 5.5.3. Процедуры,как объекты языка 80 5.5.4. Блочная структура программы. Локализация имен 81 5.5.5. Параметры процедур и функций. Способы передачи параметров. Рекурсия 83 5.5.6. Порядок выполнения процедур 86 5.5.7. Ограничение побочных эффектов в РАПИРЕ 87 5.6. Отладка программ.Отладочные средства РАПИРЫ 89 5.6.1. РАПИРА-интерпретатор, как система программи- рования 89 5.6.2. Управление системой.Приостанов программы. Директивы режимов останова 90 5.6.3. Языковые средства отладки. Прокрутка и след 94 5.7. Файлы и обмен. Работа с внешней памятью 96 5.7.1. Внешняя память. Библиотеки файлов 96 5.7.2. Текстовые файлы произвольного доступа 98 5.7.3. Открытие и закрытие файла 99 5.7.4. Действия с файлами 102 5.7.5. Переключение ДЗУ 106 5.8. Организация ввода-вывода 106 5.8.1. Потоки информации и устройства ввода-вывода 106 5.8.2. Переключение потоков 108 5.9. Графика и организация диалога 110 5.9.1. Графические возможности ЭВМ "Агат" 110 5.9.2. Управление графикой и диалогом в РАПИРЕ 112 5.9.3. Стандартные графические процедуры 115 5.9.4. Работа с текстовой страницей 119 5.10. Модули и исполнителИ 120 5.10.1. Расширение аппарата процедур в РАПИРЕ 120 5.10.2. Модули 120 5.10.3. Описание модуля 122 5.10.4. Включение и выключение модуля 123 5.10.5. Доступ к именам модуля 125 5.10.6. Маскировка остановов 125 5.10.7. Описание исполнителей с помощью модулей 127 5.10.8. Описание синтаксиса исполнителя 128 6. Сообщения системы 130 6.1. Лексические и синтаксические ошибки 130 6.2. Ошибки исполнения программы 137 Приложение 1. Синтаксическая сводка РАПИРЫ 149 Приложение 2. Кодировка символов 158 Приложение 3. Стандартные процедуры и функции РАПИРЫ 167 Приложение 4. Комплектующие программы 176 Приложение 5. Отличия версий 188
1. НАЗНАЧЕНИЕ И УСЛОВИЯ ПРИМЕНЕНИЯ 1.1. Назначение и структура системы Система "ШКОЛЬНИЦА" предназначена для оснащения персональных микроЭВМ, используемых в учебном процессе школ и других вычислительных кабинетов. Ядро системы составляют: - дисковая операционная система (ДОС), обслуживающая библиотеки файлов на ГМД; - базовые подпрограммы ввода-вывода, обслуживающие ввод с клавиатуры и вывод на экран и обеспечивающие принятые в системе правила ведения диалога. В состав системы входят следующие модули. 1) РАПИРА-интерпретатор. РАПИРА - это учебно-производственный диалого-ориентировачный бестиповый язык высокого уровня, предназначенный для оперативного решения на ЭВМ небольших задач и для обучения пользователей, в том числе - студентов и школьников; допускающий разработку прикладных пакетов средней сложности. Второй входной язык системы, РОБИК, предназначен для обучения оновам и навыкам программирования младших школьников и реализуется тем же интерпретатором. В интерпретатор встроены: - диалоговый экранный Редактор программных текстов (5.4.2); - графическая подсистема, управляемая из языка набором графических процедур (5.9); 2) Диалоговый отладочный комплекс (ДОК), позволяющий работать с ЭВМ на языке машинных команд и включающий в себя: - диалоговый экранный Редактор; - ассемблер; - символьный отладчик. 3) Программа копирования дисков. Стандартное программное наполнение системы представлено набором программ на РАПИРЕ (описаны в Приложении 4): - комплект тригонометрических и других математических функций; - процедура сбора статистики по допущенным в течение сеанса ошибкам; - базовый комплект исполнителей для РОБИКА; - редактор алфавитов символов, используемых в графике; - программа печати этой инструкции; - программа генерации музыкальных звуков; - комплект программ для обслуживания дисков. Все они могут служить примерами прикладных программ, написанных на языке РАПИРА. 1.2. Версии системы В этом руководстве описывается версия системы с индексом А1.3 по состоянию на 1.1.1987. Различия между ранними версиями А1.2, А1.2' и А1.3 приведены в Приложении 5. 1.3. Условия применения Система работает в следующей минимальной конфигурации технических средств: - ЭВМ "АГАТ" с объемом ОЗУ не менее 64 Кбайт и ППЗУ не менее 32 Кбайт (7 исполнение) и дисководом ЕС-5088 для гибких магнитных дисков диаметром 133 мм; - цветной телевизионный монитор. Для расширения возможностей системы могут быть дополнительно подключены: - комплект потенциометров; - печатающее устройство D-100 или СРА-совместимое. - второй дисковод, подключенный к тому же разъему, что и первый.
2. ХАРАКТЕРИСТИКИ ПРОГРАММЫ 2.1. Технические характеристики Наименование Ограничение -------------------------------------------------------- Базовая ЭВМ АГАТ (7 исполнение) - ОЗУ 48+16 К байт - ППЗУ 32К байт - ДЗУ НГМД ЕС-5088 - емкость 140К байт - количество один или два на одном раз еме - телемонитор цветной - печатающее устройство нет, D-100, СРА-80 - потенциометры до 2 Экран - текстовые режимы: ГЦС: 32х32 цветных символа ГНС: 64х32 ч/б символа - графические режимы: ГСР: 128х128 цветных точек ГВР: 256х256 ч/б точек ГНР: 64х64 цветных точек - число различных цветов: 8 2.2. Характеристики РАПИРА-интерпретатора Наименование Ограничения -------------------------------------------------------- Об ем интерпретатора 40К байт Об ем рабоч. памяти 32К байт Программные стеки 1.25К байт Рабочая память Редактора 8К байт Число различных символов 256 Буфер вводимой строки 256 символов 2.3. Количественные ограничения в РАПИРЕ Наименование Ограничение -------------------------------------------------------- Макс.длина вводимой лексемы 255 сим. Макс.целое число (модуль) 2**1016-1 Точность представления дроб.чисел 12 знаков Порядок дробных чисел -128<х<128 Макс.порядок дроб.числа на вводе 127 Макс.целая часть дроб.числа на вводе (без незначащих нулей) 127 цифр Макс.число различных имен (включая стандартные) 256 Макс.размер кортежей на вводе 255 эл-тов Макс.мощность множества 255 эл-тов Макс.число параметров проц.блока 127 Макс.число локальных имен проц.блока 255 Различаемая длина имени файла 30 литер Число одновременно открытых файлов 7 Размер диска в блоках 560 Макс.наполнение потока вывода 2 файла+экран или печ.устр. 3 файла
3. ОБРАЩЕНИЕ К СИСТЕМЕ 3.1. Загрузка системы Загрузка системы производится автоматически после выбора альтернативы 'РАПИРА' в начальном меню ИКП. Дополнительные сведения. 1) Если используются два дисковода, загрузочный диск следует вставлять в дисковод на первом приводе. 2) Если машина уже включена и выдает приглашение какой-либо другой системы (например, "*", "]", ">"), нужно провести перезагрузку системы с соответствующего дисковода, вставив в него предварительно системный диск "Школьницы". 3) Если вы не знаете, как проводится перезагрузка из другой системы, или если она у вас не получилась, лучше всего выключить машину и включить ее снова. При этом в дисководе должен находиться диск ИКП1. 4) Во время загрузки возможны сообщения - ОШИБКА ОБМЕНА - модуль не читается с диска; ошибка возможна при незакрытом дисководе, отсутствии диска в дисководе, порче информации на диске или физической порчи самого диска, а также при попытке считывания с неразмеченного диска. - ПРОГРАММА ИСПОРЧЕНА - ошибка контроля правильности кода загружаемого блока; возникает при порче информации на диске или при попытке загрузки с другого диска. - СИСТЕМНЫЙ СБОЙ - другие ошибки в загружаемом блоке, делающие невозможной его работу. Система перезагружается. Перезагрузка происходит и при нажатии клавиши "СБРОС". 3.2. Копирование дисков Модуль копирования дисков вызывается из главного меню выбором альтернативы 'КОПИРОВАНИЕ'. Сначала копируется весь диск ИКП1, затем в режиме 'УДАЛЕНИЕ ФАЙЛОВ' освобождается требуемое количество свободного места на дубликате. Не рекомендуется удалять с загрузочного диска файл 'ЗАПУСК'. Для возврата в меню следует вставить в дисковод N1 диск ИКП1 или полученный дубликат и нажать одновременно клавиши УПР и СБРОС. 3.3. Вызов РАПИРА-интерпретатора В случае успешной загрузки в верхней, информационной строке появляется заголовок: ** РАПИРА-АГАТ 1.3 ** после чего выполняется программа ЗАПУСК с загрузочного диска. При вызове интерпретатора из меню она выдает в средней части экрана: ЕСЛИ ВЫ НЕ ЗНАКОМЫ С СИСТЕМОЙ, НАБЕРИТЕ ЗАПУСК ИНСТР; Последнее сообщение выдается программой ЗАПУСК, которая автоматически запускается при вызове системы. Возможно появление сообщения "ФАЙЛ НЕ НАЙДЕН", если эта программа отсутствует. В нижнем левом углу появляется приглашение к диалогу: знак # . Признаком того, что система ожидает ввода с клавиатуры, всегда служит появление на экране курсора. Курсор отмечает на экране монитора позицию, начиная с которой будет отображаться вводимая информация. В системе "ШКОЛЬНИЦА" он имеет вид мигающего подчерка. Если курсор на экране отсутствует, значит ввод по той или иной причине невозможен (идет исполнение программы, машина "зависла" и т.п). Выдача приглашения означает, что система готова к работе, и можно вводить любое предписание языка РАПИРА. Чтобы вернуться обратно в системное меню или вызвать другую систему, необходимо вставить загрузочный диск в дисковод N1, набрать предписание ВКЛ МЕНЮ; и нажать клавишу "перевод строки". 3.4. Режимы работы РАПИРА-интерпретатора В системе предусмотрено несколько режимов диалога, которые отличаются набором допустимых возможностей. Установить, в каком режиме система находится в данный момент, можно по информационной строке экрана. 1) В основном диалоговом режиме на верхней строке высвечивается название доступного языка и текущей версии интерпретатора: ** РАПИРА-АГАТ 1.3 ** ** РОБИК-АГАТ 1.3 ** В этом режиме допускается использование всех предписаний данного языка, а также директивы "РАПИРА" и "РОБИК". Они производят очистку памяти и перевызов интерпретатора без перезагрузки с диска. При этом оказывается доступен один из указанных языков. Снова запускается программа ЗАПУСК, выдающая в этом случае: СИСТЕМА ПЕРЕВЫЗВАНА Подробнее этот режим описан в 5.3.1 и 5.6.1. 2) В режиме приостанова информационная строка имеет вид: >> П А У З А << Система переходит в этот режим после прекращения исполнения процедуры, вызванного предписанием СТОП или нажатием клавиши останова F1. Здесь разрешается исполнение тех же директив, что и в основном режиме, и дополнительно директив ШАГ, ВЫХОД и ПУСК. 3) В режиме останова по ошибке информационная строка имеет вид: >> О Ш И Б К А << Система переходит в этот режим, когда при исполнении процедуры или функции возникает ошибка. Кроме директив основного режима здесь допустима директива ВЫХОД : возврат в основной режим. Оба режима останова носят отладочный характер и подробнее описываются в 5.6.2. 4) В режим редактирования пользователь попадает по директивам ПРОЦ и ФУНК. Здесь можно только набирать и исправлять тексты программ; все вводимые предписания не исполняются немедленно, а только запоминаются. При выходе в основной диалоговый режим может быть проверена корректность набранной программы. Редактирование ведется с помощью функциональных клавиш или выбором из меню. Подробнее этот режим описан в 5.4.2. 3.5. Управление диалогом с клавиатуры Находясь в основном диалоговом режиме (здесь и далее подразумеваются также оба режима останова, если не оговорено особо), можно достаточно свободно использовать при наборе весь экран. Клавиша "РЕД" устанавливает режим свободного перемещения по экрану: с помощью клавиш-стрелок можно подвести курсор к любой точке экрана, не вводя при этом в машину ни одного символа. В этом режиме курсор на экране имеет вид мерцающего знака "^". Нажатие любой другой клавиши вызывает выход из этого режима. Клавиши "вверх" и "вниз", нажатые вне этого режима, имеют тот же смысл. Клавиша "->" кроме перемещения курсора дописывает в конец вводимой строки текущий символ с экрана. Пройдя по некоторому тексту на экране курсором, можно, таким образом, ввести его в машину, не набирая заново. Клавиша "<-" кроме перемещения курсора стирает последний символ во вводимой строке, оставляя его на экране. Стирается не всегда тот символ, на который указывает курсор. Если, например, в ситуации ПРИМЕР НЕСООТВЕТСТВИЯ ТЕКСТА ЭКРАНУ_ нажать клавишу "вверх" и пять раз клавишу "<-", то из вводимой строки исчезнут буквы "КРАНУ", а не "ЕСООТ", как это будет изображено на экране. Клавиша "F2" уничтожает на экране текущий символ, сдвигая при этом остаток экранной строчки влево. На освободившееся место вставляется пробел. Клавиша "F3" освобождает на экране одну позицию перед текущим символом. Остаток экранной строчки при этом сдвигается вправо, и последний символ в ней пропадает. Символ "УПР-L" очищает текстовое окно экрана и устанавливает курсор в его левый верхний угол. Функциональные клавиши "1", "2", "3", "4", "5", "6", "7", "0", ".", "=" и соответствующие им символы управляют цветом вывода символов и фона на экран (Приложение 2). Клавиша "9" заполняет пробелами остаток экрана, начиная с текущей позиции курсора. Клавиша "8" переключает экран на показ текущей текстовой и текущей графической страниц в зависимости от того, какая из них показана в данный момент. Клавиша перевода строки вызывает анализ машиной очередной набранной строки. Клавиша "F1" является универсальной клавишей останова. Нажатие клавиши "УПР-Х" означает отказ от ввода строки. При этом на экране появляется символ "\", строчка автоматически переводится, и выдается приглашение к новому вводу. Клавиша "УПР-V" позволяет записать во вводимую строку любой управляющий символ, не выполняя связанных с ним действий. На экране этот символ высвечивается инверсным желтым цветом. Вставка обычного символа равносильна вводу самого символа. Нельзя вставить только символ "перевод строки" (код 141, клавиша "УПР-М"). Часть перечисленных выше клавиш выполняют указанные действия на выводе, т.е. при выводе на экран соответствующих им символов (называемых поэтому управляющими). Это дает возможность задавать эти действия в программе, вставляя управляющие символы в выводимые сообщения.
4. ВХОДНЫЕ И ВЫХОДНЫЕ ДАННЫЕ Данные системы "ШКОЛЬНИЦА" - это объекты ее входных языков, программы, сообщения системы и ответы на них. Входные данные: - программы, - данные, запрашиваемые из программ предписанием "ВВОД", - ответы на запросы системы, - функции, процедуры и модули на внешних носителях. Выходные данные: - результаты работы программы, выдаваемые предписанием "ВЫВОД", - сообщения системы, - рисунки, выдаваемые на телемонитор и запоминаемые на НГМД, - звуковые сигналы, - файлы и программы на НГМД. В РАПИРА-интерпретаторе допускается управление выводом информации различного назначения на различные внешние устройства (5.8).
5. РАБОТА С ИНТЕРПРЕТАТОРОМ ЯЗЫКА РАПИРА 5.1. Простые вычисления на РАПИРЕ 5.1.1. Вычисление простых выражений Элементарные действия, которые можно выполнять непосредственно в режиме диалога - это вычисление арифметичеких выражений с помощью простейшей формы предписания вывода. Для этого необходимо, получив приглашение к вводу (#): 1. Набрать вопросительный знак (?). 2. Набрать нужное арифметическое выражение. 3. набрать точку с запятой (;). 4. Выполнить перевод строки (нажать клавишу с изогнутой стрелкой) для ввода набранной строки в машину. Правила записи выражений традиционны для процедурных языков программирования: для обозначения операций сложения, вычитания, умножения, деления и возведения в степень используются знаки "+", "-", "*", "/" и "**", соответственно. Приоритеты операций и правила расстановки скобок соответствуют общепринятым, причем допускаются только круглые скобки. Если предписание набрано верно, то на следующей строке появляется результат вычислений. Например: # ?25; 25 # ?5986*1928+961**2-512/256; 12464527 Здесь и далее в примерах диалога знак приглашения # только указывает на те строки, которые набраны пользователем: писать его нельзя. В записи дробных чисел (д7 - здесь и далее так обозначаются номера диаграмм синтаксического описания языка, приведенного в Приложении 1) для отделения целой части от дробной используется точка: число 12,41 (двенадцать целых и сорок одна сотая) записывается как 12.41 . Разрешена запись чисел в формате с плавающей точкой, при этом для обозначения десятичного порядка числа используется буква "Е", например, 10,15 х 10 ** 24 записывается как 10.15Е24, а 56 х 10 ** -18 - как 56Е-18 . Точка в записи дробного числа разделяет цифры: вместо 5. и .25 следует писать 5.0 и 0.25 . Если в ариметических операциях участвуют и целые, и дробные числа, результат всегда будет дробным. 5.1.2. Правила записи предписаний во вводимой строке Все символы, набираемые с момента получения приглашения до перевода строки образуют вводимую строку. Максимальная ее длина в режиме диалога - 255 символов. Это больше размеров экранной строчки по горизонтали, поэтому вводимая строка может занимать несколько экранных строчек. За 8 позиций до конца строки каждый вводимый символ сопровождается звуковым сигналом. Когда же вводимая строка заполняется полностью, ввод новых символов временно прекращается до нажатия клавиши перевода строки. 1) Между числами и знаками операций может стоять любое количество пробелов, но внутри числа пробелы не допускаются. Недопустимы они и внутри составных знаков операций, например "**". Так, предписания ?25+16*48; и ? 25 + 16* 48 ; эквивалентны, но предписание ?2 5+16*48; ошибочно, и при его разборе система выдаст сообщение об ошибке. 2) Перевод строки синтаксически равнозначен пробелу, что позволяет располагать одно предписание на нескольких строках. Никакие знаки или признаки переноса при этом недопустимы! Также недопустимо разбивать переводом строки числа и сложные знаки операций. Например, предписание # ?512*296; можно набрать и так: # ? > 512 > * 296; Появление приглашения ">" вместо "#" означает, что предписание еще не закончено и его следует продолжить. 3) Точка с запятой (;) является признаком конца предписания, позволяя записывать на одной строке несколько предписаний подряд. При нажатии клавиши перевода строки исполняются все предписания, законченные во вводимой строке, например: # ?5*8; ?3+4; ?15*67; 40 7 1005 5.1.3. Некоторые дополнительные возможности 1) Для вычисления сразу нескольких выражений их можно указать в одном предписании вывода, разделяя запятой. В этом случае результаты будут выданы на одной строке. Например: # ?5.8*8,3+4,15*67; 46.4 7 1005 2) Над целыми числами предусмотрена также операция деления нацело, обозначаемая "//": # ? 28//3, -28//3 ; 9 -9 3) Диапазон представления целых чисел: |N|<2**1016 , дробных: 10**-128 < |х| < 10**128 . Точность представления дробных чисел - 12 значащих цифр. Числа, порядок которых меньше -127, преобразуются в ноль. Замечания: а) На вводе допустимы лишь числа не длиннее 255 цифр (длина вводимой строки). б) Диапазон представления целых чисел больше, чем диапазон дробных. Скорость выполнения операций над целыми числами также больше, чем над дробными примерно вдвое. Поэтому при решении прикладных задач, требующих высокой точности и повышенной скорости, выгоднее использовать целую арифметику (заменяя деление делением нацело и вводя масштабный множитель). 4) Возведение чисел в дробную степень не реализовано. Для этого следует воспользоваться функциями из стандартного модуля ФУНКЦИИ по формуле: Х**У = ЕХР(У*LN(Х)) 5) Операции "унарный плюс" нет. Поэтому выражения +10-5 или 8*(+6) считаются ошибочными. 5.1.4. Диагностика ошибок и их исправление Если во вводимой строке содержится несколько предписаний, анализ и выполнение каждого из них начинается только после выполнения предыдущего предписания. При ошибке в записи очередного предписания подается звуковой сигнал, на экране дублируется часть вводимой строки, причем ошибочное место выделяется, а затем выдается диагностическое сообщение. Предписание, в котором обнаружена ошибка, не исполняется, и вся оставшаяся часть вводимой строки не анализируется. Все возможные сообщения об ошибках, пояснения, помогающие понять причины их возникновения, а также способы устранения приведены в 6. При обнаружении ошибки во время исполнения предписания (например, при делении на 0) выполняются те же действия, но строка с ошибкой не выдается. Если ошибка во вводимой строке замечена до перевода строки, то ее можно исправить сразу, а если ошибка своевременно не замечена, и получено диагностическое сообщение, необходимо ввести предписание заново, исправив ошибку. Для этого можно использовать описанные в 3.5 средства экранного редактирования. 5.2. Структуры данных и операции над ними 5.2.1. Объекты языка. Имена и их значения. Присваивание РАПИРА-интерпретатор моделирует на ЭВМ операционную обстановку (программную среду), в которой действует сам пользователь и его программы. Объекты этой среды образуют набор доступных для обработки данных, операции и предписания языка определяют способы, а программы - последовательность их обработки. Существуют объекты следующих видов: - целые числа (5.1.1), - дробные числа (5.1.1), - тексты (5.2.3), - множества (5.2.4, 5.2.6), - кортежи (5.2.4, 5.2.5), - записи (5.2.4, 5.2.7), - процедуры (5.2.8, 5.5), - функции (5.2.8, 5.5), - файлы (5.2.9, 5.7), - пусто. Объекты могут указываться непосредственно в тексте программы, вводиться в ходе ее исполнения или возникать в результате операций над другими объектами. Последние уничтожаются после использования их в предписании или следующей операции. Так, например, пропадают все промежуточные результаты, возникающие при вычислении выражения. Чтобы сохранить в памяти для последующего использования некоторый объект ему необходимо дать имя (присвоить его некоторому имени). Сам объект называется значением имени. Форма имени в РАПИРЕ традиционна (д9): оно состоит из букв и цифр, причем на первом месте должна стоять буква. В связи с отсутствием на клавиатуре ЭВМ "АГАТ" строчных букв допускается использование только заглавных букв; подстрочные символы (например, применяемые в математике индексы) также запрещены. Совпадающие по написанию русские и латинские буквы не различаются (буквы "У" и "Y" различаются!). Символы в имени разрешено для удобства чтения разделять одиночными подчерками. Примеры имен: Х У1 WОRD16А2 ИМЯ_УЧЕНИКА Примеры ошибочных имен: 6Н3П (имя не может начинаться с цифры) _СКОРОСТЬ_ (в начале и в конце имени подчерк недопустим) ВЫСОТА__ГОРЫ (два подчерка не могут стоять подряд) Счетчик (строчные буквы недопустимы). Длина имен в РАПИРЕ ограничена только длиной вводимой строки (255 символов). При распознавании имен учитываются все символы, включая подчерки. Количество различных по написанию имен, известных в данный момент системе, не должно превышать 256 (считая стандартные имена, локальные параметры процедур и функций, имена полей записей, см. 5.2.4, 5.5.3, 5.5.4). Имена можно использовать в программе без какого-либо предварительного объявления. Всякому имени (за исключением защищенных, см. 5.2.2) можно присвоить значение любого вида. Допускается присваивание одному и тому же имени значений различных видов в произвольном порядке. Предписание присваивания в простейшем случае имеет вид: выражение -> имя ; Примеры: # 5->Х; # Х*28+17**Х->СКОРОСТЬ; # Х*8->Х; Для просмотра текущих значений имен удобно использовать простейшую форму вывода: # ?Х,СКОРОСТЬ; 40 1419997 Если в выражении или предписании использовано имя, то подразумевается его значение (объект, запомненный под этим именем): # ? Х+СКОРОСТЬ/2; 710038.5 Имена, которым не были присвоены значения в программе, имеют по умолчанию значение "пусто". Предусмотрено стандартное имя ПИ, имеющее значение 3.14159265359. Просмотреть список всех имен (кроме стандартных), использованных в системе с момента загрузки (перевызова) РАПИРЫ и имеющих непустое значение, можно при помощи предписания КАТАЛОГ ИМЕН; Просмотреть список, содержащий и имена с пустыми значениями, можно так: # КАТАЛОГ ВСЕХ ИМЕН; -- КАТАЛОГ ПРОЦЕДУР -- ЗАПУСК.............. ПРОЦ -- КАТАЛОГ ИМЕН -- СУММА............... ЦЕЛ (П) ТАБЛИЦА............. КОРТ РАБ_ИМЯ............. ПУСТ ПУСТО............... ПУСТ Здесь после имени указывается вид его значения, а перед - тип защиты (если она есть). 5.2.2. Защита имен Этот пункт можно пропустить при первом чтении. Имена в РАПИРЕ могут иметь защиту от присваивания. Различается 4 уровня защиты: отсутствие ее, частичная, полная и абсолютная (системная). Если на имя установлена частичная защита, то его значение может быть изменено только после дополнительного подтверждения. При попытке присвоить новое значение такому имени выдается запрос: имя : ПРИСВАИВАТЬ (Д/Н)? и только в случае положительного ответа присваивание будет выполнено. Если на имя установлена полная защита, то попытка присваивания ему будет рассматриваться как ошибка. Чтобы изменить значение имени, нужно сначала выключить его защиту. Абсолютная (системная) защита устанавливается и отменяется системой и не может быть изменена пользователем. Такую защиту имеют, например, имена процедур и функций в момент вызова, имена-параметры циклов перебора, имена важнейших стандартных процедур и функций и т.п. Эта защита служит для предотвращения побочных эффектов, т.е. действий, могущих привести к нарушению правил выполнения предписаний (подробнее см в 5.5.7). Для включения и выключения полной и частичной защиты используются предписания ВКЛ и ВЫКЛ (д35). Например, предписания # ВКЛ ЧАСТ ЗАЩИТУ ИМЕН:А,Б; # ВКЛ ЗАЩИТУ:В; устанавливают на имена А и Б частичную защиту, а на имя В - полную; предписание # ВЫКЛ ЗАЩИТУ:Б,В; снимает установленные ранее защиты с имен Б и В. Включение полной защиты имени отменяет частичную и наоборот. Если упомянутые в предписании ВЫКЛ имена не имеют никакой защиты, то никаких действий над ними не производится. В каталоге имен перед защищенными именами в скобках указывается первая буква названия защиты. Механизм защиты имен позволяет избежать случайной потери особо важной информации из-за неосторожных присваиваний в процессе диалога с ЭВМ, он способствует соблюдению дисциплины программирования и может быть полезен при отладке. 5.2.3. Тексты и операции над ними Текст - это произвольная последовательность символов. При записи в составе программы тексты заключаются в кавычки (д8), например: "ТЕКСТ" "SIМРLЕ ТЕХТ" "123+45"" Все символы текста, включая пробелы, занумерованы слева направо, начиная с единицы, например: "НУМЕРАЦИЯ" 123456789 Кавычки, окаймляющие текст, в его состав не входят. Тексты, как объекты, могут быть значениями имен, входить в состав выражений. Над ними определены следующие операции: 1) Определение длины - унарная операция, обозначаемая знаком "#". Длиной текста называется количество символов в нем. Пример: # "КРОКОДИЛ"->Т; ?Т,#Т; КРОКОДИЛ 8 (тексты выводятся без окаймляющих кавычек). 2) Конкатенация (слияние) - бинарная операция, обозначаемая знаком "+": # "ВЕЛО"+"СИПЕД"->Т; ?Т; ВЕЛОСИПЕД 3) Выборка - извлечение одного символа по его номеру в тексте (индексу). Обозначается квадратными скобками, например: "ТЕКСТ"[3] Результат выборки - литера, т.е. текст единичной длины. В качестве индекса может быть использовано любое выражение с целым положительным значением, не превосходящим длины текста. Примеры: # ?"ДИНОЗАВР"[3]; Н # 5->Х; "КРОКОДИЛ"->Т; ?(Т+Т)[3*Х]; И 4) Вырезка - извлечение участка текста, определяемого индексами начального и конечного символов. Обозначается так же, как и выборка, но в скобках указываются два индексных выражения через двоеточие, например: Т[3:4] , "БЕГЕМОТ"[N:N+1] . Дополнительное условие: второй индекс должен быть не меньше первого. Примеры: # ?"ВЕЛОСИПЕД"[5:7]; СИП # "ПРИМУС"->Х; # Х[4:4]+Х[3]+Х[6]+Х[#Х]+Х[#Х-1]+Х[2:3]->РЕКА; # ?РЕКА; МИССУРИ Операции выборки и вырезки могут стоять как слева, так и справа от знака присваивания. В последнем случае они позволяют изменять отдельные символы или участки текстов, являющихся значениями имен. Например: # "КРОКОДИЛ"->К; "Я"->К[3]; "УШКА"->К[5:#К]; ?К; КРЯКУШКА Такие присваивания не меняют длины текста, поэтому длина текста в левой части предписания присваивания должна быть в точности равна длине заменяемого участка. Если значением имени Д является текст "ТЕКСТ С ОПЕЧТКОЙ", то нельзя исправить ошибку с помощью присваивания # "ЧАТ"->Д[#Д-4:#Д-3]; Требуемого результата можно достичь, комбинируя вырезку и конкатенацию: # Д[1:#Д-4]+"А"+Д[#Д-3:#Д]->Д; Дополнительные сведения. 1) Как слева, так и справа от знака присваивания можно использовать несколько выборок и вырезок подряд, поскольку результат этих операций - тоже текст, и к нему можно снова применять все операции над текстами. Например: # ?"ГИППОПОТАМ"[5:10][3:5][2][1]; А Подробнее эта конструкция описана в 5.2.5 на примере кортежей, обрабатываемых аналогично. 2) При вводе текста в составе предписания с клавиатуры на него распространяются все правила набора лексем. В частности, текст не может быть разорван переводом строки и продолжен на другой строке, поэтому его длина на вводе не может превышать 253 литер (плюс две окаймляющие кавычки - всего 255 символов). Однако длина текста, получающегося при выполнении операций над другими текстами, ограничивается только объемом доступной памяти и может достигать нескольких тысяч литер. 3) При вводе текста с клавиатуры в его состав могут входить другие символы, в т.ч. управляющие. Управляющий символ попадает во входную строку только после нажатия клавиши УПР-V и высвечивается желтым цветом (см. также Приложение 2). 4) Если в состав текста требуется включить кавычку, то ее нужно повторить дважды: # ?"ЛЕДОКОЛ ""АЛЬБАТРОС"""; ЛЕДОКОЛ "АЛЬБАТРОС" 5) Допустим пустой текст "". Его длина равна нулю. 6) Есть возможность сформировать текст заданной длины, состоящий из одинаковых символов (Приложение 3, функция ФТЕКСТ). 5.2.4. Составные объекты и их формирование Составными объектами в РАПИРЕ являются множества, кортежи и записи. Множество - это неупорядоченная совокупность произвольных попарно различных элементов. Кортеж - это упорядоченная совокупность произвольных элементов. Запись - это совокупность различных именованных полей, значением каждого из которых может быть произвольный элемент. Элементом составного объекта может быть объект любого вида (см. 5.2.1). Таким образом, составные объекты могут быть вложенными: элементом одного из них, например, могут быть другие множества, кортежи или записи. Для образования составных объектов служит операция формирования (д14). Объединяемые элементы записываются через запятую и заключаются в скобки, соответствующие виду составного объекта: < > - для кортежей, <* *>- для множеств, <$ $> - для записей. При формировании записи перед каждым элементом через двоеточие указывается имя поля. Примеры: # <5,"МАМА",<1,5>,5>->К; # <*1,1+1,К,1,<1,5>,2*>->М; # <$ИМЯ:"ИВАН",ФАМИЛИЯ:"ПЕТРОВ"$>->ЗАП; Теперь значение имени К - кортеж из четырех элементов: числа 5, текста "МАМА", кортежа <1,5> и еще одного числа 5. Значение М - множество из четырех элементов: чисел 1,2, кортежей К и <1,5>. Одинаковые элемЕнты учитываются в множестве только один раз, а в кортеже - столько раз, сколько указано: например, кортеж <5,5,5> состоит из трех элементов, а множество <*5,5,5*> - из одного. Значение имени ЗАП - запись из двух полей: ИМЯ и ФАМИЛИЯ. Названия полей записываются по тем же правилам, что и имена. При формировании в составной объект включаются копии значений указанных выражений или имен, а не сами эти имена: # 1->А; <*А*>->В; 10->А; ?В,А; <*1*> 10 Операция формирования может входить в состав более сложных выражений с использованием операций над составными объектами, описанными в следующих параграфах. Форма вывода составного объекта соответствует записи операции его формирования. При этом порядок следования элементов в неупорядоченных множествах и записях может быть произвольным. Особенности и ограничения. 1) Запись формирователя составного объекта может занимать несколько строк в программе: # <1,2, > 3 > ,4 > ,5>->Х; 2) Допустимы пустые множество <* *> и кортеж < >, но не пустые записи. Все перечисленные ниже объекты различны: <* *> , < > , <* ПУСТО *> , < ПУСТО > , ПУСТО . 3) Максимальное число элементов множества и записи, а также число участвующих в операции формирования кортежа элементов - 256. Максимальная длина кортежа, получающегося в результате других операций, и глубина вложенности всех составных объектов зависит только от объема памяти и размеров системных стеков. 4) Можно сформировать кортеж любой заданной длины, заполненный одинаковыми элементами (Приложение 3, функция ФКОРТ). 5.2.5. Операции над кортежами Над кортежами предусмотрены такие же операции, как и над текстами (5.2.3): - определение длины (#), - конкатенация (+), - выборка ([N]), - вырезка ([N1:N2]). Они выполняются так же, как операции над текстами, если вместо символов рассматривать элементы кортежа. Примеры: # <1,5,"ПРОБА",<"А","В","СЛОВО">>->К; # ?#К; 4 # К+<"НОВОЕ СЛОВО">->К2; ?К2; <1,5,"ПРОБА",<"А","В","СЛОВО">,"НОВОЕ СЛОВО"> # ?К[3]; ПРОБА # ?К[2:3]; <5,"ПРОБА"> # ?К[4][3][2]; Л # "СПОРТ"->К[4]; <1,2>->К2[4:5]; # ?К; ?К2; <1,5,"ПРОБА","СПОРТ"> <1,5,"ПРОБА",1,2> Ограничения на допустимые значения индексов те же, что и для операций над текстами. Существует единственное, но важное различие между операциями вырезки и выборки для текстов и кортежей. Для текстов выборка и вырезка формируют объекты одного вида - тексты. Например, выражения Т[2] и Т[2:2] равнозначны и выделяют одну литеру. Для кортежей результатом вырезки всегда будет кортеж, а выборки - элемент любого вида (в т.ч. и кортеж). Для кортежей равными будут значения выражениЙ К[2:2] и <К[2]>. Если выборка или вырезка использованы справа от знака -> , то выборке можно присваивать любой элемент, а вырезке - только кортеж. # <1,2,3>->КРТ; # <4> -> КРТ[2]; ?КРТ; <1,<4>,3> # 4 -> КРТ[2]; ?КРТ; <1,4,3> В случае использования многократной вырезки и выборки пару скобок "][" можно заменять запятой. Например, следующие выражения эквивалентны: Т[3][2:5][3] и Т[3,2:5,3] Такая запись удобна, когда вложенные кортежи используются для моделирования двумерных и многомерных таблиц. 5.2.6. Операции над множествами Над множествами предусмотрены следующие операции: - определение мощности (#), - объединение (+), - пересечение (*), - разность (-). Все они имеют обычный математический смысл. Примеры: выражение значение #<*1,2,1,2,1,1+1*> 2 <*5,8*>+<*7,8,6*> <*5,6,7,8*> <*1,2,3*>*<*8,1,3*> <*3,1*> <*8,10,5,6*>-<*7,10,8*> <*6,5*> С использованием перечисленных операций могут быть построены и более сложные выражения, например: А+В-А*В (симметрическая разность). Особенности: 1) В отличие от математической записи в РАПИРЕ пересечение (*) имеет более высокий приоритет, чем объединение (+) и разность (-). Изменить порядок вычисления можно с помощью скобок. 2) В отличие от кортежа и записи доступ к отдельному элементу множества невозможен, поэтому всякое изменеНИа множества, являющегося значением некоторого имени, возможно лишь путем присваивания этому имени нового значения. 5.2.7. Операции над записями Над записями допустима единственная операция - доступ к полю, которая обозначается точкой. Например: # <$СКОРОСТЬ:50,ВЫСОТА:200,НАПРАВЛЕНИЕ:"ЮГ"$>->ПОЛЕТ; # ?ПОЛЕТ.СКОРОСТЬ; 50 Операция доступа к полю также может стоять справа от знака присваивания, позволяя изменять значение отдельных полей записи: # 250->ПОЛЕТ.ВЫСОТА; ?ПОЛЕТ; <$СКОРОСТЬ:50,ВЫСОТА:250,НАПРАВЛЕНИЕ="ЮГ"$> Никакие другие операции над записями недопустимы. В частности, невозможно изменить количество полей в записи и их имена. 5.2.8. Процедуры и функции. Вызов Процедура (а также функция) - это программа или часть программы, являющаяся самостоятельным объектом. При описании указывается имя процедуры (функции), которое затем принимает в качестве значения объект "процедура" ("функция"); см. 5.5.1 и д38,39. Основная операция над объектами этих видов - вызов, т.е. исполнение предусмотренных описанием предписаний. При вызове могут указываться параметры (входные данные). Функции, кроме того, возвращают в качестве результата объект произвольного вида. Вызов обозначается круглыми скобками (д15), в которых через запятую могут указываться значения параметров. Примеры: РАКЕТА(1,2,"ВВЕРХ") SIN(90) ДСЧ() Основное отличие процедуры от функции - наличие у функции результата. Поэтому, вызов процедуры - это действие (выполнение программы): он считается предписанием, а вызов функции - это операция вычисления результата: он приравнивается к выражению. В частности, он может стоять внутри другого выражения. Примеры вызовов процедур: # КАДР(1,2); ЛИНИЯ(10,20,20,30); Примеры использования вызовов функции в выражениях: # ? SIN(ПИ/2); 1.0 # ЦЕЛЧ(10.89) -> А; # ДСЧ()*13->В; Более подробно порядок описания процедур и функций, способы передачи параметров и особенности вызова описаны в 5.5. Замечание. Хотя процедуры и функции в момент описания становятся значениями своих имен, их можно, как и другие объекты, присвоить другим именам и сделать элементами составных объектов. В системе предусмотрен ряд встроенных (т.е. не требующих описания и доступных в любой программе) процедур и функций. Они носят в основном сервисный характер. Описание стандартных процедур и функций приводится в Приложении 3. 5.2.9. Файлы В РАПИРЕ есть файлы произвольного доступа, используемые для хранения во внешней памяти и обработки большой текстовой информации. Действия и операции с файлами: открытие, закрытие, ввод, вывод, позиционирование - описываются в 5.7. 5.3. Управляющие конструкции 5.3.1. Структура программы Понятие программы, как таковой, в РАПИРЕ отсутствует. Программой считается последовательность управляющих действий, исполненных в режиме диалога. Предписания, поступившие в режиме диалога, называются директивами и исполняются немедленно. Признаком конца очередной директивы является точка с запятой (;). Последовательность предписаний может быть объединена в процедурный блок: процедуру или функцию, а затем исполнена при их вызове. Процедурные блоки описываются в режиме редактирования по синтакическим правилам языка (д37-39). Универсальными называются предписания, которые могут и быть директивами, и встречаться в процедурном блоке: - присваивание (5.3.4), - условные (5.3.7), - циклы (5.3.8), - контроль (5.3.7), - вывод (5.3.9), - ввод (5.3.11), - каталог (5.2.1, 5.4.4), - вызов (5.2.8, 5.5.1), - включить и выключить (5.2.2, 5.6.3, 5.8.2), - файловое предписание (5.7), - пустое. Пустое предписание не выполняет никаких действий и никак не обозначяается. Наличие его в языке позволяет: - ставить точки с запятыми там, где они необязательны; - ставить несколько точек с запятыми подряд; - вводить пустые строки. Системные директивы могут употребляться только в режиме диалога: - директивы общего режима РОБИК, РАПИРА, ПРОЦ и ФУНК. - директивы режима приостанова ПУСК, ШАГ, ВЫХОД. 5.3.2. Общая структура предписания Предписания задают действия над объектами программной среды. Сводка правил, описывающих синтаксис предписаний языка, приведена в Приложении 1. В большинстве случаев объекты, участвующие в предписаниях, задаются выражениями. Выражение - это последовательность операций над объектами, заданных именами или константами, каждая из которых выдает некоторый результат - объект определенного вида. Результат последней выполненной операции является значением выражения. В ряде случаев объекты могут задаваться только своими именами. 5.3.3. Лексемы Предписания состоят из отдельных лексем (слов). Лексемы являются минимальными единицами языка, несущими самостоятельную смысловую нагрузку. Различаются следующие типы лексем: - ключевые слова (см. Приложение 1), - целые числа (д6), - дробные числа (д7), - тексты (д8), - простые имена (д9). - специальные символы (простые и составные). Длина лексемы не должна превышать максимального размера вводимой строки, т.е. 255 символов. Между любыми лексемами может быть вставлено произвольное число пробелов и переводов строки; сами же лексемы разрывать нельзя. Если две соседние лексемы при слиянии могут быть приняты за новую лексему (например, два имени или имя и число), то между ними обязателен хотя бы один пробел или перевод строки. Если новая лексема не образуется, то разделитель не требуется, например, имя и знак операции могут быть записаны подряд). Расположение предписаний на строках произвольно: можно располагать одно предписание на нескольких строках и несколько предписаний на одной строке. Пример предписания на РАПИРЕ: ЕСЛИ А>0 ТО 1->А ИНАЧЕ А*3->А ВСЕ; Здесь ЕСЛИ, ТО, ИНАЧЕ, ВСЕ - ключевые слова, А - имя, 1, 0, 3 - константы, ">", "->", "*" ";" - спец.символы. Ключевые слова никак не выделяются, не резервируются и по правилам записи неотличимы от имен. Поэтому употреблять имена, совпадающие по написанию с ключевыми словами, не рекомендуется. Например, предписание ВЫВОД->А; проанализируется системой как предписание вывода, и будет выдано сообщение об ошибке в записи этого предписания ("ТРЕБУЕТСЯ ДВОЕТОЧИЕ"). Между любыми двумя лексемами в программе можно вставить комментарий: произвольную последовательность символов, заключенную в скобки (* *) (д5), например: (* ЭТА ПРОГРАММА ПРЕДНАЗНАЧЕНА ДЛЯ РЕШЕНИЯ УРАВНЕНИЙ ВИДА Х**2+А*Х+В=0 *) Концом комментария является первая встретившаяся лексема *) . Поэтому, вложенные комментарии недопустимы. Комментарий может располагаться на одной или на нескольких строках. В любом случае не допускается запись на одной строке более чем 255 входящих в него символов, включая и скобки. в комментариях обычно записываются пояснения к программе для тех, кто будет читать, использовать и модифицировать ее. Пренебрегать ими не следует. 5.3.4. Уточненное имя. Присваивание В РАПИРЕ возможно изменять отдельные элементы текстов, кортежей и записей, являющихся значениями имен или элементами других составных объектов. Это позволяет сделать общий вид предписания присваивания: выражение -> уточненное_имя ; Уточненным называется имя, за которым следует последовательность операций вырезки, выборки и доступа (д11-12). Уточнение служит для указания изменяемой присваиванием части значения имени, если это текст, кортеж или запись. Уточнение других объектов не допускается. Уточненные имена могут использоваться и в выражениях; в этом случае часть значения имени копируется в самостоятельный объект. Пример: # <<$ЗВЕРЬ:"ЛЕВ",ВЕС:100$>, > <$ЗВЕРЬ:"ТИГР",РОДИНА:"ЛИВИЯ"$>> -> ЗООПАРК; # ?ЗООПАРК[2].РОДИНА; ЛИВИЯ # "ИНД"->ЗООПАРК[2].РОДИНА[1:3]; # ЗООПАРК[1].ВЕС+50->ЗООПАРК[1].ВЕС; # ЗООПАРК; <<$ЗВЕРЬ:"ЛЕВ",ВЕС:150$>,<ЗВЕРЬ:"ТИГР",РОДИНА:"ИНДИЯ"$>> 5.3.5. Выражения. Приоритеты операций Выражение - это последовательность соединенных знаками бинарных операций констант, формирователей, простых имен и выражений в скобках, перед каждым из которых может стоять знак унарной операции, а после - произвольная последовательность операций вырезки, выборки, доступа и вызова (д16). Пример: (<1,2>[2:2]+<А[<3+1,4>[К]]>+А)[1]*-2 Всякое правильное выражение вырабатывает определенное значение (т.к. каждая операция в нем вырабатывает результат). Операции в выражении выполняются в таком порядке: 1) Выражения в скобках и составляющие выражения в формирователях структур; 2) Формирование составных объектов: <> , <**> , <$$> ; 3) Вычисление фактических параметров функций и индексных выражений; 4) Выборка, вырезка, доступ, вызов функции: [] , . , () ; 5) Унарные операции: - , # , @ ; 6) Возведение в степень: ** ; 7) Операции умножения, деления, пересечения: * , / , // ; 8) Операции сложения, вычитания, конкатенации, объединения, разности множеств: + , - . Все операции одного приоритета выолняются слева направо (следовательно, А**В**С означает (А**В)**С ). Для операций с различным приоритетом это описание устанавливает лишь относительный порядок исполнения: всякая операция будет выполнена после того, как будут определены ее операнды, вычисляемые с помощью операций более высокого приоритета. В приведенном выше примере операции будут выполнены в следующем порядке: 1) Формирование кортежа <1,2>; 2) Вырезка [2:2]; 3) Вычисление 3+1; 4) Формирование кортежа из результата (3) и числа 4; 5) Выборка [К]; 6) Выборка из имени А с полученным в результате (5) индексом; 7) Формирование кортежа из выборки (6); 8) Конкатенация кортежей (2) и (7); 9) Конкатенация кортежей (8) и А; 10) Выборка [1] из (9); 11) Вычисление -2; 12) Умножение чисел (10) и (11). Полученный в (12) результат будет значением выражения. Дополнительные сведения. 1) В выражениях вида 5*(-7) скобки можно опускать. 2) При построении выражений необходимо следить за тем, чтобы результатом каждой операции был объект, над которым определена и может быть выполнена следующая по порядку операция. В противном случае будет выдано сообщение об ошибке. Например, конструкция А[5](Х)[11][2:3] является допустимой, если А - это кортеж, пятым элементом которого является функция с одним параметром; результатом этой функции должен быть кортеж, одиннадцатым элементом которого, в свою очередь является текст или кортеж длиной не менее трех. Выражения <1,2,3>[1][2:3] и А[1:5].В недопустимы: в первом случае предпринимается попытка вырезки из числа, а во втором - операция доступа применяется к тексту или кортежу (а только они могут быть результатом вырезки), для которых она не определена. 3) При присваивании, формировании структуры, вырезке, выборке и доступе выражения разыменуются, т.е. константы и значения имен копируются: # 5->А; <А>->В; 10->А; ?В,А; <5> 10 5.3.6. Условия Условием называется утверждение об объектах, которое может быть истинным или ложным. Например, условие "12 больше 3" истинно, а условие "число 7 входит в множество <*1,2*>" ложно. Синтаксис условия описывается диаграммой 19. Смысл логических операций И, ИЛИ, НЕ соответствует принятому в математике. Операции сравнения ">", "<", ">=", "<=" определены только для числовых значений. Логических выражений в языке нет, поэтому условие является специфической конструкцией для условных предписаний и цикла ПОКА. Условие А ВИДА В истинно, если значения выражений А и В - объекты одного и того же вида, и ложно в противном случае. Условие А ИЗ В истинно, если А - литера, входящая в текст В, или А - произвольный объект, являющийся элементом кортежа (множества) В. При сравнении на равенство (=) и неравенство (/=) два объекта считаются равными, если оба они имеют один и тот же вид, причем: - целые числа равны поразрядно с учетом знака, - порядки и мантиссы дробных чисел попарно равны, - тексты и кортежи совпадают поэлементно; - множества равны в математическом смысле; - записи состоят из одних и тех же полей, и значения соответствующих полей равны; - два пустых значения всегда равны; - процедуры, функции и файлы равны, если они получены копированием одного и того же объекта. Примечания: 1) Т.к. в совместных операциях над целыми и дробными числами целые предварительно преобразуются в дробные, сравнение их на равенство возможно. Сравнение при этом производится относительной точностью преобразования. Например, числа 100000000000999999999 и 1Е20 считаются равными. 2) Совпадение элементов множеств и кортежей означает, что они равны в описанном выше смысле. 3) Фактически для процедур, функций и файлов сравниваются ссылки на значение, т.к. при их присваивании копируются ссылки, а не сами значения. Порядок выполнения операций в условиях: 1) Вычисление выражений в операциях сравнения (в т.ч. ИЗ и ВИДА). 2) Сравнение = , /= , < , > , >= , <= , ВИДА , ИЗ. 3) Отрицание НЕ. 4) Конъюнкция И. 5) Дизъюнкция ИЛИ. Примеры истинных условий: "КРОКОДИЛ"/="БЕГЕМОТ" <1,2,3>/=<3,2,1> <*1,2,3*>=<*3,2,1*> <$ИМЯ:"ВАСЯ"$>/=<$ИМЯ:"ПЕТЯ"$> <$А:127$>/=<$В:127$> 2*2=4.0 "ВАГОН"[4:5]="СЛОН"[3:4] 12>-34 ИЛИ НЕ 0>=-13.7 И <1,2.0> ВИДА <> НЕ "Я" ИЗ "ПРИМЕР" И <1> ИЗ <*2,<1>*> 5.3.7. Условные предписания В РАПИРЕ есть два способа ветвления. Условное предписание (д22) выполняется следующим образом. Вначале проверяется условие, записанное между ключевыми словами ЕСЛИ и ТО. Если оно истинно, выполняются предписания, указанные между ТО и ИНАЧЕ (ТО и ВСЕ, если вариант ИНАЧЕ отсутствует). В противном случае выполняются предписания, расположенные между ИНАЧЕ и ВСЕ (или не выполняется ничего, если вариант ИНАЧЕ не предусмотрен). Например: ЕСЛИ А>В ТО 5->А; ? В ИНАЧЕ 5->В; ? А ВСЕ; Предписание выбора (д23) - позволяет выполнить те или иные предписания в зависимости от нескольких условий. Оно представляет собой более удобную форму проверки цепочки условий и позволяет не писать сложную последовательность вложенных предписаний ЕСЛИ. Первая форма выбора позволяет просто проверить набор условий. Как видно из диаграммы, это предписание состоит из произвольного количества альтернатив, каждая из которых представлена условием, за которым через двоеточие следует список предписаний. Альтернативы разделяются знаком "!". Допустима конструкция ИНАЧЕ. Условия проверяются последовательно, в порядке записи альтернатив. Как только одно из них оказывается истинным, выполняются предписания, записанные после него через двоеточие. После этого выполнение предписания ВЫБОР заканчивается. Если ни одно условие не выполнено, исполняются предписания, записанные между ИНАЧЕ и ВСЕ (если эта часть предусмотрена). Таким образом, в любом случае выполняется не более одной из предусмотренных альтернатив. Условия в альтернативах могут быть любой сложности. Пример: ВЫБОР ИЗ ВЕТЕР<=3: ?"СЛАБО" ! ВЕТЕР<=7: ?"УМЕРЕННО" ! ВЕТЕР<=70: ?"ТРЕВОГА!" ИНАЧЕ ?"НЕВЕРНО ЗАДАНА СКОРОСТЬ ВЕТРА" ВСЕ; Вторая форма выбора отличается от первой тем, что вместо проверки условий значение выражения, указанного перед словом ИЗ (параметр выбора) сравнивается поочередно со значениями выражений, стоящими перед альтернативами. Таких выражений может быть несколько (через запятую). В случае равенства выполняется соответствующая альтернатива. Значение параметра вычисляется один раз в начале выполнения предписания. Пример: ВЫБОР ОЦЕНКА ИЗ 5: ?"ОТЛИЧНО" ! 4: ?"ХОРОШО" ! 3: ?"УДОВЛЕТВОРИТЕЛЬНО" ! 1,2: ?"ПЛОХО" ИНАЧЕ ?"НЕПОНЯТНО" ВСЕ; Все условные предписания - составные, т.е. содержат другие предписания, которые также могут быть составными. Концом списка вложенных предписаний считаются слова ВСЕ, ИНАЧЕ и знак "!". Если одно из них пропущено, все дальнейшие предписания будут считаться частью той же ветви. Отсутствие нужного "закрывающего" слова будет обнаружено значительно позднее. Во избежание путаницы рекомендуется оформлять составные предписания так, как в примерах выше: начинать каждое из них с новой строки, а каждое вложенное сдвигать на несколько позиций от начала строки, чтобу структура предписания лучше просматривалась. Это облегчит и чтение программы, и поиск в ней ошибок. К условным относится также предписание контроля (д24). Оно используется для проверки истинности некоторого условия во время исполнения программы. Если условие истинно, это предписание равносильно пустому, в противном случае срабатывает выход в режим останова по ошибке с диагностикой "СРАБОТАЛ КОНТРОЛЬ". 5.3.8. Циклы Для организации многократного выполнения последовательности предписаний используются циклы (д25). Все они являются составными предписаниями и состоят из заголовка и тела. Тело цикла образуется предписаниями, которые надо повторять. 1) Цикл ПОКА имеет традиционную семантику: вначале проверяется условие, указанное в заголовке цикла. Если оно истинно, выполняются все предписания от знака :: (читается "повторять") до слова ВСЕ. Затем снова проверяется условие и т.д. Если при очередной проверке условие оказалось ложным, выполнение цикла прекращается. Если оно было ложным при первой же проверке, тело цикла не выполнится ни разу. Таким образом, этот цикл позволяет выполнять определенные действия, пока истинно некоторое условие. Пример: # 1->Х; # ПОКА Х<=5 :: > ?Х,2**Х; > Х+1->Х > ВСЕ; 1 2 2 4 3 8 4 16 5 32 2) Цикл ПОВТОР позволяет выполнить указанный набор предписаний заданное число раз. Вначале вычисляется значение выражения в заголовке цикла. Оно должно быть целым неотрицательным числом, иначе выдается сообщение об ошибке. Затем тело цикла выполняется указанное число раз. В случае нулевого числа проходов тело цикла не выполняется ни разу. Пример: # 1->Х; # ПОВТОР 5 РАЗ :: > ?Х,2**Х; > Х+1->Х > ВСЕ; 1 2 2 4 3 8 4 16 5 32 (В этом примере несмотря на явно заданное число проходов пришлось ввести и имя-счетчик). Варианты РАЗ и РАЗА эквивалентны, служат для удобства чтения программы и могут быть опущены. 3) Цикл ДЛЯ (цикл перебора) существует в двух формах. Форма ДЛЯ-ОТ соответствует традиционному циклу типа прогрессии. Имя, указанное после слова ДЛЯ, называется переменной цикла, выражение после ОТ определяет начальное значение, выражение после ДО - конечное, после ШАГ указывается приращение. Если шаг не указан, он принимается равным единице. Значения всех трех выражений должны быть целыми или дробными числами. Цикл выполняется в таком порядке: а) Вычисляются все три указанные в заголовке выражения. б) Переменной цикла присваивается начальное значение (с выдачей запроса, если она имела частичную защиту). в) Проверяется условие окончания цикла: текущее значение переменной цикла больше конечного значения при положительном шаге или меньше его при отрицательном ( (КЗ-П) х sign(Ш) >= 0 , где КЗ,П,sign(Ш) - конечное значение, переменная цикла и знак шага соответственно; знак нуля считаем единицей). г) Если оно ложно, выполняется тело цикла, затем к переменной цикла прибавляется значение шага, вновь проверяется условие и т.д. д) Если при очередной проверке условие оказывается истинным, цикл завершается. При этом переменная цикла получает пустое значение. Эта форма цикла позволяет наиболее естественным образом решить задачу предыдущих примеров: # ДЛЯ Х ОТ 1 ДО 5 :: > ?Х,2**Х > ВСЕ; 1 2 2 4 3 8 4 16 5 32 4) Цикл ДЛЯ-ИЗ предназначен для поэлементной обработки текстов, кортежей и множеств. При выполнении этого предписания переменная цикла поочередно принимает значения всех элементов кортежа или множества (каждой литеры текста). Для текстов и кортежей порядок перебора определен от первого элемента к последнему. Элементы множества перебираются в произвольном порядке. После завершения цикла переменная принимает пустое значение. Значение выражения, указанного в заголовке (перебираемая структура), вычисляется один раз в начале работы цикла. Пример - подсчет числа букв "А" в тексте с именем КНИГА: 0->СЧ; ДЛЯ БУКВА ИЗ КНИГА :: ЕСЛИ БУКВА="А" ТО СЧ+1->СЧ ВСЕ ВСЕ; ?"В ТЕКСТЕ КНИГА",СЧ," БУКВ 'А'"; Замечание. Имя, используемое в качестве переменной в цикле ДЛЯ (в обеих формах), при входе в цикл не должно иметь полной или системной защиты, иначе присваивание ему будет евозможно. Цикл ДЛЯ-ИЗ позволяет перебрать все элементы структуры или текста, но не позволяет изменять эти элементы. Кроме того, он является единственным предусмотренным в РАПИРЕ средством перебора всех элементов множества. Если требуется перебрать все элементы кортежа или текста и попутно уметь изменять некоторые из них, следует использовать цикл ДЛЯ-ОТ и выборку, например: ДЛЯ Х ОТ 1 ДО #КОРТ :: ЕСЛИ КОРТ[Х]<0 ТО -КОРТ[Х] -> КОРТ[Х] ВСЕ ВСЕ; Во время исполнения циклов возможно зацикливание, т.е. невыполнение условия окончания цикла. Причиной этому чаще всего неверная организация цикла в программе. Наиболее типичные примеры: 1) ДЛЯ Х ОТ 1 ДО 1 + 1Е-11 ШАГ 1Е-12 :: ... ВСЕ; Хотя цикл должен выполниться всего одиннадцать раз, произойдет зацикливание, потому что 1.00000000000 + 0.000000000001 = 1.000000000001 ------------- и после отсекания двенадцати значащих цифр очередное значение переменной цикла окажется тем же, что и до приращения: Приращение переменной цикла фактически оказалось нулем. 2) Помня о погрешностях вычислений с дробными числами, не следует пользоваться сравнением дробных чисел на равенство в условиях окончания циклов: # 0->СЧ; # ПОКА СЧ/=1:: ?СЧ; СЧ+1/3->СЧ; ВСЕ; 0.0 0.333333333333 0.666666666666 0.999999999999 1.33333333333 . . . 3) 1->Х; ПОКА Х<=30 :: ?Х,Х**2 ВСЕ; Условие цикла всегда будет истинным, потому что в цикле Х не получает приращения. Необходимо следить и за тем, чтобы условие окончания цикла рано или поздно выполнялось. Например, следующая программа тоже зациклится: 1->Х; ПОКА Х/=0 :: -Х->Х ВСЕ; 4) Цикл ДЛЯ-ИЗ зациклиться не может, т.к. перебираемая структура имеет конечную мощность. 5) Цикл ПОВТОР зациклиться не может, потому что число проходов - тоже конечное число. Оно, однако, может оказаться слишком большим, что фактически равносильно зацикливанию. Чтобы прервать исполнение программы, например, при зацикливании, надо нажать функциональную клавишу F1. При этом на экран выдается сообщение "СТОП", цикл принудительно завершается (переменная цикла ДЛЯ сохраняет свое последнее значение), после чего происходит выход в режим приостанова (если остановлена процедура или функция). 5.3.9. Вывод Предписание ВЫВОД в РАПИРЕ осуществляет посимвольный вывод объектов экран телемонитора, бумагу и другие устройства (д28). В 5.1.1 была описана простейшая форма вывода: ? список элементов вывода ; что является сокращенной записью для ВЫВОД: список элементов вывода ; В списке элементов перечисляются выводимые объекты с указанием формата вывода. Во всех предыдущих примерах этот список состоял из выражений, разделенных запятыми. Каждый объект в списке вывода представляется в виде последовательности символов, которая и выдается на указанное или взятое по умолчанию устройство. Объекты, входящие в список вывода, выдаются на одной строке вплотную друг к другу. Переход на следующую строку выполняется только в том случае, если выводимые данные не поместились на одной строке, и после вывода всего списка. Если в заголовке предписания указано слово БПС, заключительный перевод строки также не выполняется. Вывод пустого списка равнозначен переводу строки. Примеры: # ВЫВОД БПС:"СТРОКА НЕ "; ВЫВОД:"ПЕРЕВОДИТСЯ"; СТРОКА НЕ ПЕРЕВОДИТСЯ # ВЫВОД:; ?; (* ДВА СПОСОБА ПЕРЕВЕСТИ СТРОКУ *) # ВЫВОД:3," ОБЪЕКТА ","ПОДРЯД"; 3 ОБЪЕКТА ПОДРЯД При использовании пустого списка для перевода строки следует в конце ставить точку с запятой. В примере: ЕСЛИ ДЛИНА>79 ТО ВЫВОД:; ВСЕ; ее отсутствие приведет к ошибке: будет сделана попытка вывода значения имени ВСЕ. В заголовке предписания можно указать устройство, на которое следует выдать перечисленные объекты (см. диаграмму), например: ВЫВОД НА БУМАГУ:"2 х 2 =",2*2; ВЫВОД НА ЭКРАН БПС:"ВВЕДИТЕ СТРОКУ"; Особенности вывода в файл рассматриваются 5.7.4. Более мощный аппарат средств управления выводом рассматривается в 5.8. 5.3.10. Форматы вывода различных объектов 1) По умолчанию любой объект выводится в естественном формате. Для этого его нужно просто указать в списке вывода, как это делалось во всех предыдущих примерах. Правила представления объектов в естественном формате таковы. а) Тексты выводятся в виде цепочки символов без кавычек. Число занимаемых текстом позиций (длина поля вывода) равна его длине минус число управляющих символов в тексте, которые сами не выводятся, а осуществляют функциональную нагрузку (см. Приложение 2). Внутренние кавычки текста не дублируются. Примеры: # ВЫВОД: "ЗНАКИ "" НЕ"," ДУБЛИРУЮТСЯ"; ЗНАКИ " НЕ ДУБЛИРУЮТСЯ б) Целые числа выводятся как последовательность цифр с одним пробелом впереди (чтобы отделить число от других, возможно стоящих рядом, чисел). Перед отрицательным числом выводится знак "-". Пример: # ВЫВОД: 2**10,7,-456789; 1024 7 -456789 в) Дробные числа из диапазона [0.1 ; 1.0Е13[ (по модулю) выдаются в форме с фиксированной точкой, например: 75.8736 -12712.0 0.0 Дробные числа, порядок которых отрицателен или больше 12, выдаются в нормализованной экспоненциальной форме, т.е. в виде мантиссы, лежащей в диапазоне [0.1;1.0[, и десятичного порядка, например: 0.2453634Е-01 -0.9227Е126 Незначащие нули в обоих случаях подавляются, если они не примыкают непосредственно к точке. Перед числом выводится один пробел. г) Кортежи, множества и записи выводятся, соответственно, скобках < > , <* *> , <$ $> ; их элементы разделяются запятыми. Внутри составных объектов числа изображаются без предшествующих пробелов, а тексты в кавычках, причем каждая внутренняя кавычка дублируется. В записях, кроме того выдаются имена полей. Пример: <$НАЗВАНИЕ:"""ЖИГУЛИ""",РАЗМЕРЫ:<145,234,89>$> Таким образом, изображение чисел и составных объектов выводе соответствует их записи в языке. д) При попытке вывода объектов, не имеющих символьного представления (пустых значений, процедур, функций, файлов) выдаются названия этих объектов, окаймленные точками, например: .ПУСТО. , .ПРОЦЕДУРА. , .ФАЙЛ. 2) После каждого выражения в списке вывода может через двоеточие следовать формат (д30), например: ВЫВОД: А:10, В:15, С:20:А-3 ; Формат определяет еще два способа вывода данных. Если в формате указано одно выражение, то оно определяет число позиций, отведенное для изображения объекта. Этот формат вывода называется позиционным. В позиционном формате выводятся только тексты и числа. Значением форматного выражения должно быть целое число от 0 до 255. Правила вывода в позиционном формате таковы. а) Объект представляется в естественном формате, определяется длина такого представления. б) Если формат нулевой, происходит вывод в естественном формате. в) Если формат больше длины объекта, то - тексты дополняются пробелами справа, - числа дополняются пробелами слева. г) Если формат меньше длины объекта, то - тексты обрезаются справа до требуемой длины, - дробные числа сокращаются за счет младших разрядов дробной части (если это невозможно - выводятся в естественном формате), - целые числа выводятся в естественном формате. Пример: Формат! Целое ! Дробное ! Дробное ! Текст -------------------------------------------------- 4 ! 12345* !12.3* ! 0.1234Е12!ШКОЛ* 5 !12345* !12.34* ! 0.1234Е12!ШКОЛЬ* 6 ! 12345* !12.345* !0.1Е12* !ШКОЛЬН* 7 ! 12345* ! 12.345* !0.12Е12* !ШКОЛЬНИ* 8 ! 12345* ! 12.345* !0.123Е12* !ШКОЛЬНИК* 9 ! 12345 ! 12.345*!0.1234Е12*!ШКОЛЬНИК * 10 ! 12345! 12.345! 0.1234Е12!ШКОЛЬНИК * Здесь звездочкой показан конец поля вывода. Позиционный формат позволяет организовывать таблицы, в которых поле под каждое число или текст строго фиксировано. При выводе целых чисел в колонку по одному и тому же формату соответствующие разряды чисел оказываются друг под другом. Полезная возможность: если требуется выдать переменное число пробелов, можно выдать по соответствующему формату пустой текст. 3) Соблюдения разрядности при выдаче таблиц можно добиться и для дробных чисел с помощью фиксирующего формата. Он задается указанием в списке вывода двух форматных выражений (через двоеточие после выводимого объекта). Оба формата также должны быть целыми числами от 0 до 255. Первый формат снова обозначает общую длину поля вывода, второй указывает номер позиции этого поля, в которой должна стоять точка. При форматировании числа его естественное представление "накладывается" на поле вывода так, чтобы точка оказалась в требуемой позиции. Если остались незанятые позиции, они заполняются пробелами. Если дробная часть не помещается в отведенную ей часть поля, она обрезается за счет младших цифр, пока это возможно. В других случаях число выдается в естественном формате (например, если слишком велика целая часть). Если второй формат равен нулю, число выводится в позиционном формате. Пример: (пусть ТАБ - кортеж, состоящий из 7 дробных чисел) # ДЛЯ Х ИЗ ТАБ :: ВЫВОД:Х:12:4,"*" ВСЕ; 0.12345Е34* -12.5756 * -0.8Е124 * 823.2 * 12718.28* /здесь произошло нарушение формата/ 0.1003Е-12* 0.0 * Другие объекты в фиксирующем формате не выводятся (будет выдано сообщение об ошибке). Замечание. Указывать форматные выражения для элементов выводимых составных объектов нельзя. Поэтому числа и тексты в их составе выводятся только в естественном формате. 5.3.11. Ввод текстов и данных с клавиатуры Основным средством организации диалога из программы является предписание ВВОД (д31). Простейшая форма ввода: ВВОД ТЕКСТОВ: список уточненных имен ; Слово ТЕКСТОВ можно опустить. Уточненные (в том числе и простые) имена в списке разделяются запятыми. Выполняя это предписание, система выдает на экране приглашение "?" и переходит в режим ввода. Введенная строка преобразуется в объект вида "текст" и присваивается очередному имени (или части значения имени) из списка ввода. Затем выдается новое приглашение и т.д., до тех пор, пока список ввода не исчерпан. После этого исполнение программы продолжается. Во время ввода можно пользоваться всеми управляющими клавишами клавиатуры, как и во время набора предписания. В частности, можно исправлять ошибки в строке до ввода ее в машину. Текст, вводимый в режиме ввода текстов, не нуждается в обрамляющих кавычках и в дублировании внутренних кавычек. Пример: # ВВОД ТЕКСТОВ: А,В,С[2]; ВЫВОД: А,В,С[2]; ?ПРИМЕР ТЕКСТА ? /введется пустой текст/ ?"НУ,ПОГОДИ!" ПРИМЕР ТЕКСТА"НУ,ПОГОДИ!" В этом примере С может быть либо кортежем, не менее чем из двух элементов, либо текстом, но тогда допустим ввод только одной литеры, чтобы правильно сработало присваивание. Вводимый текст не может быть длиннее 255 литер. Следующая форма предписания ввода: ВВОД ДАННЫХ: список уточненных имен ; позволяет вводить числа, тексты, множества и кортежи, состоящие из элементов тех же видов. В качестве приглашения к вводу выдается тот же знак "?". По мере ввода объекты присваиваются уточненным именам из списка ввода в порядке их записи (со всеми сопутствующими проверками защиты имен и размерности). Объекты при вводе записываются по тем же правилам, что и в программе: - тексты - в кавычках (внутренние кавычки дублируются); - кортежи и множества - в своих скобках; элементы записываются через запятую по тем же правилам; - все правила записи лексем, пробелов и переводов строки сохраняются. Разделять объекты можно запятыми, пробелами и переводами строки. При переводе строки новое приглашение выдается в случаях: - если запись посленего объекта в предыдущей строке еще не закончена; - если введено меньше объектов, чем предусмотрено списком ввода. Если во вводимой строке указано больше объектов, чем требуется, лишние игнорируются. При ошибке в записи объекта выдается сообщение "ОШИБКА: ПОВТОРИТЕ ВВОД" и указывается место, начиная с которого надо продолжить ввод. Пример: # ВВОД ДАННЫХ:А,Б,В,Г; ? "ТЕКСТ" , <1,2Ъ3,4> "ТЕКСТ" , <1,2 ОШИБКА: ПОВТОРИТЕ ВВОД ? ,3,4> -12.1213Е45 ? (*ВВОДИМ ПОСЛЕДНИЙ ОБЪЕКТ*) 0 Будут введены объекты: текст "ТЕКСТ", кортеж <1,2,3,4>, числа -12.1213Е45 и 0. Примечание. В примере выше после выдачи сообщения об ошибке при вводе кортежа, ввод продолжен с запятой. Можно считать, что ошибочная лексема во вводимой строке равнозначна переводу строки. Дополнительные сведения: 1) Чтобы отказаться от ввода текстов или данных и прервать исполнение программы (например, если предыдущие данные были введены неправильно), следует вместо очередной строки или лексемы вставить во вводимую строку символ останова "F1" и перевести строку. Это будет воспринято, как ошибка, и выполнение программы прервется. 2) При вводе числа можно указать перед ним знак "-" (формально, он является самостоятельной лексемой и обозначает унарную операцию). 3) Системное приглашение ко вводу "?" можно заменить любым другим символом, используя стандартную процедуру "ПРИГЛ" (Приложение 3). 5.4. Подготовка и хранение программ 5.4.1. Подготовка рабочих дисков В ходе дальнейшего знакомства с системой "ШКОЛЬНИЦА" и в последующем при разработке и отладке программ потребуется рабочий диск для хранения этих программ, их исходных, рабочих и выходных данных. Рабочий диск представляет собой библиотеку программ (файлов). Для образования пустой библиотеки на диске его необходимо разметить. ВНИМАНИЕ! При разметке диска вся находящаяся на нем информация безвозвратно стирается. Порядок разметки дисков: 1) Находясь в рапира-интерпретаторе, Вставьте в дисковод диск Ш1 и введите предписание: ЗАПУСК ФОРМАТ; 2) После загрузки программы на экране появятся надписи: РАЗМЕТКА РАБОЧИХ ДИСКОВ ОПРЕДЕЛЕНИЕ СКОРОСТИ ДИСКОВОДА ВСТАВЬТЕ ДИСК ДЛЯ РАЗМЕТКИ И НАЖМИТЕ ЛЮБУЮ КЛАВИШУ Вставьте в дисковод тот диск, который будет использоваться в качестве рабочего. Диск должен иметь прорезь справа, разрешающую запись на него. 3) Определение скорости вращения диска проводится с целью предупредить возможную порчу информации на нем вследствие разметки неотрегулированным дисководом. В случае получения сообщения НЕДОПУСТИМАЯ СКОРОСТЬ ДИСКОВОДА РАЗМЕТКА НЕЖЕЛАТЕЛЬНА следует отрегулировать дисковод с помощью программы ДИСКОР (Приложение 4). 4) Далее в ответ на запрос НАБЕРИТЕ ЗАГОЛОВОК БИБЛИОТЕКИ: введите произвольный текст, который будет выдаваться каждый раз при выдаче каталога этого диска. Позиция последнего воспринимаемого символа заголовка отмечается на экране красной звездочкой. 5) Убедившись, что все правильно, нажмите любую клавишу, и разметка начнется. Ход разметки сопровождается сообщением о текущем размечаемом треке диска (от 0 до 34). 6) Если разметка по какой-либо причине не прошла (испорчен диск или неисправен дисковод), выдается сообщение ОШИБКА ОБМЕНА и разметка прекращается. 7) По окончании разметки выдается запрос ХОТИТЕ РАЗМЕЧАТЬ ДРУГИЕ ДИСКИ (Д/Н) ? При ответе "Д" весь описанный процесс повторяется заново, но определение скорости дисковода больше не проводится. Рабочий диск отличается от системного диска Ш1 тем, что почти все пространство на нем отведено для хранения программ и данных пользователя. Если при включении машины в дисководе находится рабочий диск, на экран выдается сообщение: ЗАПУСК С ЭТОГО ДИСКА НЕВОЗМОЖЕН! ВСТАВЬТЕ СИСТЕМНЫЙ ДИСК И НАЖМИТЕ КЛАВИШУ "СБРОС" (для того, чтобы произвести запуск системы "ШКОЛЬНИЦА"). Рабочие диски "ШКОЛЬНИЦЫ" полностью совместимы со стандартными дисками, инициализированными штатной дисковой операционной системой DОS 3.3 ЭВМ "Агат", поэтому их тоже можно использовать как рабочие. 5.4.2. Редактирование программных текстов Для хранения и редактирования программ в языке и системеое требуется частое обращение к внешней памяти. Поэтому, Далее везде будет предполагаться, что в дисководе находится рабочий диск. Самый простой способ сохранить программу на рабочем диске и облегчить обращение к ней - оформить ее в виде описания процедуры, например: ПРОЦ ПРИМЕР; текст программы КНЦ; Работа с описаниями процедур ведется в режиме экранного редактирования (с помощью текстового Редактора). Вход в него осуществляется по директиве ПРОЦ с указанием имени редактируемой программы, например: # ПРОЦ ПРИМЕР; Если на диске есть программа (файл) с таким именем, ее текст считывается в память. В противном случае в память заносится заголовок новой процедуры. Затем на экране появляется начальный участок программы, и можно приступать к редактированию. В Редакторе, в отличие от диалоговых режимов, набираемый текст не анализируется, а только запоминается в ОЗУ. Сущность экранного редактирования заключается в следующем: - Работа в Редакторе напоминает работу с рулоном бумаги, на котором пишется программа. Редактируемый текст разбит на строки, которые нумеруются справа. Но поскольку ширина рулона (экрана) ограничена, длинные строки можно переносить на новую строчку экрана без дополнительной нумерации. Этот перенос весьма условен и не нарушает целостности строки. Длина строки не ограничена. - Экран представляет собой окно, через которое виден некоторый участок текста. Окно может смещаться по "бумаге" вверх и вниз. - Роль пера играет курсор, указывающий на текущий редактируемый символ. - Смещения курсора, окна и другое редактирование осуществляются с функциональной панели клавиатуры. Изображение текста: 1) Текст может изображаться в двух режимах: а) уплотненном черно-белом (64х32), б) цветном (32х32). Переключение режимов - клавиша F2. 2) Первые пять позиций каждой строчки отведены под номер строки. 3) В режиме (б) зеленым цветом изображаются цифры, спецзнаки и заглавные буквы, голубым - строчные (хотя с клавиатуры они не вводятся), инверсным желтым - входящие в текст управляющие символы. В режиме (а) строчные и заглавные буквы не различаются, управляющие символы выдаются знаком "?". 4) В режиме (а) курсор имеет вид мигающего подчерка, в режиме (б) - белого квадрата. Управление редактированием (цифры обозначают клавиши функциональной части клавиатуры): - Движением курсора по тексту управляют четыре клавиши со стрелками. При попытке выхода за границы окна вверх или вниз оно сдвигается так, чтобы показать требуемую часть текста. При невозможности сдвига подается звуковой сигнал. Если курсор выходит за границы текста (например, выход за конец строки), то в режиме (б) его цвет меняется на фиолетовый, а в режиме (а) сам курсор меняется на "^". - Чтобы заменить текущий символ, надо просто нажать любой другой. При этом курсор сдвигается к следующей позиции. - Уничтожение текущего символа - 1. При этом следующая за ним часть строки сдвигается влево, заполняя пустое место. - Вставка нескольких символов - 2 . После этого все набираемые символы вставляются между текущим и предыдущим символами. Текст сдвигается вправо, освобождая место для вставки. Чтобы закончить вставку, следует нажать любую клавишу смещения курсора. - Переход к началу следующей строки текста - 3. - Переход к предыдущей и следующей страницам текста (участкам текста, помещающимся в окне) - 4 и 5 , соответственно. С их помощью можно быстро просмотреть весь редактируемый текст. - Центрирование - 6 : окно сдвигается так, чтобы текущая строчка оказалась на середине экрана (если это возможно). Так можно посмотреть ближайшие окрестности редактируемой строки. - "Склеивание" текущей строки текста со следующей - 7. При этом на месте склейки вставляется пробел. - Отсекание части строки текста, расположенная справа от курсора, включительно - 8. Курсор при этом остается на месте. - Уничтожение текущей строки целиком - 9. Курсор при этом оказывается на следующей строке, а если ее нет - на предыдущей. - Чтобы вставить в текст один управляющий символ, надо нажать УПР-V, а затем соответствующую ему клавишу. В частности, вставка символа перевода строки позволяет разбить строку текста на две части и вставить строку перед самой первой. - Образование новой строки после текущей - клавиша перевода строки. При этом в ее начало автоматически вставляется столько пробелов, сколько их было в начале предыдущей строки. Это облегчает набор программы "лесенкой". Кроме режима экранного редактирования Редактор имеет меню. Переключаться между ними позволяет клавиша РЕД. В режиме меню на экране перечислены названия некоторых дополнительных действий (директив). Двигаясь по меню при помощи клавиш-стрелок, можно выбрать одну из предложенных директив (она выделяется на экране инверсом) и исполнить ее, нажав клавишу перевода строки. При исполнении директив возможны некоторые дополнительные запросы. Набрав запрошенное число или текст, следует перевести строку. Пустая посылка (т.е. просто нажатие клавиши перевода строки) обозначает выбор по умолчанию (если это номер строки, то он указывается в скобках при запросе). Например: НОМЕР СТРОКИ (43) - Любой запрос можно прервать нажатием F1. Это означает отказ от выполнения директивы. По директиве ПЕРЕЙТИ К СТРОКЕ курсор устанавливается на начало указанной строки. По директиве ЗАПОМНИТЬ ТЕКСТ запрашивается и запоминается произвольная цепочка символов. Если потом, находясь в режиме редактирования, нажать F3 , будет выполнен поиск первого после текущего символа вхождения этой цепочки в редактируемый текст. Если такое вхождение не обнаружено, курсор устанавливается в конец текста. Этот прием позволяет найти все вхождения некоторой последовательности символов (например, для замены). Символ УПР-А в цепочке означает, что во время поиска в данной позиции может встретиться произвольный символ. Директива ВЫДАТЬ НА БУМАГУ позволяет выдать участок текста на бумагу. Он определяется номерами первой и последней строк. Директива ОЧИСТИТЬ БУФЕР уничтожает весь находящийся в памяти Редактора текст. Директива ВЫЙТИ позволяет вернуться в основной диалоговый режим без анализа редактируемого текста. По директиве КОНЕЦ ОПИСАНИЯ редактируемый текст анализируется интерпретатором РАПИРЫ как описание процедуры или функции (5.5.2). Если синтаксических ошибок не обнаружено, происходит выход в основной диалоговый режим. В противном случае, система возвращается в режим редактирования, причем на нижней строке появляется сообщение об ошибке, а курсор устанавливается на начало ошибочной лексемы. Директивы в правом столбике меню позволяют организовать из Редактора работу с ДЗУ : запомнить редактируемый текст на диск под некоторым именем (т.е. образовать на диске файл с этим именем, содержащий данный текст), считать с диска файл, уничтожить файл на диске, дописать в конец текущего текста содержимое некоторого файла, просмотреть каталог всех файлов, переключиться с одного ДЗУ на другое. В меню указывается также имя текущего файла, с которым идет работа в настоящий момент. Если на запрос имени файла во всех директивах кроме СТЕРЕТЬ дать пустую посылку, указанное действие будет произведено над текущим файлом. Это имя заносится при входе в Редактор, загрузке и запоминании файла. В Редакторе предусмотрена специаьная обработка ошибок чтения с диска: если какой-то участок текста не считывается, на его место в буфере записывается несколько голубых вопросительных знаков, после чего считывание продолжается. 5.4.3. Порядок запуска программ Общее правило оформления программы, предназначенной для записи на диск и последующего исполнения (возможно неоднократного): 1) Набрать директиву описания: ПРОЦ имя ; где имя - это название программы (оно должно быть именем по правилам языка). 2) После входа в Редактор набрать текст программы (первой строкой должен быть тот же текст "ПРОЦ имя ;"). 3) В конце программы набрать КНЦ; 4) Выйти из Редактора по директиве КОНЕЦ ОПИСАНИЯ, на запрос системы имя : ЗАПОМИНАТЬ (Д/Н)? ответить "Д". При этом текст программы запишется на диск под указанным именем (оно совпадает с тем, которое было указано после слова ПРОЦ). Чтобы выполнить запомненную на диске программу, надо набрать: ЗАПУСК имя ; Для вызова только что отредактированной процедуры достаточно набрать имя (); Если при исполнении программы выдано сообщение об ошибке, или оказалось, что она работает неверно, можно вернуться в режим редактирования и исправить программу так, как требуется. Это делается так же, как и первоначальное описание: ПРОЦ имя ; и т.д. После окончания редактирования процедуры текст ее описания остается в ОЗУ. При повторном входе в ту же процедуру поиск на диске не проводится. 5.4.4. Просмотр каталога диска Посмотреть, какие программы запомнены на рабочем диске, всегда можно с помощью предписания КАТАЛОГ ФАЙЛОВ; или просто КАТАЛОГ; При этом выдается следующая информация: - заголовок библиотеки (который был задан при начальной разметке диска), - список всех файлов на диске с указанием их длины и типа, - число свободной памяти на диске. Тип файла определяет способ доступа к нему и средства обработки: Т - текстовые файлы, К - кодовые (двоичные) файлы "Школьницы", А - ВАSIС-файлы, В - двоичные файлы DОS 3.3. Длина файла и свободная память измеряются в блоках по 256 символов. Всего на рабочем диске в распоряжении пользователя находится 528 блоков (на рабочем диске, инициализированном DОS 3.3, доступны только 496 блоков). В каталоге выдается лишь длина запомненной в файле информации. Кроме нее один блок занимают системные сведения о файле. Каталог выдается порциями. За раз выдается столько строк, сколько помещается на экран, после чего выдача приостанавливается, чтобы дать возможность просмотреть выданную информацию. Для продолжения выдачи надо нажать любую клавишу. Клавиша останова F1 прерывает выдачу каталога. 5.5. Процедуры и функции 5.5.1. Основные черты процедурного блока В этом разделе более подробно рассматривается аппарат процедур. Далее для краткости речь будет идти только о процедурах, а при необходимости оговариваться особенности функций. Процедура - это обособленная часть программы (последовательность предписаний), имеющая собственное имя. Основное действие над процедурой - ее вызов - позволяет выполнить эти предписания. Функция, кроме того, в конце работы выдает в качестве результата объект произвольного вида. 1) Процедура является единицей структурирования программы. В отдельные процедуры удобно выделять логически независимые части программы, вспомогательные алгоритмы, часто повторяющиеся участки программ. 2) Процедура является единицей хранения программного текста. Это поддерживается средствами редактирования и трансляции процедур в системе (5.4). 3) Процедура является единицей локализации имен (5.5.4,5.5.5). В отличие от других языков программирования, сОСТАВные предписания в РАПИРЕ (условия, циклы) свойством локализации не обладают. Процедура в РАПИРЕ имеет два представления: 1) Описание процедуры - текст программы задающей работу этой процедуры, записанный по синтаксическим правилам языка (д38,39). Описания процедур хранятся в ДЗУ в текстовых файлах, и обрабатываются с помощью Редактора. 2) Объект "процедура" ("функция") в программной среде, обрабатываемый наравне с прочими объектами в других программах. Процедура-объект образуется в результате трансляции ее описания и в дальнейшем от исходного текста не зависит. 5.5.2. Порядок описания и редактирования процедур Порядок описания простейших процедур с помощью Редактора уже был описан в 5.4.2. Ниже приводится ряд дополнительных особенностей и даются необходимые пояснения. 1) В тело процедуры могут входить любые универсальные предписания (д3). Запрещено использование системных директив, а также других процедурных блоков. Поэтому, вложенные описания процедур в РАПИРЕ недопустимы. Это, однако, не означает, что из одной процедуры нельзя вызвать другую. 2) Для описания функций служит директива ФУНК, аналогичная ПРОЦ. Для входа в режим редактирования можно использовать и ее. 3) Конструкция РЕЗ: выражение ; в описании функции служит для возврата результата функции. 4) При выходе из Редактора транслируемый текст может состоять только из описаний процедур и функций (возможно, разделенных комментариями). Любая другая информация, а также одиночные предписания при трансляции будут рассматриваться как ошибка. 5) Директива КОНЕЦ ОПИСАНИЯ в Редакторе (выход с трансляцией) означает конец описания процедурного блока. По ней проводится синтаксический анализ текста; если были замечены ошибки, выдается сообщение об ошибке, и происходит возврат в режим редактирования. Если текст синтаксически правилен, происходит создание объектов вида "процедура" ("функция") в соответствии с приведенными описаниями. Каждый объект присваивается имени, указанному в заголовке его описания. Например, при трансляции описания ФУНК МНОГОЧЛЕН; РЕЗ:Х**2+10*Х-8; КНЦ; значением имени МНОГОЧЛЕН станет функция, считающая значение конкретного полинома от числа Х. 6) После завершения трансляции выдается запрос "имя : ЗАПОМИНАТЬ (Д/Н)?". Следует ответить, нужно ли запоминать на диск отредактированный текст. Если текст не редактировался или был запомнен еще в Редакторе, данный запрос не выдается. 7) Если описание процедуры уже хранится в ДЗУ, то оттранслировать его можно тремя способами: - сделать "фиктивное" редактирование, т.е. войти в режим редактирования процедуры по директиве ПРОЦ и, не внося изменений, выйти с трансляцией; - воспользоваться предписанием ВВОД ИЗ ДЗУ (д31); - воспользоваться предписанием ЗАПУСК (д33); при этом сразу после трансляции произойдет вызов процедуры (она должна быть без параметров). Второй способ удобен тем, что предписание ввода из ДЗУ можно использовать в другой процедуре, организуя тем самым автоматическую загрузку всех необходимых процедур. Если процедур в программе немного) имеет смысл поместить их все в один файл. 5.5.3. Процедуры, как объекты языка Как и другие объекты, процедуры могут участвовать в предписаниях вывода, присваивания, операциях формирования и сравнения на равенство. Но основным действием над ними является вызов. Вызов процедуры в программе или другой процедуре означает временное прекращение исполнения последней и начало исполнения вызываемой процедуры. После ее завершения остановленная процедура продолжает работу. Более полное описание вызова приводится в 5.5.6. Синтаксис вызова одинаков для процедур и функций: выражение ( список параметров ) Выражение обозначает процедуру-объект. Как правило, здесь указывается ее имя, хотя допустимы и другие формы доступа. Список параметров может отсутствовать, но скобки, означающие вызов, обязательны. Вызов процедуры является предписанием, а вызов функции - операцией, поскольку возвращает результат. Поэтому вызов функции может встречаться в выражении. Примеры: РАКЕТА(); (* вызов процедуры *) <А,В,С>[I](); (* вызов одной из процедур А,В или С в зависимости от I *) Ф()()->Х; сначала вызовется функция Ф, затем - ее результат (он тоже должен быть функцией), и уже его результат присвоится имени Х. 5.5.4. Блочная структура РАПИРЫ. Локализация имен Скрытие особенностей и независимость работы одной программы от другой достигаются обычно с помощью ограничения (локализации) области видимости имен (и их значений) в программной среде. Правила локализации имен в РАПИРЕ отличны от традиционных. Глобальной областью видимости является вся программная среда. Глобальные имена - это имена, известные в основном диалоговом режиме. Они выдаются по предписанию КАТАЛОГ ВСЕХ ИМЕН, исполненному в этом режиме, и ни в каком описании не нуждаются. Локальной областью видимости может быть только процедурный блок. Имена, описанные в заголовке процедуры, с помощью конструкции ИМЕНА: список имен через запятую ; известны системе только на время вызова данной процедуры в ней и во всех вызванных из нее процедурах. При вызове процедуры они получают пустые значения, при выходе из нее выработанные значения локальных имен пропадают. Имена, не описанные, но использованные в процедуре А, приравниваются к глобальным, хотя они могут быть локальны в другой процедуре Б, вызвавшей данную. Если одно из имен процедуры Б совпадает по написанию с локальным именем процедуры А то его значение в момент вызова становится недоступным на все время работы А. При выходе из процедуры доступ к старому значению восстанавливается. Таков принцип локализации имен по динамической цепочке вызовов. Значения глобальных имен в процедуре могут изменяться. Локальные имена в процедуре не должны совпадать с ее именем. Пусть описана процедура ПРОЦ СУММА; ИМЕНА:СУМ,СЧ; (* СЧ и СУМ - локальные имена *) 0->СУМ; (* НАЧ и КОН - глобальные *) ДЛЯ СЧ ОТ НАЧ ДО КОН :: СУМ+СЧ**2->СУМ; ВСЕ; ВЫВОД:"СУММА КВАДРАТОВ ЧИСЕЛ ОТ",НАЧ, " ДО",КОН," РАВНА",СУМ; КНЦ; Пример ее использования: # 1->НАЧ; 5->КОН; 28->СУМ; СУММА(); СУММА КВАДРАТОВ ЧИСЕЛ ОТ 1 ДО 5 РАВНА 55 # ВЫВОД:СЧ,СУМ; .ПУСТО. 28 Как видно из примера, локальное имя СУМ маскирует на время работы процедуры такое же глобальное имя. 5.5.5. Параметры процедур и функций. Способы передачи параметров. Рекурсия Параметром процедуры назывется ее локальная переменная, предназначенная для обмена данными между процедурой и вызвавшей ее программой. Формальные параметры процедуры указываются в скобках после имени процедуры (д41,42). При вызове процедуры в круглых скобках указывется список фактических параметров: конкретные объекты, передаваемые в процедуру, или имена, принимающие данные из нее. В примере из предыдущего параграфа была описана процедура СУММА, результат работы которой зависит от значений глобальных имен НАЧ и КОН в момент вызова. Чтобы явно задать зависимость процедуры СУММА от НАЧ и КОН, их следует сделать ее параметрами: ПРОЦ СУММА (НАЧ,КОН); и т.д. Вызов будет иметь вид: # СУММА(1,5); СУММА(-2,4); Использование параметра в процедуре определяется способом его передачи. В РАПИРЕ предусмотрены три способа передачи параметров. 1) Входные параметры служат для передачи объектов в процедуру. При вызове формальному параметру процедуры присваивается копия значения соответствующего ему фактического параметра. Далее он рассматривается как самостоятельное имя, ничем не связанное с фактическим параметром. В частности, если входным параметром передается имя, то изменение его значения в процедуре не влияет на значение формального параметра. Входные параметры имеют полную защиту. 2) Выходные параметры служат для передачи объектов из процедуры. При входе в нее они получают пустые значения, а при выходе выработанные значения присваиваются соответсвующим фактическим параметрам. Поэтому в скобках вызова на месте выходных параметров должны стоять уточненные имена, способные принять выдаваемое процедурой значение. Внутри процедуры эти имена имеют абсолютную защиту, и изменять их значения нельзя. 3) Возвратные параметры являются одновременно и входными и выходными: при входе значения фактических параметров присваиваются формальным, а при выходе - обратно. При вызове им также должны соответствовать уточненные имена. Внутри процедуры присваивания этим именам недопустимы. В функциях допускаются только входные параметры. Способ передачи параметра описывается следующим образом: - перед входным параметром можно указать стрелку "=>"; - после выходного параметра ставится стрелка "=>"; - перед возвратным параметром ставится стрелка "<=>". Если имя указано без стрелки, оно считается входным параметром. Пример: ПРОЦ ЗАМЕНА(<=>ТАБЛИЦА,ПОЛЕ,НОМЕР=>); (* эта процедура ищет элемент ПОЛЕ в кортеже ТАБЛИЦА и, если его нет, добавляет в конец. Параметром НОМЕР выдается номер этого элемента в таблице *) 1->НОМЕР; ПОКА ТАБЛИЦА[НОМЕР]/=ПОЛЕ :: НОМЕР+1->НОМЕР; ЕСЛИ НОМЕР>#ТАБЛИЦА ТО ТАБЛИЦА+<ПОЛЕ>->ТАБЛИЦА ВСЕ; ВСЕ; КНЦ; Параметр ПОЛЕ является входным: для поиска и добавления в процедуре нужен сам объект. Параметр НОМЕР - выходной: ему соответствует имя, которое примет выданное процедурой значение. Параметр ТАБЛИЦА - возвратный: обрабатываемый кортеж может использоваться в программе как до, так и после вызова процедуры. Существенное отличие возвратного параметра от глобального имени заключается в переименовании фактического параметра в формальный. Например, описанной выше процедурой можно обрабатывать разные таблицы со схожей структурой: #ЗАМЕНА(СИСТЕМА,<$ПЛАНЕТА:"ЗЕМЛЯ", РАССТОЯНИЕ:1.5Е8$>,ИНД1); #ЗАМЕНА(ХИМИЯ,<$ЭЛЕМЕНТ:"УГЛЕРОД",ВЕС:12.011$>,ИНД2); Процедуры в РАПИРЕ могут вызывать друг друга, если вызываемая процедура находится в области видимости исполняемой. При этом возникает новая локальная среда вызванной процедуры с соблюдением всех правил маскировки имен. Особый интерес представляет случай рекурсивного вызова, когда процедура вызывает сама себя. Рекурсия может быть прямой, если процедура вызывает сама себя непосредственно, или косвенной, когда процедура А вызывает процедуру В, а та, в свою очередь, снова вызывает А. Как и при организации циклов необходимо следить, чтобы рекурсивный вызов не был безусловным. В противном случае на достаточно глубоком уровне рекурсии произойдет исчерпание системного стека вызовов с остановом по ошибке ("ПЕРЕПОЛНЕН СТЕК"). Рекурсия представляет собой мощное средство программирования, с ее помощью программируется, например, вычисление по рекуррентным формулам: ФУНК ФАКТОРИАЛ(N); ИМЕНА:R; ЕСЛИ N=1 ТО 1->R ИНАЧЕ N*ФАКТОРИАЛ(N-1)->R ВСЕ; РЕЗ:R; КНЦ; 5.5.6. Порядок выполнения процедуры 1) Отыскивается процедурный объект, являющийся значением выражения в конструкции вызова; в нем закодирована последовательность выполняемых действий. 2) Вычисляются значения всех фактических параметров (в порядке записи). 3) Происходит передача параметров по описанным в 5.5.5 правилам. 4) Устанавливается полная защита на все входные формальные параметры. Уточненные имена, переданные выходными и возвратными параметрам, а также имя вызываемой процедуры получают абсолютную защиту. 5) Исполняются все предписания, образующие тело процедуры. 6) Для функции вычисляется значение результата - выражения, записанного после РЕЗ: . 7) Уточненным именам, соответствующим выходным или возвратным параметрам, присваиваются значения, выработанные в процедуре. При этом ведется конроль защиты и границ вырезки. Значения локальных имен и входных параметров уничтожаются. 8) Результат функции возвращается в качестве значения выражения (операции вызова). 5.5.7. Ограничение побочных эффектов в РАПИРЕ Концепция автономного процедурного блока предполагает, что процедура своими действиями может влиять только на свою локальную среду, а воздействие ее на глобальную среду может осуществляться только посредством параметров. Неоправданное использование в процедуре глобальных имен может привести к пересечению ее с вызвавшей подпрограммой, к нежелательному побочному эффекту. Пример: ДЛЯ Х ОТ 1 ДО 11:: ?А[Ф(Х)]; (* функция Ф изменяет Х, А *) ЕСЛИ Х**2>40 ТО 11->Х ВСЕ; ВСЕ; Здесь предпринимаются две попытки изменить нормальный ход выполнения предписания: досрочный выход из цикла присваиванием Х конечного значения и изменение Х в функции Ф. Непредсказуемо и значение выражения А[Ф(Х)] , если Ф меняет значение имени А. В РАПИРЕ принят ряд правил, позволяющих ограничить возникновение побочных эффектов в ситуациях, провоцирующих на труднонаходимые ошибки. Основным принципом является предсказуемость исполнения предписания по его записи. Так, в примере выше заголовок цикла определяет все значения, принимаемые переменной цикла во время его работы. Любое воздействие на нее с целью нарушить этот порядок считается недопустимым. Для ограничения побочных эффектов в описываемых реализациях языка используются два приема. Разыменование (определение значения) выражения позволяет сделать исполнение составного предписания независимым от возможного изменения в его теле переменных, участвующих в этом выражении. Примеры: # 5->А; # ПОВТОР А РАЗ :: А+1->А; ВСЕ; # ?А; 10 Число проходов цикла вычислится один раз в начале его работы. Изменение переменной А внутри цикла не влияет на уже определенное число проходов. # ДЛЯ А ОТ 1 ДО В+2 ШАГ С :: > А+В->В; С-А->С ВСЕ; Конечное значение и шаг вычислятся один раз в начале работы цикла и от значений, принимаемых именами В и С в цикле не будут зависеть. Кроме описанных случаев разыменуется параметр предписания выбора по значению (5.3.7). Здесь неясность возникает, если в составе одного из альтернативных выражений вызывается функция, меняющая значение этого параметра. Абсолютная защита имен устанавливается, когда невозможно или невыгодно разыменование: - на переменные циклов ДЛЯ (обе формы), - на перебираемый объект в цикле ДЛЯ-ИЗ (для разыменования большого кортежа может не хватить памяти), - на имя текста и кортежа во время вычисления индексов в вырезке и выборке, - на имя процедуры или функции во время вызова. Общее правило: защита устанавливается на имена, участвующие в операциях, пока вычисляются другие операнды. Например, в выражении А+Ф() функция Ф не может менять значения А (т.к. оно уже считается вычисленным), а в выражении Ф()+А - может, т.к. значение А к моменту вызова Ф еще не вычислено (см. порядок вычисления выражений). Когда все операнды вычислены, и операция или предписание исполнены, восстанавливается тот уровень защиты имени, который оно имело изначально. 5.6. Отладка программ. Отладочные средства РАПИРЫ 5.6.1. РАПИРА-интерпретатор, как система программирования Помимо алгоритмического языка, на котором пишутся программы обработки данных предполагается наличие на машине системы программирования. Она включает в себя набор вспомогательных средств для подготовки, хранения, редактирования и отладки программ. Управление системой ведется с помощью специализированного языка команд или директив. В "Школьнице" такой системой является РАПИРА-интерпретатор, обслуживающий программирование на РАПИРЕ. Операционная обстановка, в которой работает пользователь, отождествлена с программной средой, в которой функционируют его программы, и действия их ничем принципиально не отличаются. Носителями информации являются объекты языка. Обработка данных и управление системой осуществляется с помощью языковых средств, что расширяет как возможности управления системой из программы, так и мощность системы. Пользователь может вмешиваться в ход исполнения программ, контролировать и корректировать его при необходимости. Средства подготовки, хранения, редактирования и запуска программ описаны в предыдущих разделах. К средствам отладки относятся: - режимы приостанова процедур и пошаговое исполнение программ (3.4, 5.6.2), - защита имен по записи (5.2.2, 5.5.7), - след вызовов процедур и функций (5.6.3). - прокрутка имен (5.6.3). - организация контрольных точек (предписание "контроль", 5.3.7). - отладочный вывод пользователя. 5.6.2. Управление системой. Приостанов программы. Директивы режимов останова Различаются две формы управления системой. 1) Прямое, в режиме диалога, когда пользователю доступна вся программная среда. Вводя предписания с клавиатуры, он может вычислять произвольные выражения, смотреть каталоги имен и файлов, смотреть и изменять значения имен, редактировать программы и запускать их на исполнение. 2) Программное, когда последовательность управляющих действий задается работающей в данный момент программой. Ограниченное участие пользователя возможно в те моменты, когда программой предусмотрен диалог с ним (например, ввод данных). Возврат к прямому управлению происходит, когда вся программа проработает. Система позволяет приостановить работающую программу и временно перейти в режим приостанова с возможностью прямого управления. Переход в режим приостанова происходит в двух случаях: - по исполнению в процедуре предписания СТОП; - по нажатию клавиши останова F1 . В информационной строке экрана появляется слово >> П А У З А << и выдается сообщение о том, в какой строке какой процедуры сработал приостанов, например: ОСТАНОВ В СТРОКЕ 15 "РАКЕТА" Состояние программной среды при этом сохраняется, и пользователь может узнать значения всех имен в момент приостанова, в т.ч. значения локальных имен и параметров остановленной процедуры, которые недоступны вне нее. Можно также "вручную" изменить значения некоторых имен, в том числе - локальных и параметров. Примечание. Часть имен в момент приостанова может иметь системную защиту, а изменение значений имен должно обеспечивать возможность продолжения программы. В режиме приостанова работают три специфические директивы. 1) По директиве ПУСК; происходит выход из режима приостанова и запуск приостановленной программы, начиная с того места, где произошел приостанов. Дальнейшее ее выполнение ведется с учетом изменений, внесенных в режиме приостанова. 2) Директива ШАГ; срабатывает также, как и "ПУСК", но выполняется только одна строчка программы. после этого снова происходит приостанов по общим правилам. С ее помощью организуется пошаговое исполнение программы, удобное, например, при поиске ошибки. 3) По директиве ВЫХОД; происходит принудительное завершение остановленной программы (т.е. последовательный выход из всех процедур в цепочке вызовов без продолжения работы) и выход в основной диалоговый режим. Принцип отладки с использованием режима приостанова заключается в поиске методом последовательного приближения ситуации в программе, начиная с которой она работает неправильно. От других способов отладки он отличается возможностью более гибких действий в конкретной ситуации. При ошибке в процедуре происходит переход в режим останова по ошибке с появлением в информационной строке экрана слова >> О Ш И Б К А << и выдачей сообщения о характере и месте ошибки, например: НЕДОПУСТИМЫЕ ОПЕРАНДЫ "+" В СТРОКЕ 32 "СЧЕТЧИК" Этот режим отличается от режима приостанова только невозможностью продолжить выполнение программы (директивы ПУСК и ШАГ недопустимы) и позволяет ознакомиться с состоянием программной среды в момент ошибки. Дополнительные сведения. 1) Переход из режимов останова в режим редактирования (по ПРОЦ и ФУНК) влечет автоматическое исполнение директивы ВЫХОД. 2) Приостанавливать можно только процедуры и функции: директива СТОП, выполненная в режиме диалога (например, внутри составного предписания), вызывает лишь прекращение его выполнения без перехода в режим приостанова. 3) Из режимов останова допустим вызов другой программы (например, программы обработки ошибки), которая тоже может быть приостановлена, но злоупотреблять этой возможностью не следует, т.к.: - вернуться в режим приостанова первой программы можно только после нормального завершения второй; в частности, при ошибке во второй программе первую продолжить нельзя; - по директиве ВЫХОД происходит сквозной выход из всех остановленных программ в основной диалоговый режим; - возможны ошибки при попытке присваивания во второй программе тем глобальным именам, которые в момент приостанова первой программы имели защиту. - почти наверняка вызов второй программы испортит рабочее состояние программной среды для первой. Поэтому следует следить за текущим режимом и перед перевызовом программы выполнять директиву ВЫХОД. 5.6.3. Языковые средства отладки. Прокрутка и след Следующие средства позволяют получить дополнительные сведения о программе во время ее работы. Все они носят режимный характер, т.е. могут быть включены на какой-то срок или выключены с помощью предписания ВКЛ/ВЫКЛ (д35). 1) Прокрутка имени означает выдачу сообщения о выполнении присваивания ему, например: ИМЯ = 125 КОРТЕЖ[...] = .ПУСТО. ТЕКСТ = "БЕГЕМОТ" Слева от знака равенства указывается имя, справа - новое значение. "[...]" означает, что происходит изменение только некоторой части его значения, например, при присваивании выборке или вырезке. Можно включить (выключить) прокрутку одного, нескольких или сразу всех имен, как показывают примеры: ВКЛ ПРОКРУТКУ:ОДНО; ВКЛ ПРОКРУТКУ ИМЕН: ОДНО, ДВА, ТРИ; ВЫКЛ ПРОКРУТКУ ИМЕН; Слово ИМЕН можно везде опускать. Имена со включенной прокруткой в каталоге имен выдаются со звездочкой, например: * ИМЯ.............. ЦЕЛ Включение прокрутки сразу всех имен в каталоге не отражается. 2) Следом процедуры или функции называется сообщение о входе в нее или выходе из нее. При входе сообщается имя вызванной процедуры и информация о параметрах: - для входных параметров - передаваемое в процедуру значение; - для выходных - имя, которое примет значение из процедуры; - для возвратных выдается и то, и другое. Еще одно сообщение выдается при выходе из процедуры, причем для функции указывается возвращаемый результат: СТРЕЛА(132, ВЫХОДНОЙ, ВОЗВРАТНЫЙ = <1,2> ) ЦЕЛЬ(12) ЦЕЛЬ => "РЕЗУЛЬТАТ" КОНЕЦ РАБОТЫ "СТРЕЛА" Если вызываемая процедура не является непосредственным значением имени (например, вычисляется), то вместо ее имени выдается .ВЫР. След всех вызываемых процедур включается и выключается предписаниями: ВКЛ СЛЕД; ВЫКЛ СЛЕД; 3) След строк позволяет получить более подробную информацию о ходе выполнения процедуры: ВКЛ СЛЕД СТРОК; ВЫКЛ СЛЕД СТРОК; Если этот режим включен, то при переходе к выполнению очередной строки процедуры выдается ее номер, например: #12 #13 #25 #26 #13 #25 #26 В некоторых случаях возможна ошибка на одну строку, например, если предписание занимает несколько строк или после него нет точки с запятой. Предписание ВЫКЛ СЛЕД выключает заодно и след строк, если он был включен. Прокрутка и след позволяют проследить за изменением значений имен в программе, за порядком вызова процедур и их взаимодействием с программой. 4) Защита имен по записи (5.2.2) также является удобным отладочным средством, позволяя предохранять имена от случайных и нежелательных присваиваний. 5) Средства организации выдачи отладочной информации на различные устройства вывода описаны в 5.8. 6) Приостановить выполнение программы без перехода в режим приостанова можно нажатием клавиши РЕД. Приостановить выдачу непрерывного потока информации можно нажатием пробела. Для продолжения достаточно нажать любую другую клавишу. 5.7. Файлы и обмен. Работа с внешней памятью 5.7.1. Внешняя память. Библиотеки файлов Внешняя память ЭВМ предназначена для долговременного хранения информации. Долговременным запоминающим устройством (ДЗУ) ЭВМ АГАТ является дисковод. Система расчитана на работу не более, чем с двумя дисководами, подключенными к одному разъему. Накопителями информации служат гибкие магнитные диски. Единицей логической организации информации во внешней памяти и доступа к ней является файл (внешний). Вся информация в файле однородна по содержанию (текст, программа, двоичный код и т.п.), и тип ее определяет способ доступа к файлу и его обработки. Каждый рабочий диск представляет собой библиотеку файлов и имеет каталог, содержащий сведения о каждом файле: его имя, тип, размер, местоположение на диске. Разметка библиотеки производится вместе с разметкой диска программой ФОРМАТ (см. Приложение 4). Имя внешнего файла - это произвольная цепочка символов длиной не более 30. Все символы значащие. Более короткие имена (вплоть до пустого) дополняются пробелами справа, более длинные - обрезаются до 30 символов. Системой "Школьница" обрабатываются два типа файлов: - текстовый (Т) - для хранения символьной информации, в т.ч. текстов программ; его можно прочитать целиком в память Редактора или записать оттуда на диск; - кодовый (К) - для хранения двоичных данных и машинных программ; используется в основном в Отладочном комплексе. Файлы других типов допускаются, но не обрабатываются системой. Файл может быть заперт (закрыт на запись).Тогда хранимая в нем информация не может быть изменена или уничтожена. Работу с библиотеками в РАПИРЕ реализуют универсальные предписания: КАТАЛОГ; или КАТАЛОГ ФАЙЛОВ; - выдача каталога файлов Форма и смысл выдаваемой информации были описаны в 5.4.4 (защищенные файлы отмечаются звездочкой в первой позиции строки). ЗАПЕРЕТЬ выражение ; - защита файла по записи; ОТПЕРЕТЬ выражение ; - снятие зашиты; СТЕРЕТЬ выражение ; - уничтожение файла в библиотеке. Значение выражения в этих предписаниях должно быть текстом и определяет имя файла на диске. Особой формой обработки текстовых файлов в РАПИРЕ является произвольный доступ. 5.7.2. Текстовые файлы произвольного доступа С внешним текстовым файлом в РАПИРЕ может быть связан объект программной среды - внутренний файл. Он рассматривается как объект, который находится в ДЗУ и сохраняется при выключении машины. Как тип данных файл описывается следующим образом. Файл представляет собой нефиксированную по длине упорядоченную последовательность литер, оканчивающуюся специальным символом "конец файла". Доступ к файлу ведется посредством указателя текущей позиции, который в каждый момент времени указывает на ту или иную позицию в файле, называемую текущей. Основные действия над файлом: - прочитать литеру из текущей позиции и сместиться к следующей (ввод), - записать литеру в текущую позицию и сместиться к следующей (вывод), - определить номер текущей позиции, - переместить указатель к позиции с указанным номером. Ограничения: 1) Если в текущей позиции находится символ "конец файла", то попытка ввода считается ошибкой, а при выводе очередная литера дописывается в конец файла, расширяя его; символ конца при этом сдвигается в следующую позицию. 2) Вывести символ конца файла в файл нельзя (следствие: файл может только расширяться). 3) Указатель можно перемещать только внутри файла, т.е. номер его позиции - число от 1 до N, где N - позиция символа конца файла. Таким образом, обработка файла напоминает работу магнитофона: файл играет роль магнитной ленты, на которой записана некоторая информация, указатель - роль головки звукоснимателя, перемещение указателя соответствует перемотке ленты вперед-назад, а ввод-вывод аналогичен записи и воспроизведению. Описанный способ обработки называется произвольным доступом. Он позволяет работать с очень большими текстовыми данными в ДЗУ, не считывая их целиком в память. 5.7.3. Открытие и закрытие файла Файл, как носитель информации, существует на диске реально и независимо от того, работает с ним программа или нет. Для работы с файлом необходимо предварительно открыть доступ к нему, т.е. установить канал обмена информацией между ОЗУ и ДЗУ. Предписание открытия файла имеет две формы: а) ОТКРЫТЬ имя ; б) ОТКРЫТЬ выражение КАК имя ; Выполняется оно так: 1) Проверяется, есть ли свободный канал связи с ДЗУ. Если нет, выдается сообщение об ошибке "СЛИШКОМ МНОГО ОТКРЫТЫХ ФАЙЛОВ". Одновременно могут обрабатываться до 7 файлов. 2) Определяется имя внешнего файла, доступ к которому открывается. В случае (а) именем файла считается указанное имя, в случае (б) - текст, являющийся значением выражения. 3) Проверяется защита указанного в предписании имени. Если она полная или абсолютная, выдается сообщение об ошибке, и файл не открывается. 4) Указанный файл ищется в текущей библиотеке. Если он не обнаружен, заводится пустой текстовый файл. 5) Указатель помещается в первую позицию файла. 6) Значением имени становится объект "файл" (файловое значение). Оно определяет канал связи с открытым файлом на диске. В дальнейшем употребление этого значения в операциях и предписаниях, требующих объект "файл", означает обращение к соответствующему каналу связи, т.е. к файлу в ДЗУ. Описанная конструкция позволяет открыть файл под своим именем или под любым другим. Например: ОТКРЫТЬ "АРХИВ" КАК АРХИВ; ОТКРЫТЬ АРХИВ; ОТКРЫТЬ <"ФАЙЛ1","ФАЙЛ2","ФАЙЛ3">[Х] КАК ФАЙЛ; Первые два предписания эквивалентны. Третий пример показывает, как можно открыть один из нескольких файлов в зависимости от некоторых условий. После выполнения предусмотренной обработки файла его необходимо закрыть, т.е. освободить канал связи с файлом. Если не сделать этого, возможна частичная потеря информации в файле или даже порча библиотеки. Для закрытия файлов служат предписания: ЗАКРЫТЬ ; ЗАКРЫТЬ имя ; Если указано имя, то закрывается доступ только к связанному с ним файлу; иначе закрываются все открытые файлы. При закрытии файла соответствующее ему файловое значение не уничтожается, но перестает выполнять свои функции доступа к файлу. Дополнительные сведения. 1) Пока существует хотя бы один канал связи с диском, т.е. пока открыт хотя бы один файл, диск переставлять нельзя! Это контролируется и рассматривается как ошибка. 2) Доступ к файлу в программе определяется объектом "файл", а не именем, под которым он открыт. В примере: ОТКРЫТЬ Ф; Ф->Ф1; <1,2,Ф1>->Ф2; имена Ф, Ф1 и третий элемент кортежа Ф2 будут определять доступ к одному и тому же файлу. Самому имени Ф можно даже присвоить другое значение. 3) При уничтожении последней ссылки на файловое значение оно уничтожается, а сам файл закрывается. В примере: ОТКРЫТЬ Ф; 1->Ф; открытый файл будет сразу же закрыт. 4) Рекомендуется указывать в предписании ЗАКРЫТЬ то имя, под которым файл был открыт. 5) Закрытие уже закрытого файла не считается ошибкой; никакие действия при этом не выполняются. 5.7.4. Действия с файлами 1) Определение номера текущей позиции. Для этого служит унарная операция: @ файловое выражение Значением "файлового выражения" здесь и далее должен быть некоторый открытый файл. Эта операция может стоять в любом месте, где допустимо выражение. Результат ее - целое число, большее 0. 2) Определение признака конца файла. Существует стандартная функция: КФ (файловое выражение) Ее результат - литера "Д", если в текущей позиции находится символ конца файла, и литера "Н" - в противном случае. Цикл вида ПОКА КФ(ФАЙЛ)="Н" :: ... ВСЕ; является типичным способом перебрать весь файл. 3) Перемещение указателя файла к другой позиции: ПОЗИЦИЯ файловое выражение = выражение ; где значением "выражения" является целое число - номер новой позиции указателя - от 1 до N-1 (N - позиция символа конца файла). Если новая позиция файла задана неверно, выдается сообщение об ошибке, и указатель устанавливается в последнюю позицию на символ конца файла. Примечание: если при этом номер позиции меньше 1 или больше 2**24, указатель не сдвигается. 4) Вывод в файл. Осуществляется средствами вывода языка РАПИРА (предписания ВЫВОД, КАТАЛОГ). В поле "направление вывода" (д29,32) следует писать: В ФАЙЛ имя_файла (слово ФАЙЛ можно опускать). Например: ВЫВОД В ФАЙЛ Ф: ... КАТАЛОГ ИМЕН В ФАЙЛ КТЛ; Вывод в файл осуществляется по тем же правилам и в том же виде, что и на экран или бумагу: в виде потока символов. Очередной символ выводится в файл, как описано в 5.7.2. Вывод возможен с любой позиции файла, при необходимости он расширяется. Перевод строки выводится в файл как литера УПР-М. 5) Ввод из файла. Осуществляется с помощью предписания ВВОД, в заголовке которого надо писать: ИЗ ФАЙЛА имя_файла (слово ФАЙЛА можно опускать). Ввод из файла осуществляется так же, как с клавиатуры: возможен ввод в режиме приема текстов и в режиме приема данных, записанных в файле в текстовом виде. Тексты и данные должны быть записаны в файле по тем же правилам, по каким они вводятся с клавиатуры, с учетом всех ограничений на длину лексем, мощность структур и т.д. (см. 5.3.11). Концом вводимой строки считается символ перевода строки УПР-М. Пример: ВВОД ИЗ ФАЙЛА Ф1:А,В,С; ВВОД ИЗ Ф2 ДАННЫХ:К[1],М; Таким образом, вывод и ввод в случае файлов совместимы: любая выведенная информация может быть введена с соблюдением разбиения на строки. Особенности ввода из файла: - попытка чтения символа конца файла считается ошибкой (ситуация исчерпания данных в файле); - при ошибке ввода данных (не текстов) перезапрос не происходит, и ввод прерывается с выдачей сообщения об ошибке; - записанные в файле управляющие символы "->", "<-" и другие, несущие функциональную нагрузку на вводе. при вводе из него редактирующих действий не выполняют. 6) Для удобства политерной обработки файлов предусмотрена функция чтения нескольких литер из файлов: ЧТФ ( файловое выражение , выражение ) Значение "выражения" должно быть целым числом от 0 до 255 - оно показывает, сколько литер надо считать из файла. Очередные литеры из указанного файла оформляются в виде текста и выдаются результатом функции. Указатель при этом сдвигается к первой непрочитанной литере. Как и при вводе, ведется контроль конца файла. Несколько примеров использования файлов в программе: а) Распечатка содержимого файла: ОТКРЫТЬ ИСТОЧНИК; ПОКА КФ(ИСТОЧНИК)="Н" :: ВЫВОД НА БУМАГУ БПС: ЧТФ(ИСТОЧНИК,1); ВСЕ; ЗАКРЫТЬ ИСТОЧНИК; б) Относительное смещение на Х символов по файлу: ПОЗИЦИЯ Ф=@Ф+Х; в) Программная обработка каталога файлов (получение информации о первом файле в каталоге): ОТКРЫТЬ КТЛ; КАТАЛОГ В КТЛ; (* запись каталога в файл *) ПОЗИЦИЯ КТЛ=1; (* возврат к началу *) ВВОД ИЗ КТЛ:П,П,С; (* пропуск пустой строки,заголовка чтение данных о файле N1 *) ЧТФ(КТЛ,1)->ЗАЩИТА; (* определение по каталогу *) ЧТФ(КТЛ,1)->ТИП; (* всей информации о файле *) @КТЛ->ПОЗ; ПОЗИЦИЯ КТЛ=ПОЗ+5; (* настройка на имя *) ВВОД ИЗ КТЛ:ИМЯ_ФАЙЛА; ПОЗИЦИЯ КТЛ=ПОЗ; (* возврат к длине *) ВВОД ИЗ КТЛ ДАННЫХ:ДЛИНА; (* ОСТАТОК ИГНОРИРУЕТСЯ *) (* сюда можно вставить обработку полученных *) (* данных ИМЯ_ФАЙЛА, ЗАЩИТА, ТИП и ДЛИНА *) ЗАКРЫТЬ КТЛ; Примечание. Текст процедуры или функции хранится в ДЗУ в виде текстового файла. Поэтому можно обрабатывать прямым доступом тексты процедур, редактировать и транслировать как тексты процедур произвольные файлы, сформированные программно. 5.7.5. Переключение ДЗУ Система имеет ряд дополнительных возможностей, если в конфигурацию ЭВМ входят два дисковода, подключенные к одному разъему. Одно из ДЗУ в каждый момент времени является текущим активным. Это значит, что по предписаниям ОТКРЫТЬ, ЗАПЕРЕТЬ, ОТПЕРЕТЬ, СТЕРЕТЬ, КАТАЛОГ и директивам ПРОЦ и ФУНК обращение произойдет к нему. Номер текущего активного ДЗУ (1 или 2) задает стандартная процедура ДЗУ ( выражение ) ; Другое ДЗУ при этом не становится недоступным. Если, например, на каком-то дисководе был открыт файл (когда ДЗУ было активным), то для обмена с ним используется тот же дисковод, независимо от того, остался он активен он или нет. В Редакторе переключение ДЗУ происходит по директиве РАБОТАТЬ С ДЗУ N. 5.8. Организация ввода-вывода 5.8.1. Потоки информации и устройства ввода-вывода По смыслу и происхождению информация, участвующая в процессе диалога, делится на потоки. Потоки вывода: 1) СИСТЕМНЫЙ вывод для поддержки диалога: - приглашение к вводу и отображение ввода с клавиатуры, - сообщения об ошибках и переходе в режим приостанова, - системные запросы ЗАПОМИНАТЬ (Д/Н)? и ПРИСВАИВАТЬ (Д/Н)?. 2) ПРОГРАММНЫЙ вывод: информация, выдаваемая из програм по предписаниям ВЫВОД и КАТАЛОГ. 3) ОТЛАДОЧНЫЙ вывод вспомогательной информации в режимах отладки: - прокрутка имен, - след входов и выходов процедур и функций, - след строк в процедуре. Все эти три потока в совокупности образуют полный протокол диалога пользователя с ЭВМ. Потоки ввода: 1) Системный ввод предписаний и директив в диалоговых режимах. 2) Программный ввод, организуемый в программах с помощью предписания ВВОД. Специальные средства символьного ввода, жестко связанные с определенным внешним устройством (функции ЧТФ - для файлов; КЛАВ, НАЖАТО - для клавиатуры, ЭКЦВ, ОКСИМ - для экрана телемонитора и т.п.), в потоки ввода не входят. В потоки вывода не включаются сообщения, выдаваемые в информационной строке экрана и специально организуемый с помощью стандартных процедур графический вывод на экран. Устройствами, способными принимать или выдавать информацию в системе являются: Устройства вывода: - экран телемонитора, - печатающее устройство, - файлы. Устройства ввода: - клавиатура, - один из файлов. 5.8.2. Переключение потоков Возможность разового вывода на любое из устройств вывода или разовый ввод с любого устройства ввода уже рассматривалась при описании предписаний ввода и вывода (5.3.9, 5.3.11, 5.7.4). Кроме этого, можно организовать постоянную связь любого потока с любым устройством, например, направить вывод всей отладочной информации только в файл, чтобы не загромождать экрана, сделать копию протокола диалога с ЭВМ на бумагу, переключить программный ввод данных с клавиатуры на файл, и т.д. Этот механизщ называется переключением потоков и реализуется предписаниями ВКЛ/ВЫКЛ (д35): ВКЛ вид устройство ; ВЫКЛ вид устройство ; В случае переключения вывода "вид" - это название вида выдаваемой информации: - ВЫВОД - программного вывода, - ОТЛАДКУ - отладочного вывода, - ПРОТОКОЛ - всех трех потоков вывода одновременно. "Устройство" - это "НА ЭКРАН", "НА БУМАГУ" или "В ФАЙЛ имя". Включение потока вывода на одно из устройств означает, что вся относящаяся к этому потоку информация будет выдаваться в том числе и на указанное устройство (возможно, до этого она выдавалась на другие устройства). Выключение означает, что если данный вид информации выводился на указанное устройство, то теперь этот вывод отключается. Так можно отключить данную форму вывода вообще. Указание устройства вывода в предписаниях ВВОД и КАТАЛОГ означает разовый вывод только на это устройство. Если оно не указано, то программный вывод поступает на все устройства, к которым он подключен. Пример. Чтобы выдать на бумагу результаты программы, вместо замены каждого слова ВЫВОД на ВЫВОД НА БУМАГУ достаточно перед вызовом программы набрать предписание ВКЛ ВЫВОД НА БУМАГУ; Т.к. устройств ввода всего два, а ввод возможен только с одного, то основным считается клавиатура. Переключение на ввод из файла или с клавиатуры осуществляется предписаниями: ВКЛ ВВОД ИЗ ФАЙЛА имя ; ВЫКЛ ВВОД ИЗ ФАЙЛА имя ; Переключать системный ввод нельзя! Аналогично выводу, все предписания ввода с явно указанным устройством выполняют ввод с этого устройства, а все предписания, в которых оно не указано, - с того, к которому подключен поток ввода. Пример. Для организации демонстрационного режима работы диалоговой программы, следует записать в файл ответы на ее запросы, а затем включить ввод из этого файла. При переключении ввода-вывода на файл, а также при разовом вводе-выводе, файл должен быть открыт. В противном случае будет выдано сообщение об ошибке "ФАЙЛ НЕ ОТКРЫТ", и переключение не сработает. Дополнительные сведения. 1) Максимальное наполнение потока вывода таково: - два файла + экран + бумага, - три файла. 2) При ошибке обмена с файлом, все настроенные на него потоки ввода-вывода автоматически отключаются. 3) При выдаче на экран управляющие символы выполняют возложенную на них дополнительную функциональную нагрузку. Вставкой их в выдаваемый текст можно управлять цветом, фоном и т.п. При выводе на бумагу они выдаются как буквы с предшествующим знаком "^", а при выводе в файл рассматриваются как обычные литеры. 5.9. Графика и организация диалога 5.9.1. Графические возможности ЭВМ "Агат" Экран телемонитора ЭВМ "Агат" можно рассматривать как прямоугольное поле, разлинованное наподобие тетрадного листа на клетки, рисовать на котором можно только закрашивая клетку целиком в тот или иной цвет, т.е. любое изображение можно представить на экране лишь приближенно. Размеры отдельной клетки и возможные цвета раскраски зависят от используемого графического режима. Всего таких режимов 5: 1) Графика двойного разрешения (ГДР). Экран делится на 256х512 черно/белых точек. 2) Графика высокого разрешения (ГВР). Экран делится на 256х256 клеток (фактически они выглядят точками). Каждая точка может быть только черной или белой. 3) Графика цветная высокого разрешения (ГЦВ). 256х256 клеток 4 различных цветов. 4) Графика среднего разрешения (ГСР). 128х128 клеток 8 различных цветов. 5) Графика цветных символов (ГЦС). Экран состоит из 32х32 клеток, причем в каждой клетке может быть изображен символ (буква, цифра и т.д.). При этом возможны три вида изображения символа: - нормальный - цветной символ на черном фоне, - инверсный - черный символ на цветном фоне, - мерцающий - чередование нормального и инверсного символов. 6) Графика нецветных символов (ГНС): 64х32 черных символа на белом экране или столько же белых символов на черном экране. Изображение в последнем режиме хорошо выглядит только на черно-белом мониторе. Далее для удобства элементарная клетка каждого графического режима называется просто точкой. Содержимое экрана в том или ином режиме постоянно хранится в ОЗУ машины в специальной кодировке. Это позволяет хранить, изменять, читать изображения программой, запоминать их на диск и загружать с него. Возможность ЭВМ показывать на экране содержимое различных участков памяти в различных режимах позволяет одновременно обрабатывать несколько изображений. В символьном режиме кроме графики можно организовать диалог с пользователем, отведя под него весь экран или некоторую его часть. 5.9.2. Управление графикой и диалогом в РАПИРЕ. Процедура РЖМ Структура графической памяти в РАПИРА-интерпретаторе такова: - большая графическая страница для работы в режимах ГСР и ГВР, - 5 малых графических страниц для работы в режимах ГЦС и ГНС; причем 2,3,4 и 5 страницы располагаются в области памяти большой страницы - при переходе, например, в режим высокой графики их содержимое может испортиться. Содержимое одной из этих страниц постоянно отображается на экране в некотором режиме. Одна из 5 малых страниц является также текстовой страницей, отображающей протокол диалога в одном из символьных режимов: ГЦС или ГНС. Одна из 6 графических страниц является рабочей: с ней работают все процедуры и функции системной графики. Все три страницы - показываемая, текстовая и рабочая графическая - могут быть различными: можно не видеть на экране ни протокола своего диалога с ЭВМ, ни того, что рисует программа. Управление графическими страницами и режимами осуществляет стандартная процедура РЖМ. Ее параметр - текст произвольной длины, в котором через пробелы или запятые записаны графические команды. Каждая графическая команда имеет вид: <режим_и_адресат><действие>...<действие> Поле <режим-и-адресат> задает графическую страницу и режим исполнения указанных далее действий. Здесь возможны следующие варианты: Тi - одна из 5 малых страниц в режиме ГЦС (i=1..5), Уi - одна из 5 малых страниц в режиме ГНС (i=1..5), С - большая страница в режиме ГСР, В - большая страница в режиме ГВР, Ц - двойная страница в режиме ГЦВ, Д - двойная страница в режиме ГДР, * - рабочая графическая страница в текущем графическом режиме. Поле <действие> определяет, что надо выполнить с указанной страницей в указанном режиме: О - очистить черными точками, П - показать на экране, Г - переключить графику (объявить рабочей графической страницей), Д - переключить диалог (объявить текстовой страницей), Дополнительные сведения. 1) Черной точкой ГНС считается пробел, а ГЦС - черный пробел. Поэтому, если в ГЦС текстовая страница очищается, то при перемещении стрелками по очищенному полю курсор не виден: он имеет цвет текущего символа, т.е. черный. 2) При переключении диалога текущий цвет вывода и содержимое новой текстовой страницы сохраняются, но устанавливается стандартное окно (см. 5.9.4). 3) При переключении графики устанавливается белый цвет отрисовки, кроме того, в ГЦС символом отрисовки устанавливается инверсный пробел, а в ГНС - "*". 4) Комбинация "*Д" понимается как переключение диалога на текущую текстовую страницу (а не на графическую, как следует из описания), и может быть использована для показа текстовой страницы из прграммы. 5) Для облегчения работы с графикой введен показ попеременно текстовой и рабочей графической страниц при каждом нажатии функциональной клавиши "8" во время ожидания системой ввода символа. Примеры использования процедуры РЖМ: РЖМ("Т1Д,СГОП"); - переключить диалог на первую страницу в режиме цветных символов, переключить графику на большую страницу в режиме ГСР, очистить ее и показать на экране; РЖМ("*О,ВП"); - очистить рабочую графическую страницу и показать на экране страницу в режиме высокого разрешения. 5.9.3. Стандартные графические процедуры 5.9.3.1. Установка системы координат Экран в графическом режиме рассматривается как часть непрерывной координатной плоскости. При установке режима начало координат находится в левом нижнем углу экрана, координатные оси направлены вправо и вверх, единицей масштаба по осям считается одна точка текущего режима. В связи с тем, что физическая ширина экрана больше его высоты, изображение получается не изометрическим. Чтобы установить изометрический режим, достаточно в процедуре РЖМ при установке режима указать не "Г", а "ГМ". Начало координат и масштабы по осям могут быть изменены в программе с помощью процедур: ОТСЧЕТ(Нх,Ну); МТБ(Мх,Му); Координаты Нх и Ну - экранные, в точках текущего режима. Мх и Му - целые числа от 0 до 255. 0 означает отсутствие масштабирования по данной оси; Любое другое значение, деленное на 256, - это новый масштаб по данной оси. Таким образом, задаваемые при отрисовке графических элементов координаты точки (Х,У) преобразуются по формулам: Х' = Нх + Х * Мх / 256 У' = Ну + У * Му / 256 (если масштаб ненулевой) причем допускаются и отрицательные координаты. Ограничение: независимо от масштабов абсолютное значение координаты не должно превосходить 511. Примечание: здесь и далее в графических процедурах координаты можно задавать дробными. Используется только их целая часть. 5.9.3.2. Установка цветов Каждая точка графического элемента рисуется текущим цветом (а иногда и текущим сиимволом). 1) Текущий цвет определен для всех режимов, кроме ГНС, и задается процедурой ЦВЕТ(N); Параметр N - целое число от 0 до 255. В режимах ГЦВ и ГСР его смысл таков: 0 - черный 4 - синий 8 - черный 12 - темно-синий 1 - красный 5 - сиреневый 9 - коричневый 13 - фиолетовый 2 - салатный 6 - голубой 10 - зеленый 14 - бирюзовый 3 - желтый 7 - белый 11 - хаки 15 - серый и далее через 16 до 119 цвета повторяются. В режиме ГЦВ сплошными служат цвета 0,1,2 и 4 - при рисовании точек, линий и дуг применимы только они. При рисовании прямоугольников, символов и закраске областей остальные цвета имитируются смесью точек основных цветов. В режиме ГЦС цвет задается так: 0-7 - инверсный символ, 8-15 - мерцающий символ, 16-23 - инверсный символ, 24-31 - нормальный символ. Внутри каждой 8-ки расположение цветов то же; через 32 раскраски повторяются до 119. В режимах ГВР и ГДР есть только два базовых цвета: черный (0) и белый (1). Цветам 2-15 поставлены в соответствие различные фактуры закраски областей. Числа с 120 до 123 задают палитру для режимов ГЦС и ГЦВ,при этом изменяются значения базовых цветов. В режиме ГЦВ базовыми цветами служат: ЦВЕТ(120) ЦВЕТ(121) ЦВЕТ(122) ЦВЕТ(123) черный белый черный черный красный красный черный красный салатный салатный салатный черный синий синий синий синий Задание палитры переводит черно/белые режимы (ГДР, ГВР, ГНС) в монохромное изображение (точка/фон): белый/черный черный/белый зеленый/черный черный/зеленый Кроме того, изменяется цвет фона (символа) в прямом (инверсном) изображении ГЦС: черный синий черный фиолетовый. Числа с 128 до 254 означают рееверсный цвет. Это значит, что каждая точка рисуется цветом 15-N (ГСР), 1-N (ГВР и ГДР) 3-N (ГЦВ), где N - ее цвет на экране: черный (0) на белый (7-0=7) и наоборот, красный (1) на голубой (7-1=6) и наоборот, зеленый (2) на фиолетовый (7-2=5) и наоборот, желтый (3) на синий (7-3=4) и наоборот. Цвет 255 - пустой: точки этого цвета не рисуются. При установке нового режима автоматически устанавливается белый цвет (в ГЦС - белый нормальный). 2) Текущий символ имеет смысл только в символьных режимах. Он задается процедурой: СИМРИС(Л); Л - это литера, содержащая символ, которым будут рисоваться графические элементы (в сочетании с текущим цветом). При установке нового режима текущим символом автоматически устанавливается пробел для ГЦС и "*" для ГНС. 3) Определить цвет точки на экране можно с помощью функции ЭКЦВ(Х,У) которая выдает номер цвета в описанном выше виде, причем все одинаковые цвета сводятся к цвету с наименьшим номером. 5.9.3.3. Отрисовка графических элементов 1) ТЧК(Х,У); Раскрашивает точку с указанными координатами в текущий цвет (и символ, если надо). 2) ЛИН(Х1,У1,Х2,У2); Рисует текущим цветом линию из точки (Х1,У1) в точку (Х2,У2). 3) ДУГА(Х,У,RХ,RУ,НАЧ,КОН) Рисует дугу эллипса с центром в Х,У и радиусами RХ, RУ. Рисование производится против часовой стрелки, НАЧ и КОН - начальное и конечное значение угла в градусах. 4) ПРЯМ(Х1,У1,Х2,У2); Рисует текущим цветом прямоугольник, одна диагональ которого определяется координатами (Х1,У1) и (Х2,У2). 5) ОБЛ(Х,У); Заполняет текущим цветом связную область одного цвета, совпадающим с цветом точки (Х,У). Невозможна перекраска области, залитой смешанным цветом в ГЦВ - скорее всего, раскрасятся 2-3 точки, прилегающие к началу раскраски. 6) ТКС(Хн,Ун,Хс,Ус,Хг,Уг,Хв,Ув,Рх,Ру,Цс,Цф,Т); Выводит на экран в текущем графическом режиме изображение текста Т. При этом каждый символ считается представленным матрицей 6х8 точек, часть точек которой соответствует изображению символа, а часть - нет (фон). Правила отрисовки таковы: - каждая точка матрицы рисуется прямоугольником Рх х Ру, причем точки символа имеют цвет Цс, а точки фона - цвет Цф; координатой этого прямоугольника считается левый нижний угол; - матрица одного символа рисуется так, что расстояние между горизонтальными точками матрицы одного символа определяется числами Хг,Уг (по горизонтали и по вертикали), а между вертикальными - числами Хв,Ув; координаты левой нижней точки матрицы - (Хн,Ун); - расстояние между изображениями соответствующих точек матриц двух соседних символов определяется числами Хс,Ус. Общие формулы координат (i,j)-й точки N-го символа: Х = Хн + (N-1)*Хс + (i-1)*Хг + (j-1)*Хв У = Ун + (N-1)*Хс + (i-1)*Хг + (j-1)*Хв Таким образом, изображение всего текста и отдельных его символов может быть каким угодно косым, растянутым, сжатым, утолщенным, перевернутым, зеркальным (при задании соответствующих растояний отрицательными). Дополнительные возможности, предоставляемые процедурой ТКС описываются в Приложении 4 (АЛФАВИТЫ). 5.9.4. Работа с текстовой страницей Диалог пользователя с ЭВМ может вестись только в двух текстовых режимах. В режиме ГЦС экран содержит 32 строки по 32 символа, в режиме ГНС - 32 строки по 64 символа. Если необходимо использовать для диалога не весь экран, а лишь некоторую его часть (например, когда эта же страница является графической), можно установить текстовое окно с помощью процедуры: ОКНО(Х1,У1,Х2,У2); Ее параметры определяют экранные координаты в символах диагонали нового окна относительно левого нижнего угла экрана. Выйти средствами редактирования за пределы окна невозможно. Оно сбрасывается только при выходе из Редактора, перевызове системы и переключении диалога. В оконных координатах (т.е. относительно левого нижнего угла окна) работают процедура установки позиции курсора ПОЗ(Х,У); и функция ОКСИМ(Х,У) определяющая символ в указанной позиции окна. Координаты всех упомянутых процедур и функций могут быть дробными числами - при исполнении они преобразуются к целому виду обрезанием дробной части. 5.10. Модули и исполнители 5.10.1. Расширение аппарата процедур в РАПИРЕ Локализация имен в процедурах ограничивает время и область существования этих имен и связанных с ними объектов, позволяя скрыть особенности работы процедуры от программы-пользователя. Иными словами, каждая процедура во время вызова обладает своей локальной программной средой, доступ к которой вне этой процедуры невозможен. Аналогичная потребность возникает при создании больших программ, состоящих из нескольких информационно зависымых процедур. Например, в комплекте графических процедур, где каждая процедура отвечает за отрисовку одного элемента, общими данными могут быть состояние экрана, координаты текущей точки, цвет пера и т.д. Часть их доступна пользователю пакета, а часть играет вспомогательную роль. Локальная среда для комплекта процедур реализуется в РАПИРЕ аппаратом модулей. Дополнительная возможность описания синтаксиса предписаний позволяет с помощью модулей реализовать исполнителей для РОБИКА. 5.10.2. Модули Модуль в РАПИРЕ - это постоянно существующая независимая локальная программная среда. Она образуется путем обособления ряда имен вместе с их значениями от внешней среды и ограничения доступа к ним. Например, в модуль можно выделить процедуры некоторого пакета и их общие переменные. Черты модуля: 1) Независимость и постоянство. Модуль, как целое, не является объектом языка, и не может участвовать в операциях и предписаниях над объектами. Его нельзя присваивать, вводить, выводить. Модуль, как локальная среда, не связан ни с каким объектом. В отличие от локальной среды процедуры, существующей лишь во время ее вызова, модуль существует и доступен постоянно. 2) Глобальность. Модули независимы друг от друга, локализация одного внутри другого невозможна, также как и локализация модуля в процедуре. 3) Свойства локализации. Модуль описывается набором локальных в нем имен, которые вне модуля в общем случае не видны. Внутри модуля значениями этих имен могут быть любые объекты, в т.ч. процедуры. Глобальные имена видны в модуле по общим правилам и в описании не нуждаются. 4) Доступ. Любое локальное имя модуля может быть объявлено доступным извне его. Это позволяет регулировать степень закрытости модуля. 5) Целостность. Внутренняя структура модуля скрыта от его пользователя. Недоступные локальные имена не выдаются в каталоге имен, а остановы в процедурах модуля маскируются: в режиме приостанова видна локальная среда обратившейся к нему внешней процедуры. Таким образом, модуль позволяет реализовать оболочку пакета процедур, прозрачную изнутри для всех глобальных имен и непрозрачную (полупрозрачную) снаружи. Свойства модуля позволяют посредством его обогащать операционную обстановку пользователя дополнительными, примитивными на его взгляд, операциями, не засоряя ее при этом излишней информацией о реализующем пакете. 5.10.3. Описание модуля Описание модуля хранится в отдельном текстовом файле в ДЗУ. Название модуля - имя этого файла. Подготовить описание можно, например, с помощью Редактора текстов. Описание модуля - это не процедурный блок. Поэтому его нельзя транслировать из Редактора по директиве КОНЕЦ ОПИСАНИЯ. Модуль описывается с соблюдением всех правил записи лексем и предписаний языка. Описание модуля (д43) включает в себя: - описание имен, образующих модуль; - указание стартовой и финишной процедур, если они есть; - описание процедур модуля. 1) Заголовок модуля - это описание имен, образующих локальную среду модуля: ИМЕНА: список имен ; Как минимум, в него входят имена всех процедур и функций модуля. Имена, перечисленные в заголовке, известны только в процедурах модуля. Если же после имени указано слово ДОСТУПНО, то это имя становится доступным: известным снаружи модуля при особом обращении (см. 5.10.5). От глобального оно отличается тем, что исчезает вместе со своим значением при выключении модуля. 2) Конструкции СТАРТ имя ; ФИНИШ имя ; определяют имена стартовой и финишной процедур модуля. Сами эти процедуры описываются ниже в описании модуля. Стартовая процедура вызывается в момент включения модуля и может использоваться для выполнения предварительных действий: присваивания начальных значений, открытия рабочих файлов, выдачи титульной и справочной информации и т.д. Финишная процедура вызывается при выключении модуля и служит для выполнения аналогичных завершающих действий: закрытия файлов, очистки экрана, выдачи результатов работы модуля и т.д. Стартовая и финишная процедуры (не функции!) параметров не имеют. Разрешается не указывать стартовую и (или) финишную процедуры, если начальные или конечные действия не предусмотрены. 3) Процедуры и функции, входящие в модуль, описываются обычным образом. Замечание. В описываемой версии при вводе из ДЗУ внутри модуля возможна неправильная обработка локальных имен загружаемой процедуры. Поэтому не рекомендуется использовать подзагрузку модуля с диска и все его процедуры следует помещать в одном файле. 5.10.4. Включение и выключение модуля Включение и выключение модуля осуществляется по предписаниям: ВКЛ МОДУЛЬ имя ; ВЫКЛ МОДУЛЬ имя ; При включении модуля: - проверяется, не включен ли уже модуль с указанным именем; если включен, выдается сообщение об ошибке; - в библиотеке на текущем активном ДЗУ ищется текстовый файл с указанным именем; - содержимое этого файла транслируется как описание модуля с диагностикой замеченных синтаксических ошибок и формированием соответствующих объектов в программной среде; - вызывается и срабатывает стартовая процедура, если она есть. С этого момента продолжает работать программа пользователя. Она может вызывать другие процедуры модуля, открытые для доступа (как, например, модуль ФУНКЦИИ предоставляет набор математических функций). Стартовая процедура может, не возвращая управления пользователю, сама вести весь диалог с ним. Однако выключить модуль из него самого нельзя. При выключении модуля: - вызывается финишная процедура, если она есть; - модуль уничтожается как локальная среда, т.е. пропадают все его имена и их значеныя. Имя, указываемое в предписаниях ВКЛ и ВЫКЛ, не имеет ничего общего с именами в языке. Своим написанием оно обозначает имя файла с описанием модуля и в дальнейшем название этого модуля. Как и все имена, оно может иметь любое значение, которое никак не связано с обозначаемым модулем. В данной версии может быть до 16 активных модулей. 5.10.5. Доступ к именам модуля Доступные имена модуля могут быть использованы в любой программе и в любой процедуре независимо от места ее вызова. Обращение к открытому имени описывается составным именем (д10) и имеет вид: название модуля ' открытое имя например: ШПАГА'КООРД_Х ДЕЖУРИК'ОКНО Составные имена могут быть использованы в предписаниях языка в полях "выражение" и "уточненное имя", например, в операциях, предписаниях вывода и присваивания (в обеих частях!). Нельзя использовать их в предписаниях ОТКРЫТЬ, ВВОД ИЗ ДЗУ и ВКЛ/ВЫКЛ. Последнее делает невозможным изменение защиты имен модуля вне его и позволяет запретить изменять значение имени вне модуля. Доступные имена удобно использовать для обмена данными между модулем и программой-пользователем. Замечание. Вызывать процедуры модуля, открытые для внешнего доступа, через штрих неудобно. Поэтому рекомендуется в стартовой процедуре присваивать эти процедуры другим глобальным именам, которые затем и использовать в программе. В финишной процедуре желательно присвоить им пустые значения. 5.10.6. Маскировка остановов Сокрытие внутренней структуры модуля достигается, кроме локализации вспомогательных имен, еще и маскировкой остановов в нем. Если при останове в обычной процедуре оказываются доступными ее локальные имена, то при останове в процедуре модуля этого не происходит: создается иллюзия останова в той точке внешней процедуры, в которой произошло обращение к модулю. Масскировка останова в модуле заключается в следующем: - имена модуля, включая локальные имена его процедур, не выдаются в каталоге имен, - поэтому при останове процедуры модуля пользователь "не видит" новых имен и их значений, хотя они и доступны в этот момент; - в диагностическом сообщении указывается место, где произошло обращение к модулю, а не место в модуле, где реально произошел останов: ОСТАНОВ В "МОДУЛЬ" ОСТАНОВ В "МОДУЛЬ" В СТРОКЕ 15 "РАКЕТА" ("РАКЕТА" - это процедура, которая обратилась к модулю); - прокрутка имен, объявленных в модуле, и след его процедур не ведутся, если они были включены вне модуля (т.е. если того не захотел автор модуля). Единственным признаком, который не может контролироваться системой и по которому можно судить о работе модуля, остается состояние открытых имен модуля и внешних устройств. Например, некий модуль ЧЕРТЕЖНИК к моменту останова мог успеть нарисовать линию, но не успеть исправить координаты последней отрисованной точки. Таким образом, хотя модуль и может быть остановлен, программная среда, доступная пользователю в этот момент, не засоряется ненужной информацией о нем. Фактически устанавливается режим останова процедуры, которая обратилась к модулю. По директиве СТАРТ будет продолжено выполнение остановленной процедуры модуля и всех вызвавших ее процедур. 5.10.7. Описание исполнителей с помощью модулей В силу специфики учебного языка основными "действующими лицами" в РОБИКЕ являются исполнители. Исполнитель - это гипотетический робот, имеющий собственное множество предписаний (МПИ) и действующий в определенной операционной обстановке. Пользователь выступает в роли оператора, подающего роботу предписания из его МПИ, которые тот исполняет. Синтаксис языка может расширяться за счет предписаний включаемых исполнителей. Исполнитель для РОБИКА описывается программой на РАПИРЕ, которая оформляется в виде модуля. Модуль обеспечивает реализацию важнейших свойств исполнителя: 1) Элементарность. Нет разницы в использовании предписания исполнителя и предписания языка: структура моделирующей программы надежно скрыта. 2) Постоянное присутствие. Включенный исполнитель всегда готов к работе, даже если с ним в данный момент не работают: робот ждет команду. Так можно работать одновременно с несколькими исполнителями. 3) Глобальность. Предписание исполнителю можно подавать с любого уровня вложенности процедур. Это позволяет создавать и хранить программы, написанные для конкретных роботов на их языке. Каждое предписание исполнителя программируется отдельной процедурой модуля, возможно с параметрами, соответствующими переменным полям и именам в предписании. Операционная обстановка - это локальная среда модуля. Она изначально задается стартовой процедурой и изменяется в соответствии с поступающими предписаниями. 5.10.8. Описание синтаксиса исполнителя Предписания исполнителей строятся по следующим правилам (д46): 1) В предписании допустимы: - ключевые слова, записываемые по правилам записи имен, - имена, - выражения, - двоеточия и запятые, разделяющие имена, выражения и ключевые слова. 2) Ключевое слово должно быть не длиннее 20 символов. 3) Предписание должно начинаться с ключевого слова. Начальные слова всех предписаний всех включенных исполнителей и языка должны различаться. Остальные правила записи лексем и ограничения на их длину те же, что и в РОБИКЕ. При описании исполнителя в заголовке модуля перед описанием процедур появляется раздел "описание синтаксиса" (д45). В квадратных скобках через точку с запятой перечисляются описания всех предписаний, образующих МПИ данного исполнителя. Описание отдельного предписания начинается с имени процедуры пакета, которая его исполняет. Через запятую в апострофах перечисляются возможные варианты записи этого предписания. Например: [ СУММА : 'СЛОЖИТЬ <ВЫР> С <ВЫР> И ПРИСВОИТЬ <ИМЯ>', 'СУММА: <ВЫР>,<ВЫР>,<ИМЯ>' ; ЧАСТНОЕ: 'РАЗДЕЛИТЬ <ВЫР> НА <ВЫР> И ПРИСВОИТЬ <ИМЯ>', 'ЧАСТНОЕ: <ВЫР>,<ВЫР>,<ИМЯ>' ] Переменные поля <ВЫР> и <ИМЯ> в тексте предписания означают, что в этой позиции должны стоять выражение или имя, соответственно. Пробелы имеют смысл только там, где возможно принятие двух лексем за одну. Точки с запятыми в конце предписания не указываются. На процедуру, реализующую предписание, накладываются следующие ограничения. 1) Это должна быть именно процедура, а не функция, т.к. предписание не выдает результата. Если результат необходим, его следует поместить в какое-нибудь имя, как в примере выше. 2) Она должна иметь столько параметров, сколько переменных полей указано в тексте предписания; поле с номером N соответствует параметру с номером N. 3) Если указывается несколько допустимых вариантов предписания, то они должны содержать одинаковое количество переменных полей, причем соответствующие поля должны иметь один и тот же смысл. 4) Если требуется передать выработанное модулем значение, то в соответствующем поле предписания надо требовать имя и использовать выходные и возвратные пераметры. Если достаточно иметь значение имени или выражения, следует использовать входные параметры. МПИ становится известно системе только после включения исполнителя: ни одна процедура, содержащая предписания исполнителя не будет понята системой, пока он не включен. Такая ситуация может возникнуть, например, при выходе из Редактора по директиве КОНЕЦ ОПИСАНИЯ.
6. СООБЩЕНИЯ СИСТЕМЫ 6.1. Лексические и синтаксические ошибки 6.1.1. Причины возникновения Лексические и синтаксические ошибки - это ошибки в записи программы, т.е. несоблюдение правил построения лексем, выражений и предписаний по синтаксическим диаграммам языка. Ошибки в записи лексем - имен, текстов, чисел, специальных составных символов - называются лексическими. Ошибки при составлении предписаний из отдельных лексем называются синтаксическими. При попытке ввести такое предписание в машину будет выдано сообщение о синтаксической (лексической) ошибке, и программа не выполнится. Такие ошибки возможны в следующих ситуациях. 1) Неверное предписание в основном диалоговом режиме. Строка с ошибкой дублируется от начала предписания, в котором допущена ошибка, до конца строки; причем неправильная лексема выделяется на экране цветом. Затем выдается сообщение о характере ошибки. Чтобы все-таки исполнить предписание, в котором допущена ошибка, необходимо полностью ввести его еще раз. Если ошибка допущена в сложном предписании, то требуется повторить ввод всего этого предписания, исправив ошибку. Это можно сделать с помощью описанных в Приложении 2 средств экранного редактирования в основном диалоговом режиме. 2) Неверное предписание в процедурном блоке. При выходе из Редактора и проверке синтаксиса на экран выдается участок редактируемого текста, в котором начало ошибочной лексемы отмечено курсором. На нижней строке выдается сообщение о характере ошибки. Следует исправить ошибку и повторить выход. 3) Неверная запись данных во время ввода по предписанию ВВОД ДАННЫХ. Если данные вводятся с клавиатуры, то, как и в первом случае, выдается последняя введенная строка с выделенной ошибочной лексемой, а затем - сообщение "ОШИБКА: ПОВТОРИТЕ ВВОД". После этого следует продолжить ввод данных, считая ошибочную лексему переводом строки. При вводе данных из файла выдается только сообщение "ОШИБКА ВВОДА", и ошибка считается ошибкой исполнения программы (см. 2.2, сообщения П14 и П15). 4) Неверное предписание в процедурном блоке, вводимом из ДЗУ по предписаниям ЗАПУСК, ВВОД ИЗ ДЗУ и ВКЛ МОДУЛЬ. В этой ситуации выдается сообщение о характере ошибки, а сама она рассматривается как ошибка исполнения программы. Исправить ошибку можно средствами Редактора. При возниконовении синтаксической (лексической) ошибки текущий режим работы системы не меняется. Вся диагностическая информация поступает в поток системного вывода. 6.1.2. Диагностические сообщения Большинство сообщений имеет вид: ТРЕБУЕТСЯ список лексем Такие сообщения выдаются, когда при анализе очередной лексемы оказалось, что по правилам записи предписания она недопустима. Список состоит из допустимых в данной позиции лексем, но он не всегда точно указывает на те изменения, которые необходимо произвести в программе. Ниже перечислены все возможные диагностики на лексические и синтаксические ошибки и краткие пояснения к ситуациям, в которых они возникают. Лексические ошибки: Л1. ТРЕБУЕТСЯ ЦИФРА ПОСЛЕ ТОЧКИ В записи дробного числа отсутствуют цифры после точки, что недопустимо. Примеры: 10. 25.Е17 Если необходимо записать число с нулевой дробной частью, следует после точки поставить ноль: 10.0 25.0Е17 или 25Е17 Л2. ТРЕБУЕТСЯ ПОКАЗАТЕЛЬ СТЕПЕНИ Ошибка в записи порядка дробного числа: 1Е-А 1.1Е++7 Л3. НЕ ЗАКРЫТ ТЕКСТ Отсутствует закрывающая кавычка текста. Если необходим символ перевода строки внутри текста, то его следует вставить программными средствами, например с помощью функции СИМ. Л4. "_" В КОНЦЕ ИМЕНИ Л5. "__" В ИМЕНИ Такие имена по правилам языка недопустимы. Л6. НЕПОНЯТНЫЙ СИМВОЛ Встретился символ, не входящий в алфавит языка ( % & ^ \ управляющие символы и др.) или подчерк стоит не внутри имени, текста или комментария. Непонятными считаются все управляющие символы, вставленные во вводимую строку. Л7. СЛИШКОМ ДЛИННАЯ ЛЕКСЕМА Длина лексемы - текста, числа, имени - при вводе из файла или при анализе описания процедурного блока больше максимально допустимой. Л8. НЕДОПУСТИМОЕ ДРОБНОЕ Вводится слишком большое, слишком маленькое (по модулю) дробное число или явно задан недопустимый порядок числа: например, хотя число 0.001Е128 возможно, его явно указанный порядок 128 недопустим. Л9. ТРЕБУЕТСЯ "*)" Нет закрывающей скобки комментария в процедурном блоке. Синтаксические ошибки: С1. ТРЕБУЕТСЯ ";" а) неверное начало предписания (не с ключевого слова и не с выражения): )А+Б)*2->С; б) нет ";" между предписаниями или процедурными блоками: а->б вывод:б; в) Начало выражения, которым оканчивается предписание, представляет собой другое правильное выражение, а конец синтаксически неверен: ВЫВОД: (А+В)!(С+Е); КОНТРОЛЬ А>(К+М) ); г) Пропущена запятая в списке элементов (в предписаниях ВКЛ, ВЫКЛ, ВВОД, ВЫВОД, ИМЕНА), например: ВКЛ ПРОКРУТКУ: А,В С,Д; ВЫВОД: А+7, В**2(7-К); С2. ТРЕБУЕТСЯ кл.слово ИЛИ ";" ИЛИ НЕВЕРНО НАЧАЛО ПРЕДПИСАНИЯ С3. ТРЕБУЕТСЯ кл.слово ИЛИ ";" ИЛИ ОШИБКА В КОНЦЕ ПРЕДПИСАНИЯ Ситуация, описанная в С1, возникла в сложном предписании или процедурном блоке; т.е. по диаграмме в текущей позиции допустимо ключевое слово ("КНЦ", "РЕЗ", "ВСЕ") или предписание: ЕСЛИ А>В ТО 1->А ВSЕ; ВЫБОР А ИЗ 1: 1->В В Одно из сообщений выдается в зависимости от того, была ли ";" в конце последнего правильного предписания. С4. ТРЕБУЕТСЯ ИМЯ С5. ТРЕБУЕТСЯ ИМЯ ФАЙЛА В данной позиции предписания должно стоять имя. С6. ТРЕБУЕТСЯ ВЫРАЖЕНИЕ ИЛИ "ИЗ" Ошибка в заголовке предписания ВЫБОР, при которой неизвестно, какая из двух форм этого предписания имелась в виду: ВЫБОР : С7. ТРЕБУЕТСЯ ОПЕРАНД Ошибка в записи операнда одной из операций в выражении. С8. ТАКОГО ПРЕДПИСАНИЯ НЕТ а) В начале предписания стоит выражение, после которого нет знака присваивания или скобок вызова. Других предписаний, начинающихся с выражения, в языке нет. б) Лишнее закрывающее слово предписания (ВСЕ или КНЦ). С9. ТРЕБУЕТСЯ ПРОЦ.БЛОК Нет заголовка описания процедуры или функции "ПРОЦ" или "ФУНК". Диагностика возможна в двух случаях: а) в анализируемом как процедурный блок тексте первая лексема - не "ПРОЦ" и не "ФУНК"; б) после описания очередной процедуры или функции есть еще символьная информация, не являющаяся описанием процедурного блока или комментарием. С10. ТРЕБУЕТСЯ УСТРОЙСТВО В предписаниях переключения вывода ВКЛ/ВЫКЛ ОТЛАДКУ/ВЫВОД/ПРОТОКОЛ не указано направление вывода - "НА БУМАГУ", "НА ЭКРАН" или "В ФАЙЛ имя". С11. НЕВЕРНЫЙ ЗАГОЛОВОК ЦИКЛА Отсутствуют ключевые слова "ОТ" или "ИЗ" в цикле ДЛЯ: ДЛЯ I=5 ДО 7 :: С12. НЕВЕРНЫЙ РЕЖИМ Указан несуществующий режим в предписаниях ВКЛ/ВЫКЛ: ВКЛ СВЕТ; С13. СЛИШКОМ ДЛИННЫЙ СПИСОК Слишком много элементов кортежа, множества, параметров процедуры на вводе. С14. ТАКОЕ ИМЯ УЖЕ БЫЛО Повторение имени в записи, локальных имен и имен параметров процедуры, совпадение имени параметра с локальным именем. С15. Прочие сообщения: ТРЕБУЕТСЯ УСЛОВИЕ ТРЕБУЕТСЯ ВЫРАЖЕНИЕ ТРЕБУЕТСЯ "]" ИЛИ "," ТРЕБУЕТСЯ ":" ИЛИ "," ТРЕБУЕТСЯ "БУМАГУ" ИЛИ "ЭКРАН" ТРЕБУЕТСЯ ">" ИЛИ "," ТРЕБУЕТСЯ "*>" ИЛИ "," ТРЕБУЕТСЯ "$>" ИЛИ "," ТРЕБУЕТСЯ ")" ИЛИ "," ТРЕБУЕТСЯ ")" ТРЕБУЕТСЯ "=" ТРЕБУЕТСЯ ключевое слово ТРЕБУЕТСЯ "::" Смысл этих диагностик легко восстанавливается по контексту и синтаксису предписания. 6.2. Ошибки исполнения программы 6.2.1. Причины возникновения Ошибка исполнения программы - это ситуация, в которой правильное исполнение программы невозможно. Такие ошибки являются обычно следствием неверной обработки данных в программе, что приводит к попыткам выполнения операций над объектами непредусмотренных для данной операции видов, к нарушению области допустимых значений и т.д. Ряд ошибок связан с исчерпанием ресурсов ЭВМ (оперативной и внешней памяти, программных стеков), сбоями ЭВМ и обращением к внешним устройствам. При возникновении ошибочной ситуации исполнение программы прерывается и выдается диагностическое сообщение. Так как ошибка может привести к порче программной среды (засорению памяти, потере отдельных объектов и т.п.), системе приходится выполнять определенные действия по нейтрализации возможных последствий ошибки. Если ошибка возникла при исполнении предписания, введенного в диалоговом режиме, то выдается только диагностическое сообщение. При ошибке в процедурном блоке происходит выход в режим останова по ошибке, и выдается номер строки, в которой она возникла. 6.2.2. Ошибки программиста П1. 0 ** 0 П2. Х / 0 П3. НЕДОПУСТИМОЕ ДРОБНОЕ П4. СЛИШКОМ БОЛЬШОЕ ЦЕЛОЕ Выход за область допустимых значений при арифметических операциях. П5. НЕДОПУСТИМОЕ ЗНАЧЕНИЕ <N> ПАРАМЕТРА <имя> Выход за область допустимых значений при задании параметров стандартных функций. П6. НЕДОПУСТИМЫЕ ОПЕРАНДЫ <операция> Попытка выполнить указанную операцию над объектами непредусмотренных для нее видов, например, сложить число с текстом. Указывается знак операции, имя стандартной процедуры (функции) или слова "ФОРМАТНОГО ВЫВОДА", "ВЫРЕЗКИ", "ЦИКЛА" П7. НЕВЕРНАЯ ДЛИНА ВЫРЕЗКИ Присваивание вырезке (из текста или кортежа) текста или кортежа другой длины: <1,2,3>->А[5:6]; Слева задан кортеж из 3 элементов, справа - из двух. П8. ВЫРЕЗКА НЕВОЗМОЖНА Операция вырезки (выборки) выполняется не над текстом или кортежем; цикл ДЛЯ-ИЗ использован не для текста, кортежа или множества. П9. НЕВЕРНЫЕ ИНДЕКСЫ Неверно заданы индексы в операциях вырезки или выборки: в структуре нет элемента с указанным индексом или начальный индекс больше конечного (в случае вырезки). П10. <имя>: ТЕКСТ - НЕ ЛИТЕРА Параметр указанной стандартной функции, а также первый операнд операции "ИЗ" не являются односимвольными текстами (литерами). П11. В ЗАПИСИ НЕТ ПОЛЯ <имя> Попытка обращения к несуществующему полю записи: <$А:1,В:2$>.Е П12. ВЫЗЫВАЕТСЯ НЕ ПРОЦЕДУРА П13. ВЫЗЫВАЕТСЯ НЕ ФУНКЦИЯ Вызов процедуры или функции используется над объектом другого вида. П14. ВЫХОД НЕ ИЗ ПРОЦ/ФУНК Предписание ВЫХОД (не директива!) выполнено в основном диалоговом режиме: # ЕСЛИ А>1 ТО ВЫХОД ВСЕ; П15. ВЫ НЕ В РЕЖИМЕ ПРИОСТАНОВА Исполнение директив ПУСК, ШАГ, ВЫХОД не из режима приостанова, а также исполнение директивы ВЫХОД не из режима останова по ошибке запрещены. Текущий режим указывается в информационной строке экрана. П16. НЕВЕРНОЕ ЧИСЛО ПАРАМЕТРОВ Число фактических параметров процедуры (функции) не соответствует числу ее формальных параметров. П17. НЕВЕРНО КОНТРОЛЬНОЕ УСЛОВИЕ Не выполнено условие в предписании КОНТРОЛЬ. П18. ОШИБКА ВВОДА Отказ от ввода по предписанию ВВОД: первый символ вводимой строки (или после разделителя при вводе данных) - это символ останова (клавиша "F1"). Это же сообщение выдается при любой ошибке во время ввода из файла. П19. ОШИБКА: ПОВТОРИТЕ ВВОД Синтаксическая или лексическая ошибка при вводе с клавиатуры по предписанию ВВОД. Выдается последняя введенная строка, в которой ошибочная лексема выделена, а затем - данное сообщение. Происходит повторный запрос, на который надо ввести невоспринятые данные, обращая внимание на соблюдение синтаксических правил их записи; ошибочная лексема при этом считается переводом строки. При аналогичной ошибке во время ввода данных из файла выдается только сообщение "ОШИБКА ВВОДА" (П18) без повторного запроса. П20. СЛИШКОМ МНОГО КОПИЙ Слишком много копий процедуры, функции, файла. Копии этих объектов создаются при использовании их в присваиваниии и формирователях составных объектов. П21. СЛИШКОМ СЛОЖНАЯ СТРУКТУРА Слишком много элементов или слишком большая вложенность во вводимом кортеже или множестве. П22. ИМЯ ЗАЩИЩЕНО П23. ПРИСВАИВАНИЕ <имя> ЗАПРЕЩЕНО Присваивание нового значения имени, имеющему полную или абсолютную защиту. Такими именами являются: - имя процедуры (функции) во время ее вызова (абсолютная защита), - имя процедуры (функции) в режиме ее приостанова (абсолютная), - параметры циклов ДЛЯ (абсолютная), - имя, участвующее в операции во время вычисления последующих операндов (абсолютная), - имя, защищенное по предписанию ВКЛ ЗАЩИТУ (полная), - имя, имеющее частичную защиту, если на запрос о разрешении присваивания ему был дан отрицательный ответ. П24. <имя> СИСТ. ЗАЩИЩЕНО Попытка изменить защиту или признак контроля абсолютно защищенного имени. П25. НЕВЕРНЫЙ ТИП ПЕРЕДАЧИ ПАРАМЕТРА В качестве возвратного или выходного параметра в процедуру передается значение, а не имя (вырезка, выборка, доступ к полю записи) - оно неспособно принять возвращаемое процедурой значение. П26. ИМЯ ФАЙЛА - НЕ ТЕКСТ В предписаниях ОТКРЫТЬ-КАК, СТЕРЕТЬ, ОТПЕРЕТЬ, ЗАПЕРЕТЬ в поле имени файла указано не текстовое значение. П27. ФАЙЛ ОТКРЫТ Попытка уничтожения, смены защиты, повторного открытия открытого файла. Перед выполнением предписаний ОТКРЫТЬ, СТЕРЕТЬ, ОТПЕРЕТЬ, ЗАПЕРЕТЬ следует закрыть файл, если он открыт. П28. НЕВЕРНЫЙ ТИП ФАЙЛА Попытка доступа к нетекстовому файлу (текстовые файлы обозначаются литерой "Т" в каталоге файлов). П29. СЛИШКОМ МНОГО ОТКРЫТЫХ ФАЙЛОВ В данный момент открыто максимально допустимое число файлов, сделана попытка открыть еще один. Сообщение выдается при выполнении предписания ОТКРЫТЬ. Файл в этом случае не открывается. П30. ФАЙЛ НЕ ОТКРЫТ Попытка обработки закрытого файла или нефайлового объекта операциями и предписаниями файловой системы. К ним относятся: - переключение ввода, вывода, отладки, протокола на файл: ВКЛ/ВЫКЛ, - установка позиции указателя файла: ПОЗИЦИЯ , - функции ЧТФ и КФ, - определение позиции указателя: @ , - закрытие доступа к файлу. Перед выполнением требуемых действий следует открыть файл. П31. ФАЙЛ имя ЗАКРЫТ НА ЗАПИСЬ П32. ФАЙЛ ЗАПЕРТ Запись в защищенный внешний файл или его уничтожение. Первое сообщение выдается, если такой файл открыт и сделана попытка вывода в него. Второе - при записи в него из Редактора или при попытке уничтожения. П33. ФАЙЛ НЕ НАЙДЕН Попытка уничтожения, изменения защиты несуществующего внешнего файла. В Редакторе, кроме того, это сообщение выдается при считывании несуществующего файла. Редактируемый текст при этом не портится. П34. КОНЕЦ ДАННЫХ В <имя> При чтении из файла или перемещении его указателя считан символ "конец файла". Ошибка возможна при исполнении предписаний ПОЗИЦИЯ, ВВОД ИЗ ФАЙЛА, функции ЧТФ. П35. НЕВЕРНАЯ ПОЗИЦИЯ УКАЗАТЕЛЯ <имя> Обращение к предписанию ПОЗИЦИЯ с отрицательным, нулевым или большим, чем 2**24, номером позиции указателя файла. Указатель при этом не перемещается. П36. СЛИШКОМ БОЛЬШОЙ ФАЙЛ Считываемый файл не помещается в рабочую память Редактора. Считывается столько информации, сколько позволяет память, а оставшаяся ее часть обрезается. Следует не допускать такой ситуации и хранить текст в нескольких файлах допустимого для обработки из Редактора размера. П37. ПЕРЕСТАВЛЕН ДИСК Переставлен диск при наличии в системе незакрытых файлов, что недопустимо. Следует установить тот диск, на котором были открыты файлы, чтобы дать возможность системе вести с ними нормальный обмен. Если необходимо все же сменить диск, следует сначала закрыть все открытые файлы и лишь потом вынуть диск из дисковода. Для нейтрализации возможных последствий ошибки и для сохранения накопленной информации отключаются все потоки ввода и вывода, настроенные на файл, при обращении к которому произошла эта ошибка. Указатель файла не перемещается. П38. ДИСК ЗАКРЫТ НА ЗАПИСЬ Попытка записи на защищенный диск (без прорези). Если диск не защищен специально, то, скорее всего, он не проинициализирован, т.е. на нем отсутствует необходимая для хранения данных разметка. В этом случае следует сделать прорезь и разметить диск программой ФОРМАТ с системного диска (см. 5.4.1). Примечание. Ошибки, описанные в П37 и П38, являются специфичными для работы с дисководами ЕС-5089 в версиях до А1.3. В версиях системы на других ЭВМ или использующих другие типы ДЗУ возможны другие правила обмена и другие ошибочные ситуации. П39. СЛИШКОМ МНОГО МОДУЛЕЙ Предпринята попытка включить 17-й модуль. Примечание: здесь и ниже вместо модуля может упоминаться исполнитель, если ошибка произошла в Робике. П40. МОДУЛЬ УЖЕ ВКЛЮЧЕН Попытка повторного включения работающего модуля. П41. ТАКОГО МОДУЛЯ НЕТ Сделана попытка обратиться к несуществующему модулю, т.е. - выключить его, - обратиться к имени этого модуля. П42. МОДУЛЬ В РАБОТЕ Сделана попытка выключить модуль, одна из процедур которого находится в режиме приостанова. П43. ТАКОГО ИМЕНИ НЕТ В МОДУЛЕ Обращение к имени модуля, которое не было описано в нем, как доступное. П44. ИМЯ НЕ ОПИСАНО Одна из процедур, находящихся в файле с описанием модуля, не упомянута в списке имен модуля. П45. ВЫХОД ЗА ГРАНИЦЫ ЭКРАНА Неверно указаны координаты точки экрана. П46. ПЕРЕПОЛНЕН ПОТОК ВЫВОДА Выводимая информация одного из потоков вывода (программного, отладочного или системного) поступает на слишком большое количество устройств вывода; ошибка возникает при исполнении предписания ВКЛ, подключение вывода к указанному устройству в этом случае не производится. 6.2.3. Ошибки программной среды (системные) Описываемые ниже ошибки связаны с исчерпанием ресурсов системы, обеспечивающих ее работу и работу пользователя. Набор этих ошибок зависит только от реализации системы на конкретной ЭВМ. S1. ОШИБКА ОБМЕНА С ДЗУ Является следствием неудачной попытки считывания или записи информации. Наиболее распространены следующие ситуации возникновения: - не закрыт дисковод; - не размечен диск; следует воспользоваться программой начальной разметки. - нет диска в дисководе; - испорчена часть информации на диске; можно попытаться восстановить ее с помощью программы КОПИТРЕК на системном диске (или хотя бы защитить испорченную часть диска от повторных обращений). Предвидя такие ошибки, следует всегда иметь копии всех рабочих файлов; - неисправен дисковод. Если ошибка обмена произошла при вводе из файла, выводе в него или смещении указателя, все потоки ввода и вывода, настроенные на этот файл, отключаются. S2. ИСЧЕРПАНА ПАМЯТЬ Не хватает места в ОЗУ для хранения программы или данных пользователя, а также для работы самой системы. Рекомендации: - перевызвать систему; - уничтожить ненужные в данный момент процедуры и другие значения имен присваиванием их пустых значений; - соптимизировать программу за счет констант, числа предписаний и т.п.; - сделать некоторые блоки программы нерезидентными, т.е. загружать их из ДЗУ по мере надобности и уничтожать после использования. Если ошибка все равно возникает, значит задача в данной версии системы при выбранном алгоритме и организации данных не может быть решена. S3. ПЕРЕПОЛНЕНИЕ СТЕКА Слишком большая вложенность кортежей и множеств, длинные списки, большая глубина рекурсии. Следует иметь в виду количественные характеристики системы. В результате возникновения этой ошибки во время исполнения программы возможно частичное засорение памяти. S4. СТЕК ПУСТ Системная ошибка, возникающая обычно при выходе из режимов приостанова и останова по ошибке, процедур и функций, при обработке структур. Если ошибка повторяется после перевызова системы при повторном запуске, следует попытаться изменить программу. S5. СЛИШКОМ МНОГО ИМЕН В данный момент в системе известно максимально допустимое число имен. Следует перевызвать систему, чтобы избавиться от ненужных имен, или использовать уже известные имена. S6. НЕТ МЕСТА В ДЗУ Следует уничтожить ненужные файлы или использовать другой диск, закрыв предварительно все открытые файлы. При этой ошибке отключается весь ввод и вывод, настроенные на файл, при обмене с которым она возникла.
ПРИЛОЖЕНИЕ 1 СИНТАКСИЧЕСКАЯ СВОДКА РАПИРЫ При описании синтаксиса используются следующие обозначения: 1. Строчными буквами записаны ключевые слова; 2. Прописными буквами - названия вспомогательных диаграмм (с номерами); 3. [ ... ] - необязательные элементы; 4. { ... } - повторяющиеся элементы (без разделителя); 5. { ... }через; - повторяющиеся хотя бы один раз элементы (с указанием разделяющего знака, если надо); 6. ... - перенос диаграммы на другую строку; 7. Возможные варианты записываются в столбик. 8. Настоящие скобки [ ] обозначены '[' и ']' . Ключевые слова: БПС БУМАГУ В ВИДА ВВОД ВКЛ ВСЕ ВСЕХ ВЫБОР ВЫВОД ВЫКЛ ВЫХОД ДАННЫХ ДЗУ ДЛЯ ДО ЗАКРЫТЬ ЗАПЕРЕТЬ ЗАПУСК ЗАЩИТУ И ИЗ ИЛИ ИМЕН ИМЕНА ИНАЧЕ КАК КАТАЛОГ КНЦ КОНТРОЛЬ МЕНЮ МОДУЛЬ НА НЕ ОТ ОТКРЫТЬ ОТЛАДКУ ОТПЕРЕТЬ ПОВТОР ПОЗИЦИЯ ПОКА ПРОКРУТКУ ПРОТОКОЛ ПРОЦ ПУСК РАЗ РАЗА РАПИРА РЕЗ РОБИК СЛЕД СТЕРЕТЬ СТОП СТРОК ТЕКСТОВ ТО ФАЙЛ ФАЙЛА ФАЙЛОВ ФУНК ЧАСТ ШАГ ЭКРАН 1.Программа: { процедурный_блок37 ; } директива2 2.Директива: универсальное_предписание3 РОБИК РАПИРА ПУСК ШАГ ВЫХОД 3.Универсальное предписание: вызов_процедуры18 присваивание17 условное22 выбор23 цикл25 вывод28 ввод31 контроль24 стоп26 выход27 включить35 выключить35 каталог34 запуск33 файловое36 пустое4 4.Пустое: 5.Комментарий: (* [ {литера} ] *) пс 6.Целое: {цифра} 7.Дробное: целое6 . целое6 [ Е [-] целое6 ] [+] целое6 Е [-] целое6 [+] 8.Текст: " [ {литера,кроме"} ] " 9.(Простое) имя: буква [ { [_] буква } ] цифра 10.(Составное) имя: имя9 { ' имя9 } 11.Уточнение: . имя9 '[' { выр16 [ : выр16 ] }через, ']' 12.Уточненное имя: имя10 [ {уточнение11} ] 13.Бинарные операции: + - * / // ** 14.Формирователь: < [ {выр16}через, ] > <* [ {выр16}через, ] *> <$ { имя9 : выр16 }через, $> 15.Вызов: ( [ {выр16}через, ] ) 16.Выражение: [-] [#] формир14 [ { уточ.11 } ] [ бин.оп13 выр16 ] [@] целое6 вызов15 дробное7 текст8 имя10 ( выр16 ) 17.Присваивание: выр16 -> уточ.имя12 18.Вызов процедуры: выр16 вызов15 19.Условие: [ {НЕ} ] выр16 оп.срав20 выр16 [ ИЛИ условие19 ] И 20.Операции сравнения: > < >= <= = /= ВИДА ИЗ 21.Список предписаний: {универ.предписание3}через; 22.Условное предписание: ЕСЛИ усл19 ТО список21 [ ИНАЧЕ список21 ] ВСЕ 23.Выбор: ВЫБОР ИЗ { усл19 : список21 }через! ... ... [ ИНАЧЕ список21 ] ВСЕ ВЫБОР выр16 из { {выр16}через, : список21 }через! ... ... [ ИНАЧЕ список21 ] ВСЕ 24.Контроль: КОНТРОЛЬ усл19 25.Цикл: заголовок :: список21 ВСЕ заголовок: ПОКА усл19 ПОВТОР выр16 [РАЗА] [РАЗ] ДЛЯ имя9 ОТ выр16 ДО выр16 [ ШАГ выр16 ] ДЛЯ имя9 ИЗ выр16 26.Стоп: СТОП 27.Выход: ВЫХОД 28.Вывод: ? { выр16 [ : формат30 ] }через, ВЫВОД [куда29] [БПС] : 29.Направление вывода: НА ЭКРАН НА БУМАГУ В [ФАЙЛ] имя10 30.Формат: выр16 [ : выр16 ] 31.Ввод: ВВОД ИЗ ДЗУ : { уточ.имя12 }через, [откуда32] [ТЕКСТОВ] [ДАННЫХ] 32.Направление ввода: ИЗ [ФАЙЛА] имя10 33.Запуск: ЗАПУСК имя9 34.Каталог: КАТАЛОГ [ФАЙЛОВ] [куда29] [ВСЕХ] ИМЕН 35.Включить и выключить (разрядкой - только для ВКЛ): В[Ы]КЛ ВЫВОД [куда29] ОТЛАДКУ [куда29] ПРОТОКОЛ [куда29] ВВОД [откуда32] [ Ч А С Т ] ЗАЩИТУ [ИМЕН] : {имя9}через, ПРОКРУТКУ [ИМЕН] : {имя9}через, СЛЕД [СТРОК] МОДУЛЬ имя9 М Е Н Ю 36.Файловое предписание: ОТКРЫТЬ [ выр16 КАК ] имя9 ЗАКРЫТЬ [ имя9 ] ПОЗИЦИЯ выр16 = выр16 ЗАПЕРЕТЬ выр16 ОТПЕРЕТЬ выр16 СТЕРЕТЬ выр16 37.Процедурный блок: описание_процедуры38 описание_функции39 38.Описание процедуры: ПРОЦ имя9 [ ( [ {параметр_проц41}через, ] ) ] ; ... ... [объявление_имен40 ; ] список21 КНЦ 39.описание функции: ФУНК имя9 [ ( [ {параметр_функ42}через, ] ) ] ; ... ... [объявление_имен40 ; ] список21 РЕЗ: выр16 [;] КНЦ 40.Объявление имен: ИМЕНА: {имя9}через, 41.Формальный параметр процедуры: [=>] имя9 имя9 => <=> имя9 42.Формальный параметр функции: [=>] имя9 43.Описание модуля: имена_модуля44 ; ... ... [ СТАРТ: имя9 ; ] [ ФИНИШ: имя9 ; ] ... ... [описание_МПИ45] {проц.блок37}через; 44.Имена модуля: ИМЕНА: { имя9 [ДОСТУПНО] }через, 45.Описание множества предписаний исполнителя: '[' { имя9 : { ' вид_предп46 ' }через, }через; ']' 46.Вид предписания РОБИКА (слово=имя9): слово { [ : ] слово } , <ИМЯ> <ВЫР>
ПРИЛОЖЕНИЕ 2 КОДИРОВКА СИМВОЛОВ 1. Символы и их обработка Символ - это единица текстовой информации в машине. Существует 256 различных символов, Каждый символ имеет код - целое число от 0 до 255. Некоторые символы имеют стандартное изображение на устройствах ввода и вывода: буквы, цифры, знаки и т,д. При поступлении символов с устройства ввода или на устройство вывода системой могут выполняться перекодировка одних символов в другие и некоторые дополнительные действия. В разных системах программирования, а также в разных режимах работы одной системы они могут различаться (ср. Редактор и режим прямого диалога). Поскольку обычно ввод сопровождается отображением на экране, ряд символов несет функциональную нагрузку и на вводе, и на выводе. 2. Ввод с клавиатуры Клавиатура "Агата" обеспечивает ввод символов на 3 регистрах: основном (одиночно нажатые клавиши), регистрах РЕГ и УПР. при этом основным регистром может быть либо РУС, либо ЛАТ. Нажатие любой клавиши, кроме СБР и ПВТ, на одном из этих регистров вызывает ввод в машину некоторого символа. В Таблице 2.1 приведены коды клавиш с учетом перекодировки на вводе в системе "Школьница". Особенности ввода с клавиатуры: а) пробел и функциональные клавиши "нечувствительны" к регистрам и выдают один и тот же символ; б) на регистр "УПР" реагируют только алфавитные клавиши; коды всех функциональных клавиш совпадают с кодами некоторых букв на регистре "УПР" (например, перевод строки и "УПР-М"); в) клавиатура обеспечивает ввод не всех 256 символов; это может быть удобным в программах, где требуются зарезервированные символы, которые нельзя ввести с клавиатуры; Символы (клавиши), которые несут дополнительную функциональную нагрузку на вводе, приведены в таблице 2.3. 3. Использование символов в программе Алфавит языка РАПИРА содержит ограниченный набор символов, но в составе текстов могут встречаться все 256 символов. Задать в программе символ, который не вводится с клавиатуры, можно по его коду с помощью стандартной функции АЛФ. Определить код символа можно с помощью стандартной функции КОД. В текстовый файл можно вывести любой символ, кроме символа с кодом 0, - он считается признаком конца файла. При попытке его вывода он заменяется символом с кодом 135. 4. Вывод на экран и принтер Вывод символа на экран и бумагу заключается в формировании изображения, сооветствующего этому символу, по таблице знакогенератора машины или принтера. При выводе некоторых символов выполняются дополнительные действия (Таблица 2.3), например, управление цветом выдаваемых символов и курсором, очистка экрана и др. Это позволяет управлять выводом на экран, вставляя в выводимые программой тексты символы переключения. При выводе на бумагу изображение некоторых символов может не совпадать с их изображением на экране. Графическая процедура отрисовки текстов ТКС использует собственную таблицу изображений символов, которую можно программно редактировать (Приложение 4, программа АЛФАВИТЫ). 5. Нестандартное использование клавиатуры. Принятая в системе и описанная в разделе 3.5 руководства функциональная нагрузка символов не является единственно возможной. Можно организовать диалог программы с пользователем через стандартную функцию КЛАВ, которая запрашивает с клавиатуры символ и возвращает в качестве результата его код, но не выводит сам символ. Все дополнительные действия в этом случае организуются программно. Иное использование клавиатуры принято, например, в Редакторе (Таблица 2.4).
Таблица 2.1. Коды клавиш. Клав. Одна РЕГ УПР ! Клав. Одна РЕГ УПР ----------------------------------------------- ;+ 187 171 187 ! Ч^ 254 222 - 1! 177 161 177 ! Ш[ 251 219 - 2" 178 162 178 ! Щ] 253 221 - 3# 179 163 179 ! Ъ_ 255 233 - 4$ 180 164 180 ! ЫY 249 217 - 5% 181 165 181 ! ЬХ 248 216 - 6& 182 166 182 ! Э\ 252 220 - 7' 183 167 183 ! Ю@ 224 192 128 8( 184 168 184 ! ЯQ 241 209 - 9) 185 169 185 ! /? 175 191 175 0 176 160 176 ! .> 174 190 174 -= 173 189 173 ! ,< 172 188 172 АА 193 193 129 ! :* 186 170 186 БВ 226* 194* 130 !ПРОБЕЛ 160 160 160 ВW 194 215 - ! ф. 1 144 144 144 ГG 231 199 135 ! ф. 2 145 145 145 ДD 228 196 132 ! ф. 3 146 146 146 ЕЕ 197 197 133 ! ф. 4 147 147 147 ЖV 246 214 - ! ф. 5 148 148 148 ЗZ 250 218 - ! ф. 6 156 156 156 ИI 233 201 137 ! ф. 7 157 157 157 ЙJ 234 202 138 ! ф. 8 158 158 158 КК 203 203 139 ! ф. 9 159 159 159 ЛL 236 204 140 ! ф. 0 129 129 129 ММ 205 205 141 ! ф. . 130 130 130 НN 200 206 142 ! ф. = 131 131 131 ОО 207 207 143 ! F1 132 132 132 ПР 240 208 - ! F2 133 133 133 РR 208 210 - ! F3 134 134 134 СS 195 211 - ! ~ 153 153 153 ТТ 212 212 - ! 154 154 154 УU 245 213 - ! -> 149 149 149 ФF 230 198 134 ! <- 136 136 136 ХН 216 200 136 ! РЕД 155 155 155 ЦС 227 195 131 ! 141 141 141 ----------------------------------------------- * Ввод зависит от положения регистра РУС-LАТ на клавиатуре. При его переключении для буквенных клавиш первую и вторую колонки надо поменять.
Таблица 2.2. Вывод символов на экран Код! 160 176 192 208 224 240 ----------------------------- 0 ! 0 @ Р Ю П ! 1 ! ! 1 А Q А Я ! 2 ! " 2 В R Б Р ! 3 ! # 3 С S Ц С ! 4 ! $ 4 D Т Д Т ! 5 ! % 5 Е U Е У ! 6 ! & 6 F V Ф Ж ! 7 ! ' 7 G W Г В ! 8 ! ( 8 Н Х Х Ь ! 9 ! ) 9 I Y И Ы ! 10 ! * : J Z Й З ! 11 ! + ; К [ К Ш ! 12 ! , < L \ Л Э ! 13 ! - = М ] М Щ ! 14 ! . > N ^ Н Ч ! 15 ! / ? О _ О Ъ ! ----------------------------- Символы с кодами 128-159 (управляющие) на экран не выдаются. Их действия при выводе см. в Таблице 2.3. Символы с кодами 0-127 выводятся так же, как символы с кодами 128-255.
Таблица 2.5. Управляющие символы. Код Клав Время Действие --------------------------------------------------------- 129 0 выв Уст. выдачу нормальных символов 130 . выв Уст. выдачу инверсных символов 131 = выв Уст. выдачу мигающих символов 132 F1 вв Останов или прерывание 133 F2 вв Сдвиг остатка строки влево на 1 позицию 134 F3 вв Сдвиг остатка строки вправо на 1 позицию 135 УПР-G выв Звуковой сигнал 136 <- выв Сдвиг курсора к предыдущему символу вв Уничтожение последнего введенного символа 138 УПР-J выв Переход к началу следующей строки 140 УПР-L выв Очистка текстового окна экрана 141 выв Переход к началу следующей строки вв Конец строки ввода 144 1 выв Уст. красный цвет выдачи 145 2 выв Уст. зеленый цвет выдачи 146 3 выв Уст. желтый цвет выдачи 147 4 выв Уст. синий цвет выдачи 148 5 выв Уст. фиолетовый цвет выдачи 149 -> выв* Сдвиг курсора к следующему символу вв Ввод текущего символа с экрана 150 УПР-V вв Вставка упр. символа во вводимую строку 152 УПР-Х вв Отказ от вводимой строки 153 вверх выв* Сдвиг курсора на строчку вверх 154 вниз выв* Сдвиг курсора на строчку вниз 155 РЕД вв Уст. режим свободного перемещения 156 6 выв Уст. голубой цвет выдачи 157 7 выв Уст. белый цвет выдачи вв Перекл. текстовой и графической страниц 158 8 выв Очистка остатка тек. строки (внутри окна) 159 9 выв Очистка остатка экрана (внутри окна) --------------------------------------------------------- * те же действия на вводе в режиме РЕД.
Таблица 2.7. Управляющие клавиши Редактора. --------------------------------------------------------- "вверх" \ "вниз" > Перемещение курсора по экрану -> / <- / пер.строки режим редактирования: вставка новой строки режим меню: конец ответа на запрос и выбор директивы 1 Уничтожить текущий символ 2 Начать вставку символов 3 Перейти к началу следующей строки текста 4 Показать предыдущую страницу текста 5 Показать следующую страницу текста 6 Центрировать текущую строчку 7 Склеить текущую строку текста со следующей 8 Обрезать остаток текущей строки текста 9 Уничтожить текущую строку текста F3 Найти очередное вхождение запомненного текста F2 Переключение режимов показа текста F1 Отказ от запроса в меню РЕД Переходы режим: редактирования <-> режим меню УПР-V Вставка в текст управляющего символа УПР-А при задании текста для поиска: в данной позиции допустим любой символ ---------------------------------------------------------
ПРИЛОЖЕНИЕ 3 СТАНДАРТНЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ РАПИРЫ В РАПИРЕ есть набор стандартных процедур и функций. В отличие от процедур и функций, описываемых пользователем, они постоянно находятся в памяти, а потому не нуждаются в описании и загрузке. Стандартные процедуры и функции изначально присвоены некоторым именам, которые имеют абсолютную защиту (чтобы случайно не потерять доступ к системной программе) и не выдаются в каталоге имен (чтобы не загромождать его). В остальном они обладают всеми свойствами процедур и функций языка. При описании используются следующие обозначения параметров: Х - произвольное число (целое или дробное), N - целое число от 0 до 255, А - целое число от 0 до 65535, Н - число 1 или 2, Т - произвольный текст, Л - литера (односимвольный текст), Ф - открытый файл, П - произвольный объект. Кх,Ку - координаты: целые числа, задающие координаты реальной точки экрана после выполнения необходимого пересчета оносительно начала координат и масштабов (где допускается). Пустыми скобками обозначается процедура (функция) без параметров. 1. Функция АВS(Х) Результат - модуль числа Х. 2. Функция ЦЕЛЧ(Х) Результат - целая часть числа Х (для целого числа - само это число). 3. Функция SQRТ(Х) Результат - квадратный корень неотрицательного Х. 4. Функция ДСЧ() Результат - случайное число из промежутка [0;1[ (выдаются только числа, кратные 1/65536). 5. Функция КОД(Л) Результат - код символа, представленного литерой Л. 6. Функция АЛФ(N) Результат - символ (литера) с кодом N. 7. Функция ФТЕКСТ(А,Л) Результат - текст длины А, состоящий из литер Л. 8. Функция ФКОРТ(А,П) Результат - кортеж, состоящий из А элементов П. 9. Функция КФ(Ф) Результат - литера "Д", если в текущей позиции файла Ф находится символ "конец файла", "Н" - в противном случае. 10. Функция ЧТФ(Ф,N) Очередные N символов считываются из файла Ф, оформляются в виде текста и выдаются в качестве результата. Позиция указателя файла Ф сдвигается на N символов к концу файла; при исполнении функции возможна ситуация "встретился конец файла". 11. Функция КЛАВ() Ожидает нажатия клавиши на клавиатуре, результат - введенный символ (литера). Во время ожидания ввода в текущей позиции вывода на экране появляется мигающий курсор. 12. Функция НАЖАТО() Опрашивает строб клавиатуры, выдает находящийся в нем символ (в виде литеры) или пустой текст, если его нет. Примечание: строб клавиатуры - это буферная область емкостью в один символ, через которую осуществляется ввод с клавиатуры в ЭВМ. Каждая нажатая клавиша записывает в строб символ, незавимо от того, ожидает машина ввода или нет. После анализа очередного символа системой строб очищается. Данная функция позволяет, например, организовывать обрабатываемые прерывания в программе по нажатию определенной клавиши. 13. Функция РУЧКА(Н) Выдает состояние потенциометра с номером Н в виде целого числа от 0 до 255. 14. Функция КНОПКА(Н) Результат - литера "Д", если была нажата кнопка на потенциометре с номером Н, "Н" - в противном случае. 15. Процедура ПАУЗА(N) Организует задержку исполнения программы на N/10 сек. 16. Процедура ЗВОН() Выдает звуковой сигнал (звонок). 17. Процедура ЗВУК(N1,N2) Выдает звуковой сигнал, зависящий от частоты N2 и длительности N1. 18. Процедура ПРИГЛ(Л) Устанавливает новое приглашение ко вводу для предписания ВВОД; будет выдаваться литера, переданная параметром процедуры. Чтобы избавиться от приглашения, следует указать любой управляющий символ, не несущий функциональной нагрузки при выводе, например, УПР-О (см. Приложение 2). 19. Процедура ДЗУ(Н) Устанавливает текущим активным ДЗУ дисковод с номером Н. В конфигурации ЭВМ "Агат" с одним дисководом использование этой процедуры не имеет смысла. 20. Процедура ОКНО(Кх1,Ку1,Кх2,Ку2) Устанавливает на текущей текстовой страницы окно для ведения диалога одна из диагоналей которого задается координатами (Кх1,Ку1) и (Кх2,Ку2) (здесь координаты абсолютные и измеряются в символах текущего текстового режима от левого нижнего угла экрана вправо и вверх, начиная с нуля). 21. Функция ОКСИМ(Кх,Ку) Результат - символ (литера), изображенный на экране в позиции с координатами Кх и Ку. Отсчет координат ведется в символах от левого нижнего угла текстового окна вправо (Кх) и вверх (Ку), начиная с нуля. Если позиция символа с указанными координатами находится вне окна, выдается сообщение об ошибке. 22. Процедура ПОЗ(Кх,Ку) Перемещает курсор (текущую позицию вывода) к символу окна с указанными координатами. Значения координат не должны превышать соответствующих размеров окна. 23. Процедура РЖМ(Т) Управляет организацией графики и диалога в текстовом и графических режимах. Т - текст, представлящюий собой список управляющих команд (см. также 5.9). * Формат текста: <к1>,<к2>,...,<кN> ,где <кi> - команды Формат команды: <а><д1>...<дN> ,где <а> - адресуемая страница и режим: Т1...Т5 - 5 цветных символьных страниц, У1...У5 - 5 нецветных символьных страниц, Н1...Н5 - 5 страниц графики низкого разрешения, С - страница графики среднего разрешения, В - страница графики высокого разрешения; <дi> - действия с указанной страницей: О - очистка, П - показ, Д - переключение диалога (только для символьных режимов) и показ Г - переключение графики, К - комбинирование с текущей текстовой страницей и показ. Например: РЖМ("Т1Д,СГОП") - установить диалог на первую текстовую страницы в цвеыном режиме, переключиться на среднюю графику, очистить и показать ее страницу. 24. Процедура ЦВЕТ(N) Устанавливает текущий цвет рисования в графическом режиме. В несимвольных режимах имеют смысл следующие значения N: 0 - черный 8 - черный 1 - красный 9 - коричневый 2 - салатный 10 - зеленый 3 - желтый 11 - хаки 4 - синий 12 - темно-синий 5 - сиреневый 13 - фиолетовый 6 - голубой 14 - бирюзовый 7 - белый 15 - серый 120-123 - включение палитры 128-254 - реверсный к текущему 255 - пустой в цветном символьном: 0-7 инверсные символы и далее через 16 8-15 мерцающие символы и далее через 32 24-31 нормальные символы и далее через 32 в нецветном символьном режиме цвет (символ) задается процедурой СИМРИС. 25. Процедура СИМРИС(Л) Устанавливает символ, которым будут рисоваться точки и линии в символьных графических режимах. 26. Процедура ОТСЧЕТ(Кх,Ку) Устанавливает новое начало координат текущего графического режима в точку с указанными координатами. Здесь координаты абсолютные, т.е. измеряются в точках текущего графического режима вправо и вверх от левого нижнего угла экрана. 27. Процедура МТБ(Nх,Nу) Устанавливает масштабы по осям координат в текущем графическом режиме. Масштабы задаются в 256-х долях реального размера (т.е. каждая координата рисуемого объекта умножается на N/256); 0 обозначает отсутствие масштабирования по данной оси. Изометрическое изображение в несимвольных графических режимах достигается масштабированием МТБ(154,0); 27. Процедура ТЧК(Кх,Ку) Ставит точку ("кирпичик") текущего установленного цвета в точку графического поля с указанными координатами. Координаты Кх и Ку - логические, т.е. определяются размерами экрана (в точках) в том или ином графическом режиме, текущим началом координат и масштабами по осям. 28. Функция ЭКЦВ(Кх,Ку) Результат - цвет точки или символа на экране в текущем графическом режиме. Координаты - логические. 29. Процедура ЛИН(Кх1,Ку1,Кх2,Ку2) Рисует на экране линию с логическими координатами концов (Кх1,Ку1) и (Кх2,Ку2). 30. Процедура ДУГА(Кх,Ку,Rх,Rу,нач,кон) Рисует на экране дугу эллипса с центром в (Кх,Ку), радиусами (Rх,Rу) от угла 'нач' до угла 'кон' против часовой стрелки. 31. Процедура ПРЯМ(Кх1,Ку1,Кх2,Ку2) Рисует прямоугольник, одна из диагоналей которого задана логическими координатами (Кх1,Ку1) и (Кх2,Ку2). 32. Процедура ОБЛ(Кх,Ку) Заполняет текущим цветом связную одноцветную область экрана, содержащую указанную точку. 33. Функция АДРЧ(А) Выдает содержимое ОЗУ по адресу А в виде целого числа от 0 до 255. RВнимание!R Пользоваться этой функцией и двумя описанными ниже процедурами следует чрезвычайно осторожно, зная структуру ОЗУ машины. В противном случае возможны сбои системы и даже порча интерпретатора. 34. Процедура АДРЗ(А,N) Записывает в байт по адресу А число N. 35. Процедура АДРВЫЗ(А) Исполняет программу в кодах машины, начинающуюся по адресу А. Данная процедура позволяет использовать, например, программы, записанные пользователем в свободную часть ОЗУ. Однако в системе работа с программами в кодах не поддерживается. 36. Процедура ТКС(...) Описана в 5.9.3.
ПРИЛОЖЕНИЕ 4 КОМПЛЕКТУЮЩИЕ ПРОГРАММЫ Настоящее приложение содержит краткие руководства по пакетам программ, поставляемым в пакете "Школьницы" на диске Ш1. Эти программы имеют следующие назначения: - ИНСТР выводит на экран или бумагу настоящую инструкцию или указанные ее элементы; - ФУНКЦИИ предоставляет для пользователя на языке РАПИРА набор тригонометрических и показательных функций; - СТАТ выводит на экран статистику по типам ошибок, допущенных в течении сеанса (после последнего запуска интерпретатора); - МУРАВЕЙ реализует исполнителя "муравей" для РОБИКА; - ЗАД1МУР и РЕШ1МУР служат примерами начальной обстановки и программы для исполнителя "муравей"; - МАШИНИСТ, МАШ_НАЗАД, МАШ_ПРИЦЕП реализуют исполнителя "машинист" для РОБИКА; - ЗАД1МАШ и РЕШ1МАШ служат примерами начальной обстановки и программы для исполнителя "машинист"; - АРИФ реализует арифметические предписания для РОБИКА; - ФОРМАТ служит для разметки рабочих дисков; - ДИСКОР служит для определения скорости дисковода; - КОПИТРЕК, КОПИТРЕК.КОД позволяет частично восстанавливать затертые диски; - АЛФАВИТЫ и ОБМЕН_АЛФАВИТЫ позволяют редактировать образы символов, используемые процедурой ТКС; - НОТА, МУЗЫКА.КОД воспроизводят звуки основных музыкальных нот; - ЗАПУСК служит старт-программой при вызове РАПИРА-интерпретатора; - ЧИТ_ЗАП содержит набор вспомогательных процедур обращения к К-файлам для перечисленных выше программ. 1. Процедура ИНСТР Для запуска наберите ЗАПУСК ИНСТР; Первый вопрос диалога - о режиме вывода. Не задавайте вывода на бумагу, если к машине не подключен принтер: программа "повиснет" и систему придется перезагружать. После установки режима на экране предлагается список имен файлов, образующих настоящую инструкцию. Содержание каждого файла соответсвует его названию. Набором номера файла выбирается отдельный файл, 0 обозначает вывод всей инструкции, слишком большой номер - конец работы, отрицательный номер - вывод окончания инструкции, начиная с указанного файла. При выводе отдельного файла и окончания инструкции запрашивается номер страницы и строки - это позволяет продолжить печать с прежним разбиением на страницы в случае нехватки или обрыва бумаги, случайного сбоя печати и т.п. Нумерация страниц начнется с указанного номера, причем на этой странице начало требуемого файла будет выдаваться после пропуска заданного числа строк. После печати каждого файла выдача приостанавливается и на экран выдается обозначение диска, на котором располагается следующий файл. В процессе печати "пробел" приостанавливает выдачу до нажатия любой другой клавиши, РЕД прекращает вывод текущего файла (для режимов выдачи нескольких файлов происходит переход к следующему). Размеры страницы заданы в строках 119 (ширина строки - 70 символов) и 100 (длина страницы - 60 строк) текста модуля. 2. Модуль ФУНКЦИИ Включение модуля ФУНКЦИИ вводит в операционную систему имена: SIN, СОS, ТG, СТG, АRСSIN, АRСТG, ЕХР, LN, LG, СТЕП Все функции имеют традиционный смысл; у функции СТЕП (Х,У) первый аргумент - основание, второй - показатель степени. Обратные показательные функции (LN - натуральный и LG - десятичный логарифмы) в данной версии ограничены по диапазону аргумента от 1Е-3 до 9999.9... То же ограничение относится к основанию степени, если показатель - дробное число. 3. Процедура СТАТ При вызове процедуры СТАТ: ЗАПУСК СТАТ; на экран выдается сводка допушенных в сеансе работы ошибок по типам диагностических сообщений. Затем предлагается очистить счетчики ошибок системы для того, чтобы обозначить начало следующего сеанса. При перезагрузке счетчики ошибок устанавливаются в 0. 4. Исполнитель МУРАВЕЙ Для запуска исполнителя необходимо вызвать РОБИК (директива РОБИК;) и включить его директивой ВКЛ МУРАВЕЙ; Полное множество предписаний исполнителя (МПИ): ГЕН; - генерация задания; ЗП "ИМЯ ФАЙЛА"; - запись обстановки на диск; ЧТ "ИМЯ ФАЙЛА"; - чтение обстановки с диска; ВВЕРХ; ВНИЗ; ВПРАВО; ВЛЕВО; - движение "муравья"; ЭКРАН; - восстановление экрана. При исполнении ГЕН на поле появляется курсор в виде квадрата синего цвета. Перемещение курсора выполняется стрелками, расстановка букв - соответствующими клавишами, стирание - клавишей "пробел". Муравей устанавливается нажатием клавиши $ , выход из режима генерации - перевод строки. Принцип составления и выполнения заданий становится ясен на примере задания ЗАД1МУР и программы РЕШ1МУР. Чтобы познакомиться с ними, включите исполнителя и выполните следующие директивы: # ЧТ "ЗАД1МУР"; (на экране начальная обстановка) # ЗАПОМНИТЬ РЕШ1МУР; (на экране текст программы) <РЕД>, <перевод строки> (выход через "конец описания") # ЭКРАН; (вновь начальная обстановка) # ВЫЗВАТЬ РЕШ1МУР; (выполнение программы). 5. Исполнитель МАШИНИСТ Запуск исполнителя производится директивой # ВКЛ МАШИНИСТ; в интерпретаторе РОБИК. МПИ исполнителя содержит директивы: ГЕН; - генерация задания; ЗП "имя файла" - запись обстановки на диск; ЧТ "имя файла" - чтение задания; ВПЕРЕД; НАЗАД; - движение состава; ПРИЦЕПИТЬ ВАГОН; ОТЦЕПИТЬ ВАГОН; - относятся к крайнему левому вагону; ПЕРЕВЕСТИ СТРЕЛКУ; - относится к стрелке слева перед составом; ЭКРАН; - отображение текущего состояния на экране. После прохождения состава стрелки устанавливаются в исходное положение. Файлы ЗАД1МАШ и РЕШ1МАШ содержат условие и пример решения задачи для исполнителя МАШИНИСТ, их просмотр выполняется аналогично примеру для исполнителя МУРАВЕЙ. Генерация задания происходит в два этапа: сначала формируется схема путей и стрелок, затем задается положение вагонов и исходное состояние стрелок. На первом этапе курсором служит попеременный вывод ">" и "=", нажатие ">" формирует стрелку, "=" - путь налево от курсора. На втором этапе курсор - мигающая цифра (номер стрелки) или буква (обозначение пути). Положение стрелки задается нажатием стрелки вверх или вниз. Размещение вагонов на каждом пути происходит слева направо, нажатие любой клавиши формирует вагон с изображением соответствующего символа. Заполнение пути заканчивается либо нажатием перевода строки, либо в случае полной занятости пути. Генерация заканчивается после заполнения всех "левых" путей и установки всех стрелок размещением локомотива на "правом" пути. 6. Исполнитель АРИФ Включение исполнителя предоставляет в язык РОБИК четыре арифметических действия в виде следующего МПИ: СЛОЖИТЬ выр С выр И ПРИСВОИТЬ имя; ВЫЧЕСТЬ выр ИЗ выр И ПРИСВОИТЬ имя; УМНОЖИТЬ выр НА выр И ПРИСВОИТЬ имя; РАЗДЕЛИТЬ выр НА выр И ПРИСВОИТЬ имя; где выр - выражение (в РОБИКе имя или константа), имя - имя результата. В реализации используется целая арифметика РАПИРЫ, поэтому остаются теми же диапазоны представления операндов и результатов. 7. Программа ДИСКОР Определяет скорость вращения диска путем особой разметки 34 трека и измерения времени между двумя считываниями. Запуск: ЗАПУСК ДИСКОР; После чтения с диска вспомогательной программы на экране появится запрос: НОМЕР ДИСКОВОДА ? 1 Нажмите перевод строки, если проверяется скорость первого дисковода, или замените номер на требуемый. На запрос "ВСТАВЬТЕ НЕНУЖНЫЙ ДИСК И НАЖМИТЕ ТРИ КЛАВИШИ" вставьте в испытуемый дисковод диск, информацию на котором можно затереть (например, неразмеченный диск). Внимание! На 34-й трек ведется запись! На экране желтой линией будет отмечаться время одного оборота диска. Оптимальное значение (200 мсек) отмечается красной линией, допустимое отклонение - в пределах поля (197-203 мсек). Программа работает до тех пор, пока не будет нажата клавиша F3. Изменение скорости дисковода влечет, как правило, возникновение ошибок обмена с диском, поэтому ее необходимо периодически регулировать. Регулировка скорости производится при снятой крышке машины вращением резисторного винта дисковода. За изменением скорости можно при этом следить с помощью программы ДИСКОР. 8. Программа ФОРМАТ Предназначена для разметки рабочих дисков. Разметка диска заключается в стандартном форматтировании каждого трека с затиранием записанной ранее информации и создании пустой библиотеки файлов. Порядок запуска и работы с программой описан в 5.1 инструкции. Внимание! Программы ДИСКОР и ФОРМАТ читают вспомогательную программу из загрузочной части системного диска, поэтому копирование их на другие диски не допускается. 9. Программа КОПИТРЕК Предназначена для частичного восстановления затертых дисков и исправления испорченной разметки диска. Принцип работы: посекторное считывание трека с игнорированием ошибок разметки и сбор уцелевшей информации. Запуск: ЗАПУСК КОПИТРЕК; После чтения вспомогательной программы на экран выводится рабочее поле и выдаются запросы режима работы: - "ЗАПИСЫВАТЬ БУДЕМ?" - если нет, программа будет только читать треки и выдавать информацию о найденных ошибках; если да, то после чтения трек будет перезаписан. При этом ошибки в разметке исчезают, но непрочитанные сектора обнуляются. - "НА ТОТ ЖЕ ДИСК?" - запись можно вести на тот же диск или на другой; в последнем случае во время работы будут выдаваться запросы переставить диски. - "РЕЖИМ АВТОМАТИЧЕСКИЙ?" - в автоматическом режиме дополнительно запрашиваются номера начального и конечного треков, затем происходит последовательная обработка всех треков между ними включительно (весь диск - треки 0-34). В ручном режиме номер каждого обрабатываемого трека запрашивается отдельно. - "ОСТАНАВЛИВАТЬСЯ?" - останов до нажатия любой клавиши поле обработки очередного трека в автоматическом режиме. Для утвердительного ответа на запрсы достаточно нажимать только перевод строки. Дополнительные запросы во время работы: - "ТРЕК?" - номер трека в ручном режиме работы. - "ПРОДОЛЖАТЬ?" - продолжение работы в ручном режиме. - "БУДЕТЕ ЕЩЕ РАБОТАТЬ?" - если да, запрашивается новый режим работы, если нет - конец работы. При чтении трека на экране заполняется шкала прочитанных секторов (в соответствии с физической и логической нумерациями их на треке): каждый сектор выделяется тем или иным цветом в зависимости от правильности или типа ошибки чтения (они обозначены в верхней части экрана). Не найденные или испорченные сектора читаются по 4 раза на 9 смещениях (в 1/4-ых расстояния между треками), что фиксируется на шкале смещений. Прочитанные сектора повторно не читаются. При записи трек размечается заново на правильном месте с записью содержимого считанных секторов. Обнуляются сектора, несчитанные по всем типам ошибок, кроме "СЕКТОР СОМНИТЕЛЕН": здесь возможно частичное или полное восстановление данных. В любом случае после записи трек может быть считан штатной операционной системой, хотя не гарантируется, что все существовашие на диске файлы будут читаться правильно. 10. Программа АЛФАВИТЫ Служит для создания альтернативных наборов символов, используемых процедурой ТКС. Запуск: ЗАПУСК АЛФАВИТЫ; На экране появится меню - список директив. Для перехода в режим редактирования символов и обратно в меню нажмите клавишу 8 (здесь и далее - функциональные). В режиме редактирования на экране выделены три поля: - поле стандартных изображений (справа сверху), где находятся стандартные изображения редактируемых символов; - поле новых изображений (справа снизу); - поле редактирования (слева) - укрупненная копия поля новых изображений с выделенными клетками для изображения символа (6х8 точек). Текущие позиции на всех полях выделены курсорами. Все изменения отображаются синхронно. Редактирование символов: - клавиши со стрелками - смещение к новому символу; - любая алфавитно-цифровая клавиша ставит в текущую клетку указанный символ (стандартное изображение, если он не менялся, новое, если менялся); - УПР-V - то же по введенному коду символа; - 7 - ставит в соответствие текущему символу изображение другого символа из текущего алфавита (он или его код запрашиваются); - 2,4,5,6 - смещение редактируемой точки в поле символа на одну позицию вверх, влево, вниз и вправо; - 1,3 - добавление и стирание точки символа; - . и = - переключение строчных и прописных букв; - 0 - выдача списка команд режима редактирования; - 8 - возврат в меню. В режиме меню, перемещая планку курсора стрелками и исполняя директиву переводом строки, можно просмотреть каталог диска и текущий алфавит, записать его на диск или считать с диска, выбрать для редактирования стандартный алфавит, закончить работу. Данная программа позволяет только подготовить К-файл с новым алфавитом. Для использования его следует воспользоваться процедурами из файла ЧИТ_ЗАП: - ЧТ_АЛФАВИТ(имя_файла_с_алфавитом,шрифт); -чтение алфавита; - ШРИФТ(шрифт); - выбор алфавита для текущей работы ТКС. Допускается иметь в памяти два алфавита одновременно. Переключение их задает параметр "шрифт": 0 - место стандартного алфавита, 1 - дополнительного. 11. Чтение и запись рисунков Осуществляются с помощью процедур из файла ЧИТ_ЗАП: ЧТ_РИС(имя_файла,страница); - чтение рисунка с диска; ЗП_РИС(имя_файла,страница); - запись рисунка на диск. Страница задается числом: 0 - большая графическая страница (средняя и высокая графика), 1-5 - малые графические страницы (ГНР,ГЦС,ГНС). Режим отображения значения не имеет. Файл с рисунком имеет тип К. Замечание. При записи рисунка на диск программу ЧИТ_ЗАП следует считать в память до того, как начнется формирование рисунка, и во время формирования других программ не вводить, т.к. при этом используется графическая память. 12. Процедура НОТА Предписания ВВОД ИЗ ДЗУ:НОТА; ПОДГОТОВИТЬ_НОТУ(); обеспечивают работу процедуры НОТА, имеющей два параметра: первый - номер ноты, второй - длительность звучания в 1/32-х. Номер ноты кодирует целым числом от 0 до 47 4 октавы по 12 нот в каждой: 0 - до 4 - ми 8 - соль# 1 - до# 5 - фа 9 - ля 2 - ре 6 - фа# 10 - ля# 3 - ре# 7 - соль 11 - си 13. Старт-программа ЗАПУСК Загружается и вызывается автоматически при вызове РАПИРА-интерпретатора. Выдает сообщения о запуске (перезапуске) системы, а если во время начальной загрузки была нажата какая-либо клавиша - просит установить рабочий диск и вызывает программу ЗАПУСК с него. По окончании работы процедура самоуничтожается, вводя в операционную обстановку имя ПУСТО, имеющее пустое значение. Действия программы ЗАПУСК на рабочем диске определяются пользователем. Это может быть, например, загрузка рабочих подпрограмм и т.п. При отсутствии на системном или рабочем диске программы с таким именем выдается сообщение "ФАЙЛ НЕ НАЙДЕН".
ПРИЛОЖЕНИЕ 5 ОТЛИЧИЯ ВЕРСИЙ -------------------------------------------------------- ВЕРСИЯ А1.2' (25.10.85-11.02.86) -------------------------------------------------------- 25.10.85. Версия распознается по индексу 2' В меню. В состав системы входит диалоговый отладочный комплекс (ДОК). 08.12.85. В Редакторе-ДОК устранены зависание при переклю- чении на строчные буквы в режиме 64х32 и авто- матическая замена "ъ" пробелом при чтении. 21.12.85. Плата интерфейса может находиться в любом разъ- еме, а не только в 5-м. Работает вывод на принтер из Ассемблера. 02.01.86. При загрузке системы проверяется контрольная сумма секторов; двоичная программа ее задания находится в конце Отладчика. 03.01.86. Отладчик (ДОК): по команде [ЕХЕС - исполняются команды Отладчика,записанные в текстовом файле 31.01.86. Изменения в графике РАПИРЫ: - добавлена 6-я колонка в таблицу символов ТКС, - исправлено отсутствие реверса в ГЦС, - исправленО раздвоение точек с большим номером цвета в ГСР и ГНС.
-------------------------------------------------------- ВЕРСИЯ А1.3 (11.02.86-15.10.86) -------------------------------------------------------- 11.02.86. Версия распознается по индексу А1.3 в РАПИРЕ и индексу 3 в меню (в версиях с 10.06.86 в меню указывается дата создания и организация-раз- работчик). 25.03.86. Изменения в ДОК: - переставлены альтернативы в меню, - изменены цвета в меню, - исправлена порча имени файла после ассемблиро- вания больших файлов, - Ассемблер умеет создавать В- И R-файлы, встав- лен запрос типа объектного файла в его меню. В IОSUВ вставлена задержка на вводе (яч. 1В15) для устранения дребезга клавиатуры. 26.03.86. Исправлено занесение цветов при ошибке ввода. 16.04.86. Исправлена ошибка в РАПИРЕ: при выходе из цикла ДЛЯ-ИЗ по тексту засорялся стек. В Редакторе-ДОК основной режим - черно-белый. Задержка на вводе вставлена в оба Редактора. Исправлена выдача сообщения о сбросе в Редакторе 22.04.86. Уточнены сообщения об ошибках, изменены тексты: $23 - НЕВЕРНО КОНТРОЛЬНОЕ УСЛОВИЕ $С9 - ТАКОГО ПРЕДПИСАНИЯ НЕТ $D9 - ТРЕБУЕТСЯ <ключ.слово> ИЛИ ";" $Е4 - ТРЕБУЕТСЯ ПРЕДПИСАНИЕ ИЛИ ";" ИЛИ НЕВЕРНО НАЧАЛО ПРЕДПИСАНИЯ $Е5 - ТРЕБУЕТСЯ <ключ.слово> ИЛИ ";" ИЛИ ОШИБКА В КОНЦЕ ПРЕДПИСАНИЯ 02.06.86. ДОК: работает команда [RUN - запуск К-программы. 08.06.86. РАПИРА: введено предписание "ЗАПУСК имяфайла;" эквивалентное "ВВОД ИЗ ДЗУ:иф; иф();" 10.06.86. Исправлены ошибки в диагностиках $е4,$е5. При (пере)вызове РАПИРЕ автоматически вызывается процедура ЗАПУСК с системного диска. Нажатие любой клавиши во время загрузки вызывает сооб- щение о необходимости вставить для загрузки процедуры ЗАПУСК рабочий диск пользователя. 19.06.86 Обработка прерываний настраивается в момент загрузки в зависимости от исполнения машины. (повторно исправлено 31.07.86: версии до 31.07 на новых машинах не работают) 24.07.86 Встроен единый драйвер для принтеров типа D100 и СЕNТRОNIХ. 26.07.86 Изменения в КОПИТРЕК: - распознается чтение соседнего трека, - распознается защита диска, - прекращение чтения по "F3", - ускорен поиск адресной части сектора. 31.07.86 РАПИРА: допускается равенство целых и дробных: 36=36.0 07.08.86 Создан единый модуль дисковых утилитных программ в загрузочном куске на системном диске: скорость, разметка, копирование диска. Разметка диска вынесена из меню в программу на РАПИРЕ ФОРМАТ на системном диске; предвари- тельно проверяется скорость дисковода. В меню внесено копирование дисков. Объектная часть ДИСКОР находится в общем модуле. 22.08.86 Исправлены ошибки: - занесение граф.режима по умолчанию (08.06.86); - реакция на ошибку диска; - Ассемблер: незапись объектного файла на диск при первом ассемблировании с диска; - КОПИТРЕК: зацикливание на записи при ошибках чтения. 14.10.86 Исправлены ошибки возврата из процедуры, в т.ч. при досрочном выходе из процедуры, вызванной в цикле ДЛЯ-ИЗ. Иправлено зависание при установке позиции файла (ошибка от 24.07.86).