[an error occurred while processing this directive]
.нс2
.ктФг.00031-01 35 01
.сс
.цв
АННОТАЦИЯ

.ов
В документе описывается язык программирования РАПИРА, являющийся одним из входных языков системы "Школьница". Приводится описание синтаксиса и сведения о семантике его основных конструкциях.
   Более подробные сведения о языке приводятся в "Руководстве программиста" (Фг.00031-01 33 01).
.сс
.цв
СОДЕРЖАНИЕ

.ов
1. Общие сведения                              4
2. Элементы языка                              5
  2.1. Алфавит                                 5
  2.2. Лексика                                 5
  2.3. Объекты                                 6
  2.4. Имена                                   8
  2.5. Выражения                               8
  2.6. Присваивание                            9
  2.7. Предписания                             9
  2.8. Функции и процедуры                    11
3. Способы структурирования программы         13
4. Средства обмена данными                    14
5. Встроенные элементы                        15
6. Средства отладки программы                 16
7. Ссылочные документы                        17
Приложение 1. Операции языка                  18
Приложение 2. Синтаксическая сводка           19
Приложение 3. Встроенные функции и процедуры  27
Приложение 4. Примеры программ                29
.сс
.цв
1. ОБЩИЕ СВЕДЕНИЯ

.ов
1.1. РАПИРА является диалоговым языком высокого уровня, предназначенным для обучения программированию и для решения прикладных задач средней сложности. Язык ориентирован в первую очередь на школьников 11-17 лет, но может использоваться и другими категориями пользователей.
1.2. Язык РАПИРА иллюстрирует классические способы организации и обработки данных (числа, тексты, составные иерархические данные, файлы), хранения их в памяти (имена) и способы построения программ (ветвления, циклы, процедуры) с ориентацией на структурный подход. Так, в языке отсутствует возможность перехода по метке.
1.3. Язык предусматривает развитые средства отладки, позволяющие исполнять программы пошагово, следить за изменением значений имен, задавать контрольные точки, управлять выводом отладочной информации.
1.4. Язык содержит средства системного назначения, позволяющие управлять операционной обстановкой на машине средствами языка.
1.5. Язык предоставляет посредством встроенных процедур и функций возможность использования графики, управления диалогом, внешними устройствами. Аппарат модулей позволяет расширять возможности языка за счет специальных пакетов обработки данных, подготовленных пользователем, в частности, описывать исполнителей для РОБИКА.
1.6. Формальный синтаксис языка приведен в Приложении 2.
.сс
.цв
2. ЭЛЕМЕНТЫ ЯЗЫКА

.ов
2.1. Алфавит
Алфавит языка включает в себя:
-буквы: русские и латинские; заглавные и строчные в реализации А1.3. не различаются;
-цифры:  0 1 2 3 4 5 6 7 8 9 
-спецсимволы:
  - ограничители:
        ()  []  <> <* *> <¤ ¤> (* *) " "
  - разделители и обозначения операций: 
        . : , ; -> + - * ? / ** //
        = /= < <= > >= # => !   '

2.2. Лексика
Лексика РАПИРЫ почти не отличается от лексики РОБИКА. Различаются те же лексемы: целые и дробные числа, тексты, слова и спецсимволы. Имена различаются от ключевых слов контекстно. Длина лексем описанием языка не ограничивается.
-имена записываются буквами, цифрами и подчерками, начиная с буквы:
     НАШ_УЧЕБНЫЙ_ЯЗЫК_ПРОГРАММИРОВАНИЯ
     ТЕК_ИМЯ
-тексты обрамляются кавычками ("); кавычки, используемые в тексте, в записи дублируются:
     "ЛЕДОКОЛ ""АЛЬБАТРОС"""
-целые числа - это последовательности цифр; отрицательные числа - результат унарной операции минус;
     1
     4232
     2939837291020292901
-дробные числа строятся как целое с приписанной дробной частью, возможно, с указанием десятичного порядка числа:
     3.141519
     0.3141519Е1
     3141519Е-6

Комментарий в РАПИРЕ - это последовательность символов, взятая в скобки (* *) . Допускается использовать в нем переводы строки.
   Расположение предписаний по строкам произвольно. Пробелы, комментарии и переводы строки являются разделителями лексем и обязательны лишь там, где возможно принятие двух лексем за одну.

2.3. Объекты
Объекты - это данные, которыми оперирует машина. Объекты в РАПИРЕ бывают следующих видов:
 - целые числа,
 - дробные числа,
 - тексты,
 - кортежи,
 - множества,
 - записи,
 - процеудры,
 - функции, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . строить составные объекты разных видов: кортежи, множества и записи. 
Кортежи - это упорядоченные совокупности произвольных элементов; они доступны для обработки по индексу (номеру). Операция формирования кортежа записывается скобками < > с перечислением элементов в нужном порядке через запятую:
     <"Синий","Голубой","Зеленый">
     <<5,8>,<4,3>,<-8,6>>
В множестве порядок элементов не фиксируется, и совпадающие элементы совмещаются. Над множествами определены операции: объединение (+), пересечение (*), разность (-), проверка принадлежности (ИЗ); возможность перебора всех элементов множества задается циклом ДЛЯ-ИЗ.
     <*1,1,1*>=<*1*>
     <* *>
В записи фиксируется связь элементов с именем полей записи, и элементы доступны по этому имени (.) .
     <¤ ФИО:    "Петров В.Н.",
        АДРЕС:  "Строителей 8-102",
        ТЕЛЕФОН:"нет" ¤>
     <¤ ЦВЕТ: "БЕЛЫЙ",
        НОМЕР: 0 ¤> . НОМЕР
Другими видами объектов являются процедуры, функции, файлы. Сводка операций над различными видами объектов приведена в Приложении 1.

2.4.  Имена
Имена обозначают простые и составные объекты, хранящиеся в памяти. Имена используются для организации доступа к полям записи. Кроме того, имена используются для определения функций и процедур, их локальных объектов и параметров.
Типизации имен нет: имя может получать значения любых видов в произвольном порядке.
Если имя не получило каким-либо способом явное определение, то оно имеет значение .пусто.

2.5. Выражения
Простейшие выражения - это тексты, числа, составные объекты и имена. Более сложные выражения из простейших строятся с помощью унарных и бинарных операций. Помимо арифметических операций в выражении могут стоять вырабатывающие значение операции над другими видами объектов. Совместимость операций в выражениях определяется только возможностью использования результатов одних операций в качестве аргументов других. Правила вычисления выражений аналогичны принятым в большинстве языков. Примеры:
   # < 1,2,3 >
   А + Б * Ц(1,2) 
   Б**Ц(2,<1,2>[И])-4
Элементы кортежа или текста (или группа соседних элементов), а также поля записей выбираются с помощью операций:
     < 1,7,0.44 >[2]              (* выборка *)
     < "2","Е","О" >[2:3]         (* вырезка *)
     <¤ ФАМ: "ПЕТРОВ",
        ИМЯ: "ИВАН",
        ОТЧ: "СЕРГЕЕВИЧ" ¤> . ИМЯ (* доступ к полю *)
Значение функции получается с помощью вызова функции
        ФН(А1,А2,А3)
Вид определения функции приведен в 2.8.
Для организации ветвлений и циклов используются условия, построенные с помощью операций сравнения:
      А=В
      1<А
      1 ИЗ < 1,2,3 >
      <> ВИДА < А,В,Ц >
Равенство (неравенство) - является универсальной операцией и является способом проверки смысловой эквивалентности двух объектов. Операция ВИДА сравнивает виды объектов, ИЗ проверяет принадлежность элемента кортежу или множеству или  литеры тексту. Операции порядка определены только для чисел.

2.6. Присваивание
Имена получают значения с помощью предписания присваивания:
     1 -> Н ;
Возможно присваивание элементам или группе соседних элементов текстов и кортежей, а также полям записей.
      1 -> К[2];
      < 2,3 > -> К[5:6];
      "ПЕТРОВ" -> АНКЕТА.ФАМ;   

2.7. Предписания
Программа состоит из предписаний, разделяемых знаками ";". Способ деления предписаний на строки произвольный.
Присваивание - пример простого предписания.
Сложные предписания образуются путем операторных скобок.
Условный оператор с необязательным полем "иначе":
     ЕСЛИ А>Б
          ТО А - Б  -> Ц
          ИНАЧЕ 0 -> Ц
     ВСЕ ;
Оператор выбора имеет две разновидности: для произвольных условий и для переключателя.
     ВЫБОР ИЗ
           А>Б : А-Б -> А
         ! А=Б : 0 -> С
         ! А<Б : Б-А -> А
           ИНАЧЕ ?"так не должно быть"
     ВСЕ;
     ВЫБОР К ИЗ
              1 : ?"один"
           !  2 : ?"два" 
           !  3 : ?"три"
            ИНАЧЕ ?"много"
     ВСЕ ;
Имеются четыре разновидности циклов: простое повторение, цикл по условию (пока), цикл по компонентам составного объекта или текста (из) и цикл типа арифметической прогрессии.
     ПОВТОР 4 РАЗА ::  (* можно РАЗ для удобства чтения *)
       ? "ПРИВЕТ!";
     ВСЕ;
     ПОКА А>Б ::
       А-Б -> А
     ВСЕ;
     ДЛЯ С ИЗ "СТРОКА" ::
       С+Т -> Т  (* конкатенация текстов *)
     ВСЕ;
     ДЛЯ К ИЗ <1,2,3,4,5> ::
       Н+К -> Н
     ВСЕ;
     ДЛЯ А ОТ 1 ДО К ШАГ 2 ::
       ?А*А
     ВСЕ;

2.8. Функции и процедуры
Определение функции или процедуры начинается с объявления ее имени и формальных параметров с указанием типа передачи (входной, выходной, возвратный). Затем объявляются локальные параметры и описывается тело процедуры.
Значение функции определяется в конце специальным предписанием РЕЗ.
      ФУНК ТЕК_ФОР
         (А);     (* входной параметр *)
         ...
      РЕЗ:Х       (* значение функции *)
      КНЦ;
      ПРОЦ ФОР_В ( А=> , (* выходной параметр *)
                  <=>Б );(* возвратный параметр *)
      ИМЕНА: В,Г,Д;      (* объявление локальных имен *)
             ...
      КНЦ;
По умолчанию параметр считается входным (передающим значение в процедуру). Выходной параметр передает результаты процедуры в вызывающую программу. Возвратный параметр совмещает свойства входного и выходного.
Предписание вызова процедуры имеет вид:
      ФОР_В(А1,Б1);
Вместо имени можно использовать любое выражение, вычисляющее объект-процедуру (в выражении - объект-функцию).
.сс
.цв
3. СПОСОБЫ СТРУКТУРИРОВАНИЯ ПРОГРАММЫ
.ов

Единицей построения программ является процедура (функция). Процедуры описываются раздельно, вложенные описания недопустимы. Взаимодействие процедур осуществляется по динамической цепочке вызовов.
Особой формой структурирования программ являются модули, описанные в Руководстве программиста (Фг.00031-01 33 01).
.сс
.цв
4. СРЕДСТВА ОБМЕНА ДАННЫМИ

.ов
Вывод данных позволяет получить текстовое изображение любого объекта, возможно, с форматтированием.
      ВЫВОД:Х; 
      ?Х;      (* эквивалентно ВЫВОД: Х; *)
      ВЫВОД:Х:10:3.А:Б:5;
Ввод данных переводит текстовое представление объектов во внутренний код в памяти ЭВМ.
      ВВОД:Х;
      ВВОД ДАННЫХ:А,Б,В;
      ВВОД:Х,Y,Z;
Средства работы с файлами унифицированы со средствами ввода-вывода:
      ВЫВОД В ФАЙЛ ИФ: ...
      ВВОД ИЗ ФАЙЛА ИФ: ...
      ВВОД ИЗ ДЗУ: ... 
Для организации файлов и дисциплины работы с ними используются специальные операторы:
      ОТКРЫТЬ "ТЕКСТ" КАК ИФ;
      ОТКРЫТЬ ИФ;
      ЗАКРЫТЬ ИФ;
      ПОЗИЦИЯ ИФ=К;
      СТЕРЕТЬ "ИФ";
      ЗАПЕРЕТЬ "ИФ";
      ОТПЕРЕТЬ "ИФ";
.сс
.цв
5.  ВСТРОЕННЫЕ СРЕДСТВА
.ов

Система программирования для языка РАПИРА обладает:
 - редактором программного текста,
 - средствами машинной графики,
 - дисковой операционной системой,
 - библиотекой стандартных функций и процедур,
 - средствами взаимодействия с независимо разрабатываемым программным обеспечением.
Эти средства описаны в Руководстве программиста (Фг.00031-01 33 01).
.сс
.цв
6. СРЕДСТВА ОТЛАДКИ ПРОГРАММЫ

.ов
Имеется средство контроля произвольных условий в произвольных местах программы:
     КОНТРОЛЬ Х>0;
Нарушение условия вызовет сообщение "СРАБОТАЛ КОНТРОЛЬ".
Возможно планирование точек приостановки программы для того, чтобы детально изучать особенности функционирования.
     СТОП; (* приостановка выполнения *)
После приостановки можно посмотреть текущие значения имен, если нужно, то изменить их и продолжить или прекратить работу программы:
     ПУСК;    (* продолжение работы *)
     ВЫХОД;   (* отказ от продолжения *)
     ШАГ;     (* выполнение очередной строки,
                 затем снова приостанов *)
Кроме того, можно управлять содержанием и детальностью выдачи отладочной информации о цепочке вызовов процедур и функций, а также именах, меняющих значение при работе программы. Более подробная информация об этих средствах содержится в документе "Руководство программиста".
.сс
.цв
7. ССЫЛОЧНЫЕ ДОКУМЕНТЫ

.ов
1. Звенигородский Г.А. Первые уроки программирования. М.: Наука, 1985. с. 199-206.
2. Руководство программиста. Фг.00031-01 33 01.
.сс


.ктСИБТ 20008-01 35 01
.пв
ПРИЛОЖЕНИЕ 1
.цв
ОПЕРАЦИИ ЯЗЫКА

.ов
Унарные:
   -    минус для чисел
   #    длина текста или кортежа, мощность множества
   не   отрицание
Бинарные:
   +    сумма чисел
        конкатенация текстов или кортежей
        объединение множеств 
   -    разность чисел
   *    произведение чисел
        пересечение множеств
   /    деление
   **   возведение в степень
   //   деление целых нацело
   = /= сравнения
   < <= сравнения
   > >= сравнения
   и    логическое
   или  логическое
   из   принадлежность символа тексту, элемента кортежу
        или множеству вида, проверка вида значения
.сс
.пв
ПРИЛОЖЕНИЕ 2
.цв
СИНТАКСИЧЕСКАЯ СВОДКА

.ов
При описании синтаксиса используются следующие обозначения:
   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):
    слово { [ : ] слово }
              ,   <ИМЯ> 
                  <ВЫР>
.сс
.пв
ПРИЛОЖЕНИЕ 3
.цв
ВСТРОЕННЫЕ ФУНКЦИИ И ПРОЦЕДУРЫ

.ов
    1) Функции:
АВS(Х) - модуль числа Х;
ЦЕЛЧ(Х) - целая часть числа Х;
SQRТ(Х) - квадратный корень;
ДСЧ() - случайное число из промежутка [0;1[;
КОД(Л) - код литеры;
АЛФ(N) - символ по коду;
ФТЕКСТ(А,Л) - текст длины А, состоящий из литер Л;
ФКОРТ(А,П) - кортеж из А элементов П;
КФ(Ф) - признак конца файла ("Д"/"Н");
ЧТФ(Ф,N) - очередные N символов из файла Ф в виде текста;
КЛАВ() - ожидание ввода символа с клавиатуры, результат - этот символ;
НАЖАТО() - была ли нажата клавиша, результат - символ или пустой текст;
РУЧКА(Н) - ввод положения ручки потенциометра Н;
КНОПКА(Н) - была ли нажата кнопка на потенциометре Н ("Д"/"Н");
ОКСИМ(Кх,Ку) - символ на экране в указанной позиции;
ЭКЦВ(Кх,Ку) - возващает цвет точки или символа на экране;
АДРЧ(А) - содержимое ОЗУ по адресу А;

    2) Процедуры:
ПАУЗА(N) - задержка исполнения программы на N/10 сек;
ЗВОН() - звуковой сигнал (звонок);
ЗВУК(N1,N2) - звуковой сигнал частоты N2 и длительности N1;
ПРИГЛ(Л) - установка приглашения ко вводу для предписания ВВОД;
ДЗУ(Н) - установка активного ДЗУ;
ОКНО(Кх1,Ку1,Кх2,Ку2) - установка окна;
ПОЗ(Кх,Ку) - установка позиции курсора в окне;
РЖМ(Т) - управление режимами графики и диалога;
ЦВЕТ(N) - установка цвета для графических процедур;
СИМРИС(Л) - установка символа отрисовки для ГЦС и ГНС;
ОТСЧЕТ(Кх,Ку) - установка нового начало координат текущего графического режима;
МТБ(Nх,Nу) - установка масштабов по осям координат;
ТЧК(Кх,Ку) - отрисовка точки;
ЛИН(Кх1,Ку1,Кх2,Ку2) - отрисовка линии;
ПРЯМ(Кх1,Ку1,Кх2,Ку2) - отрисовка прямоугольника;
ОБЛ(Кх,Ку) - заполнение области;
ТКС(Хн,Ун,Хс,Ус,Хк,Ук,Хт,Ут,Рх,Ру,Цс,Цф,Т) - графическая процедура отрисовки текста;
АДРЗ(А,N) - запись по адресу А числа N.
АДРВЫЗ(А) - вызов программы в машинных кодах.
.сс
.пв
ПРИЛОЖЕНИЕ 4
.цв
ПРИМЕРЫ ПРОГРАММ

.ов
ПРОЦ СЧАСТЬЕ;
(****************************************)
(* Расчет количества счастливых билетов *)
(****************************************)
ИМЕНА: КОЛ_СУММ, I, J, К, КОЛИЧЕСТВО ;
  ФКОРТ (28,0) -> КОЛ_СУММ ;
  ДЛЯ I ОТ 0 ДО 9 ::
    ДЛЯ J ОТ 0 ДО 9 ::
      ДЛЯ К ОТ 0 ДО 9 ::
        КОЛ_СУММ [I+J+К+1] + 1 -> КОЛ_СУММ [I+J+К+1]
      ВСЕ
    ВСЕ
  ВСЕ;
  0 -> КОЛИЧЕСТВО;
  ДЛЯ I ОТ 1 ДО 28 ::
    КОЛИЧЕСТВО + КОЛ_СУММ [I] ** 2 -> КОЛИЧЕСТВО
  ВСЕ;
  ВЫВОД: "Всего есть",КОЛИЧЕСТВО," счастливых билетов"
КНЦ (* процедуры СЧАСТЬЕ *);


ФУНК СТЕПЕНЬ (Х, N);
(****************************************)
(* возведение Х в натуральную степень N *)
(****************************************)
ИМЕНА: ВРЕМ, РЕЗУЛЬТАТ;
  ВЫБОР ИЗ
    N = 0:
      1->РЕЗУЛЬТАТ !
    N/2 ВИДА 0:                   (*  N ЧЕТНОЕ  *)
      СТЕПЕНЬ (Х, N/2) -> ВРЕМ;
      ВРЕМ * ВРЕМ -> РЕЗУЛЬТАТ
    ИНАЧЕ                         (* НЕЧЕТНОЕ N *)
      Х * СТЕПЕНЬ (Х,N-1) -> РЕЗУЛЬТАТ
  ВСЕ
РЕЗ: РЕЗУЛЬТАТ
КНЦ (* функции СТЕПЕНЬ *);


ПРОЦ ПОИСК (<=>ТАБЛИЦА, ЭЛЕМЕНТ, НОМЕР=>) ;
(*************************************************)
(* Поиск элемента в таблице; если нет - добавить *)
(*************************************************)
  ДЛЯ НОМЕР ОТ 1 ДО # ТАБЛИЦА ::
    ЕСЛИ ТАБЛИЦА [НОМЕР] . КЛЮЧ = ЭЛЕМЕНТ ТО
      ВЫХОД
    ВСЕ
  ВСЕ;
  ТАБЛИЦА + < ЭЛЕМЕНТ > -> ТАБЛИЦА;
  # ТАБЛИЦА -> НОМЕР;
КНЦ (* процедуры ПОИСК *);
[an error occurred while processing this directive]