ДРоботландский Университет 
2000/2001 учебный год
Курс 31 "Азы программирования"
Корректор
------------------------------------------------

     Р О Б О Т Л А Н Д С К О Е  П Р О Г Р А М М И Р О В А Н И Е


                    Методические рекомендации

                                  (C) А.А. Дуванов

                                      Под редакцией
                                      Ю.А. Первина


                        К О Р Р Е К Т О Р


   3.3. Корректор (░01) - (░20- отдельные разделы)

   Замечание 1.  Решения  большинства  задач книги, содержатся в
виде готовых программ для Корректора в компьютерном курсовом па-
кете:
    KURS
    │
    ├─KOR97
    │ ├─ TASK      <────── Здесь постановки задач
    │ │  └─ TEACH  <────── Здесь решения задач

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

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

  Замечание 3.  В программной среде Кукарачи находится полезная
утилита kortotxt.exe. Подобно утилите coctotxt.exe Кукарачи она
позволяет преобразовывать файлы  задачи  (*.kor и *.srd) в один
текстовый файл.  Для выполнения преобразований ее лучше перепи-
сать в каталог, содержащий задачи.
     Формат запуска:
          kortotxt.exe <имя kor-файла> [<имя txt-файла>]
     Первый параметр -  имя файла с расширением kor - программа
для Корректора. Второй параметр - необязательный - имя файла, в
котором будет  создано текстовое оформление задачи. Если второй
параметр отсутствует, то имя текстового файла  строится из име-
ни, заданного  в качестве первого параметра, добавлением расши-
рения txt.
   Замечание 4. Помимо книги для ученика  и настоящего пособия,
руководителю команды необходимо ознакомиться с инструкциями для
пользователя, прилагаемыми к программному продукту.  Инструкции
можно прочитать непосредственно из Монитора на странице Коррек-
тора или в файле kor.doc, расположенном в каталоге DOC програм-
мной среды программы.
    KURS
    ├── KOR97
    │   ├─ DOC
    │   │  └── tar.doc   <───── инструкции к программе
    │   ├─ coctotxt.exe  <───── утилита-преобразователь в txt

   Замечание 5. Несколько замечаний по работе  с программой Кор-
ректор-97.
   - При запуске  программы по шагам используйте
     следующий прием для убыстрения выполнения команд.
   1) Установите мышиный курсор на кнопку "Go".
   2) Оставьте в покое мышь и запускайте шаги клавишей Enter.
   - При обращении  к  диску  пользуйтесь "горячими" клавишами -
     это существенно убыстряет работу.
   1) Чтение с диска: цифровая клавиша "2" и еще раз "2".
   2) Запись на диск: цифровая клавиша "2", затем "3"
   - Программы для Корректора - это обычные  текстовые файлы. Их
можно писать в любом ASCII-редакторе,  например  в  Микроне  или
Микромире. Можно  "вырезать"  программы  прямо  из текста книги.
Только не  забывайте при этом  про длину строки редактора у Кор-
ректора - она равна 39  символов.  Ваши  программы, написанные в
"чужом" редакторе не должны содержать "длинных" строк.
   - Записывая программу в Корректоре вы можете "приклеить" к ее
концу текст другой с  диска.  Для этой операции нужно воспользо-
ваться строкой "Добавить" в дисковом меню Корректора.

  Замечание 6.  Задачи для программистского конкурса и инструк-
ции по его проведению будут высланы отдельным электронным пись-
мом.

1-ое занятие. Глава 1. Знакомство с исполнителем (░01)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Основные темы (план урока)
   - среда Корректора
     - лента
     - ящик
     - алфавит
   - СКИ исполнителя
   - сообщения исполнителя
      - Не понимаю
      - Не могу
   - интерфейс программы "Корректор-97"
     - области на экране
        - кнопки главного меню
        - среда исполнителя
          - лента
          - ящик
          - алфавит
        - редактор программ
        - редактор команд
        - кнопки управления
          - кнопка запуска
          - кнопка установки среды в начальное положение
          - кнопка установки режима выполнения программы
            (Непрерывно или по шагам. В Кукараче для выбора
             этих параметров приходилось пользоваться кноп-
             кой в  главном меню программы. На первом заня-
             тии можно не уделять этому много времени.)
        - информационные области на экране
          - контекстная справка в нижней строке
          - область индикации регистра клавиатуры
          - область отображения дискового имени текущей програм-
            мы Корректора
          - информационное табло редактора программ
     - вызов справки
   - редактирование ленты исполнителя
   - структура программы для исполнителя
   - написание и выполнение простейших программ
     (тех, что приводятся в книге, или похожих)
   - работа с диском
     (запись программы на диск и чтение с диска)

Замечания и рекомендации

   Первое знакомство с программой "Корректор-97" должно пройти
достаточно быстро  -  эта  новая  программа  должна до минимума
"сжать" период привыкания. Ведь программы "Кукарача-97" и "Кор-
ректор-97" очень похожи и имеют почти одинаковый интерфейс.
     Основная нагрузка детского внимания должна приходиться  на
новое СКИ и новую среду.
   Для представления Корректора используйте общую схему знаком-
ства с исполнителем, вынесенную на классную доску, кодоскоп или
демонстрационный экран:
                     ┌───────────────┐
                     │  Исполнитель  │
                     └──────┬────────┘
                     ┌──────┴────────┐
                 ┌───┴─────┐   ┌─────┴────┐
                 │ Описание│   │ Описание │
                 │  среды  │   │   СКИ    │
                 └─────────┘   └─────┬────┘
                              ┌──────┴────────┐
                              │Команды        │
                              │Как задаются   │
                              │Как выполняются│
                              │Когда "Не могу"│
                              └───────────────┘

   Руководитель на  первом  занятие  может  не показывать детям
полную СКИ исполнителя, а предъявить сокращенное:
 ┌────────────────────────────────────────────────────────────┐
 │ ВПРАВО      - переместить окно на одну клетку ленты вправо │
 │ ВЛЕВО       - переместить окно на одну клетку ленты влево  │
 │ ПИШИ символ - записать указанный символ в клетку на ленте  │
 │ ПЛЮС        - заменить символ на ленте символом, следующим │
 │               по порядку в алфавите Корректора.            │
 │ МИНУС       - заменить символ на ленте символом, предыдущим│
 │               по порядку в алфавите Корректора.            │
 │ СТОЯТЬ      - пустая команда; ее выполнение не вызывает    │
 │               никаких изменений в среде робота.            │
 └────────────────────────────────────────────────────────────┘
   Остальные команды из полной СКИ постепенно будут подробно об-
суждаться на следующих занятиях.
     При рассмотрении алфавита Корректора обратите внимание де-
тей на то, что символы ПРОБЕЛ и ПУСТО  являются разными символа-
ми. Изначально все ячейки ленты и ящик пусты, то есть заполнены
символами  ПУСТО.  В редакторе среды символ ПРОБЕЛ ставится  на
ленту пробелом, а символ ПУСТО появляется  при удалении символа
с ленты (клавиши Del и Bs).

Ответы на задания

   Задача 1. Какой  символ запишет Корректор на ленту по указан-
ной команде.

 а) ПЛЮС           б) МИНУС        в) ПЛЮС         г) МИНУС

 ──╬═══╬────       ──╬═══╬────     ──╬═══╬────     ──╬═══╬──
 ░ ║ 9 ║ ░         ░ ║ а ║ ░       ░ ║ @ ║ ░       ░ ║ ░ ║ ░
 ──╬═══╬────       ──╬═══╬────     ──╫───╫────     ──╬═══╬──

Ответы:
а) символ а
б) символ 9
в) отказ в работе, сообщение "Не могу"
г) отказ в работе, сообщение "Не могу"

   Задача  2.   Вася   попробовал  выполнить  команду  ПИШИ  К.
Корректор выдал сообщение "Не понимаю". Почему?

  Решение.
   Прописная буква К не входит в алфавит Корректора.

   Задача 3. При  помощи команд Корректору напишите на ленте его
имя.

Решение.

 ПИШИ к
 ВПРАВО
 ПИШИ о
 ВПРАВО
 ПИШИ р
 ВПРАВО
 ПИШИ р
 ВПРАВО
 ПИШИ е
 ВПРАВО
 ПИШИ к
 ВПРАВО
 ПИШИ т
 ВПРАВО
 ПИШИ о
 ВПРАВО
 ПИШИ р

   Задача 4.  Написать  программу, которая отнимает от нечетного
числа на ленте единицу.  В  начальный момент окно установлено на
первый пустой символ справа от записи числа.

Решение.
                ЭТО Минус1
                 ВЛЕВО  // установить окно на последнюю цифру
                 МИНУС  // заменить цифру на предыдущую
                КОНЕЦ


2-ое занятие. Глава 2. Язык программирования Корректора (░11)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)
- команды из СКИ для работы с ящиком ЯЩИК+,  ЯЩИК-)
- процедурное программирование
  - запись процедуры на языке Корректора
  - программа как последовательность процедур
  - преимущества процедурного программирования
- циклы
  - цикл ПОВТОРИ
  - цикл ПОКА
    - типы условий на языке Корректора
      - символ (в том числе, ПУСТО, ПРОБЕЛ)
      - ЦИФРА
      - Я=Л, Я#Л, Я<Л, Я>Л
    - модификатор условия НЕ
- развилки
  - полная форма
  - сокращенная
- рекурсия
  - бесконечная
  - конечная
  - прямая и косвенная

Замечания и рекомендации

   Занятие посвящено повторению известного материала: "основные
структуры языка программирования". В языке Корректора использу-
ются те  же самые конструкции,  что и в языке Кукарачи. Отличие
связано с другой средой исполнителя. Это отражается на условиях
и их проверках в среде.
   Повторение известного материала сопровождается его интерпре-
тацией в новой среде Корректора. Примеры заданий, приведенные в
книге, постепенно вводят ребенка в класс  задач Корректора, ко-
торые существенно отличаются от задач Кукарачи и, соответствен-
но, накапливают характерные приемы программирования нового  ис-
полнителя.
   Среди таких "стандартных" приемов,  которые  будут постоянно
использоваться в следующих занятиях, можно выделить:
   - алгоритм поиска символа;
   - алгоритм установки  окна на последний (первый) символ, за-
писанного на ленту текста.

Ответы на задания

   Задача 1. Уменьшает ли использование команды вызова процедуры
количество работы для исполнителя?

   Ответ. Использование процедур может сократить текст  програм-
мы, но не время работы исполнителя, потому что количество команд
из СКИ, которое  роботу надлежит выполнить, останется тем же са-
мым.

     Задача 2. <<202.kor>> Текст на ленте, возможно, начинается
серией пробелов. Стереть все начальные пробелы,  если перед ра-
ботой окно установлено на начало текста.

┬─┬─┬─╦═╦─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
│░│░│░║ ║ │ │т│е│к│с│т│ │н│а│ │л│е│н│т│е│░│░│░│░│░│░│░│░│░│░│
┴─┴─┴─╩═╩─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴

   Решение.

ЭТО Стереть_пробелы
 ПОКА ПРОБЕЛ
 {
   ПИШИ ПУСТО
   ВПРАВО
 }
КОНЕЦ


   Задача 3. Зачем в условии задачи сказано, что число на ленте
должно быть больше 9?

  Решение.
   В случае числа 9 команда ПЛЮС, примененная к пустому месту на
ленте, заменила бы его нулем. В итоге получился бы странный ре-
зультат:
                      9+1=00


Задача 4. <<204.kor>>

   ┬─┬─┬─┬─╦═╦─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
   │░│░│░│░║с║а│в│а│у│░│░│░│░│░│░│░│░│░│░│░│░│░│░│░│░│░│░│░│
   ┴─┴─┴─┴─╩═╩─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴


   Какое слово  окажется  на  ленте  после  выполнения следующей
программы:

ЭТО Сава
 ПОВТОРИ 5
 {
   ЕСЛИ а
    ТО    ПОВТОРИ 14 ПЛЮС
    ИНАЧЕ МИНУС
    ВПРАВО
 }
КОНЕЦ

Ответ. На ленте окажется слово "робот".

    Задача 5. <<205.kor>>  На  ленте в соседних ячейках записаны
два символа. Упорядочить их по возрастанию  порядковых номеров в
алфавите Корректора. В начальный момент окно установлено на пер-
вый символ.

   Решение.

ЭТО Порядок
  ЯЩИК+
  ВПРАВО
  ЕСЛИ Я>Л
   ТО
   {
     ОБМЕН
     ВЛЕВО
     ОБМЕН
   }
КОНЕЦ

     Задача 6.  <<206.kor>>  На  ленте записан некоторый текст.
Проверить, есть ли в нем многоточие (три и  более подряд идущих
знака "."). Установить окно на начало  первого многоточия, если
они присутствуют в тексте или на первый пустой символ за концом
текста, если многоточие отсутствует. В начальный  момент в окно
виден первый символ текста.

Решение

ЭТО Проверка
 ЕСЛИ .                                
  ТО                                   
  {
    ВПРАВО
    ЕСЛИ .
    ТО
    {                                  
     ВПРАВО                            
     ЕСЛИ .
      ТО    ПОВТОРИ 2 ВЛЕВО            
      ИНАЧЕ Проверка                   
    }                                  
    ИНАЧЕ Проверка                     
  }                                    
  ИНАЧЕ                                
  {                                    
    ЕСЛИ НЕ ПУСТО                      
     ТО                                
     {                                 
      ВПРАВО                           
      Проверка                         
     }
  }                                    
КОНЕЦ                                  


3-ое занятие. Глава 3. Отладка программ (░11)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)
- команда из СКИ для работы с ящиком: ОБМЕН
- практическая отладка программы
  - синтаксические ошибки
  - логические ошибки.

Замечания и рекомендации

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


Ответы на задания

    Задача 1. <<301.kor>> На ленте записаны  два непустых симво-
ла. Один из них виден в окошко, расположение второго неизвестно.
Написать  программу,  которая  устанавливает символы в  соседних
клетках.

   Решение.

ЭТО Уплотнение
 ЯЩИК+
 ПИШИ ПУСТО
 ПОКА ПУСТО ВПРАВО
 ВЛЕВО
 ЯЩИК-
КОНЕЦ

   Пусть дети обратят  внимание  на частный случай: два символа
исходно стоят рядом.

4-ое занятие. Глава 4. Приемы программирования Корректора (░11)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)
- типичные приемы программирования Корректора
  - как найти конец и начало
  - как вернуться в исходное место (░21)
  - специальные символы-флаги

Замечания и рекомендации

   Занятие обобщает уже известные приемы программирования  Кор-
ректора ("как найти конец и начало") и вводит  новые ("как вер-
нуться в исходное место", "специальные символы-флаги").
   Рекомендуется разбирать  на уроке те примеры программ, кото-
рые приводятся в книге.
   Наиболее сложная (но  и красивая!) часть урока связана с ре-
курсивными возвратами к исходному положению окна на ленте. Этот
материал, конечно, довольно  сложен,  но прием с отложенной ко-
мандой в рекурсивных программах очень подробно рассматривался в
одной из тем Кукарачи. Если он был понят  детьми, то объяснение
его в Корректоре не должно вызвать дополнительных усилий.

Ответы на задания

    Задача 1. <<401.kor>> На ленте записан некоторый текст. Най-
ти в нем повторное вхождение первого символа. В начальный момент
окно установлено на первый символ текста.

  Решение
   Если текст содержит  символы,  совпадающие с первым, то окно,
после выполнения программы,  установится  на первый из них, если
такие символы отсутствуют - на первый пустой символ за текстом.

ЭТО Поиск_повтора
 Подготовка
 Поиск
КОНЕЦ

ЭТО Подготовка
 ЯЩИК+
КОНЕЦ

ЭТО Поиск
 ВПРАВО
 ЕСЛИ Я#Л
  ТО ЕСЛИ НЕ ПУСТО
      ТО Поиск
КОНЕЦ

    Задача 2. <<402.kor>>  В тексте на ленте первый символ, воз-
можно, повторяется. Найти последнее его вхождение в текст. В на-
чальный момент окно установлено на начало текста.

   Решение.

ЭТО Поиск_последнего_повт
 Подготовка                            
 На_конец_текста                       
 Поиск                                 
КОНЕЦ                                  
                                       
ЭТО Подготовка                         
 ЯЩИК+
КОНЕЦ                                  
                                       
ЭТО На_конец_текста                    
 ПОКА НЕ ПУСТО ВПРАВО                  
КОНЕЦ
                                       
ЭТО Поиск                              
 ВЛЕВО                                 
 ЕСЛИ Я#Л ТО Поиск                     
КОНЕЦ                                  

5-ое занятие. Глава 5. Арифметика чисел и палочек (░21)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)
- арифметика чисел
  - рекурсивный алгоритм добавления единицы к числу на ленте
    - формализм Плюс1(299) = Плюс1(29)0 = Плюс1(2)00 = 300
    - особый случай с числом 99999...
  - (?) рекурсивный алгоритм вычитания единицы от числа на ленте
    - формализм Минус1(240) = Минус1(24)9 = 239
    - особый случай с числом 1000...
- арифметика палочек
  - алгоритм сложения палочек
  - (?) алгоритм вычитания палочек
- (?) проблемы тестирования программ

Замечания и рекомендации

   Материал занятия очень насыщен и не прост. Обсудить и прора-
ботать все темы в  классе,  конечно, не удастся. Поэтому реко-
мендуется часть материала, отмеченного в выше приведенном плане
знаками (?)  оставить  детям для самостоятельного изучения дома
по книге.

Ответы на задания

    Задача 1. <<501.kor>>  На  ленте записан пример на вычитание
двух чисел (уменьшаемое больше  вычитаемого).  Вычислить резуль-
тат. В начальный момент окно установлено на знак "-".

   Решение.

   От обоих чисел  вычитаем по единице  до тех пор, пока  второе
число не станет нулем.

ЭТО Вычитание
 ВПРАВО
 ПОКА НЕ 0
 {
   // Установим окно на
   // конец второго числа
   ПОКА НЕ ПУСТО ВПРАВО
   ВЛЕВО
   // Отнимем 1 от второго числа
   Минус1
   // Установим окно на первое число
   ПОКА НЕ - ВЛЕВО
   ВЛЕВО
   // Отнимем 1 от первого числа
   Минус1
   // Установим окно на второе число
   ПОКА НЕ - ВПРАВО
   ВПРАВО
 }
 // Оформим результат
 ПИШИ ПУСТО
 ВЛЕВО
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Минус1
 Работа
 Проверка
КОНЕЦ

ЭТО Работа
 ЕСЛИ 0
  ТО
  {
    ПИШИ 9
    ВЛЕВО
    Работа
  }
  ИНАЧЕ МИНУС
КОНЕЦ

ЭТО Проверка
 ЕСЛИ 0
  ТО
  {
   ВЛЕВО
   ЕСЛИ НЕ ЦИФРА  // Слева от 0 нет
    ТО            // цифры
    {
     ПОВТОРИ 2 ВПРАВО
     // Справа от 0 есть цифра?
     ЕСЛИ ЦИФРА
      ТО
      {
       ВЛЕВО
       Сдвиг
      }
    }
  }
КОНЕЦ

ЭТО Сдвиг
 ВПРАВО
 ЕСЛИ НЕ ПУСТО
  ТО
  {
   // Сдвиг одного символа влево
   ЯЩИК+
   ВЛЕВО
   ЯЩИК-
   ВПРАВО
   Сдвиг
  }
  ИНАЧЕ
  {
    // Стереть последний символ
    // после сдвига
    ВЛЕВО
    ПИШИ ПУСТО
  }
  ВЛЕВО // Отложенная команда, она
        // возвращает окно на первую
        // цифру числа
КОНЕЦ


   Задача 2. <<502.kor>> На ленте записан пример вида:
                          число*2
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

   Решение.

   Приводим запись число*2 к виду число+число и используем про-
цедуру Сложение.

ЭТО Умножить_на_2                      
  Приведение
  Сложение                             
КОНЕЦ                                  

ЭТО Приведение                         
 ПИШИ +                                
 ВПРАВО                                
 ПИШИ ПУСТО                            
 ВЛЕВО                                 
 ПОКА НЕ ПУСТО ВЛЕВО                   
 ВПРАВО
 ПОКА НЕ +
 {                                     
   ЯЩИК+                               
   Копировать_символ                   
   ВПРАВО
 }                                     
КОНЕЦ                                  
                                       
ЭТО Копировать_символ                  
 ВПРАВО                                
 ЕСЛИ ПУСТО
  ТО    ЯЩИК-
  ИНАЧЕ Копировать_символ              
 ВЛЕВО                                 
КОНЕЦ
                                       
ЭТО Сложение                           
 ВПРАВО                                
 ПОКА НЕ 0                             
 {                                     
   // Установим окно на                
   // конец  второго числа
   ПОКА НЕ ПУСТО ВПРАВО
   ВЛЕВО                               
   // Отнимем 1 от второго числа       
   Минус1                              
   // Установим окно на первое число
   ПОКА НЕ + ВЛЕВО                     
   ВЛЕВО                               
   // Прибавим 1 к первому числу       
   Плюс1                               
   // Установим окно на                
   // начало второго числа
   ПОКА НЕ + ВПРАВО
   ВПРАВО                              
 }                                     
 // Оформим результат
 ПИШИ ПУСТО                            
 ВЛЕВО                                 
 ПИШИ ПУСТО                            
КОНЕЦ                                  
                                       
// Вспомогательные процедуры           
ЭТО Плюс1
 ЕСЛИ НЕ 9  // Если последняя цифра
   ТО       // не 9, то ...            
   {                                   
     ЕСЛИ ПУСТО    // Если пусто, то   
      ТО    ПИШИ 1 // записываем 1,
      ИНАЧЕ ПЛЮС   // иначе записываем 
   }               // следующий символ.
   ИНАЧЕ                               
   {        // Когда число заканчива-  
     ПИШИ 0 // ется на 9, заменяем де-
     ВЛЕВО  // вятку нулем и добавляем
     Плюс1  // один к числу слева.
   }                                   
КОНЕЦ                                  
ЭТО Минус1
 Работа                                
 Проверка                              
КОНЕЦ                                  
                                       
ЭТО Работа                             
 ЕСЛИ 0                                
  ТО
  {
    ПИШИ 9                             
    ВЛЕВО                              
    Работа                             
  }
  ИНАЧЕ МИНУС                          
КОНЕЦ                                  
ЭТО Проверка                           
 ЕСЛИ 0                                
  ТО                                   
  {
   ВЛЕВО
   ЕСЛИ НЕ ЦИФРА  // Слева от 0 нет    
    ТО            // цифры             
    {
     ПОВТОРИ 2 ВПРАВО                  
     // Справа от 0 есть цифра?        
     ЕСЛИ ЦИФРА                        
      ТО                               
      {                                
       ВЛЕВО                           
       Сдвиг
      }
    }                                  
  }                                    
КОНЕЦ                                  

ЭТО Сдвиг                              
 ВПРАВО                                
 ЕСЛИ НЕ ПУСТО                         
  ТО                                   
  {                                    
   // Сдвиг одного символа влево
   ЯЩИК+
   ВЛЕВО                               
   ЯЩИК-                               
   ВПРАВО
   Сдвиг                               
  }                                    
  ИНАЧЕ                                
  {                                    
    // Стереть последний символ        
    // после сдвига                    
    ВЛЕВО
    ПИШИ ПУСТО
  }                                    
  ВЛЕВО // Отложенная команда, она     
        // возвращает окно на первую   
        // цифру числа
КОНЕЦ                                  


   Задача 3. <<503.kor>> На ленте записан пример вида:
                          число*4
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

   Решение.

ЭТО Умножить_на_4
 Умножить_на_2
 ПИШИ *
 ВПРАВО
 ПИШИ 2
 ВЛЕВО
 Умножить_на_2
КОНЕЦ


   Задача 4. <<504.kor>> На ленте записан пример вида:
                          число*16
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

   Решение.

ЭТО Умножить_на_16
 ПОВТОРИ 2 ВПРАВО
 ПИШИ ПУСТО
 ПОВТОРИ 2 ВЛЕВО
 Умножить_на_4
 ПИШИ *
 ВПРАВО
 ПИШИ 4
 ВЛЕВО
 Умножить_на_4
КОНЕЦ

   Задача 5. <<505.kor>> На ленте записан пример вида:
                          число*3
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

   Решение.

   Приводим пример к виду:
                     числоПУСТОПУСТОЧИСЛО*2
   Сначала выполняем процедуру Умножить_на_2, получаем либо
                     числоПУСТОПУСТОчисло1, либо
                     числоПУСТОчисло1.
  Теперь приводим выражение к виду
                        число+число1
и выполняем процедуру Сложение.

ЭТО Умножить_на_3
 Приведение1
 Умножить_на_2
 Приведение2
 Сложение
КОНЕЦ

ЭТО Приведение1
 ВЛЕВО
 ПОКА НЕ ПУСТО
 {
   ЯЩИК+
   Копировать_символ_влево
   ВЛЕВО
 }
 ПОКА НЕ * ВПРАВО
КОНЕЦ

ЭТО Копировать_символ_влево
 ВЛЕВО
 ЕСЛИ НЕ ПУСТО
  ТО  Копировать_символ_влево
  ИНАЧЕ Установить_символ
 ВПРАВО
КОНЕЦ

ЭТО Установить_символ
 ПОВТОРИ 2 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ЯЩИК-
 ПОКА НЕ ПУСТО ВПРАВО
 ВПРАВО
КОНЕЦ

ЭТО Приведение2
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВЛЕВО
 ЕСЛИ ПУСТО
  ТО
  {
    ПИШИ +
    ВПРАВО
    Сдвиг_числа
    ПОКА НЕ + ВЛЕВО
  }
  ИНАЧЕ
  {
    ВПРАВО
    ПИШИ +
  }
КОНЕЦ

ЭТО Сдвиг_числа
 ВПРАВО
 ПОКА НЕ ПУСТО
 {
   ЯЩИК+
   ВЛЕВО
   ЯЩИК-
   ПОВТОРИ 2 ВПРАВО
 }
 ВЛЕВО
 ПИШИ ПУСТО
КОНЕЦ

   Задача 6. <<506.kor>> На ленте записан пример вида:
                          число*6
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

Решение.

ЭТО Умножение_на_6
 Умножить_на_2
 ПИШИ *
 ВПРАВО
 ПИШИ 3
 ВЛЕВО
 Умножить_на_3
КОНЕЦ

   Задача 7. <<507.kor>> На ленте записан пример вида:
                          число*24
   Вычислить результат.  В  начальный момент окно установлено на
знак умножения.

ЭТО Умножение_на_24
 ПОВТОРИ 2 ВПРАВО                      
 ПИШИ ПУСТО
 ПОВТОРИ 2 ВЛЕВО                       
 Умножение_на_6                        
 ПИШИ *                                
 ВПРАВО
 ПИШИ 4                                
 ВЛЕВО
 Умножить_на_4
КОНЕЦ

    Задача 8. <<508.kor>> Умножить палочное  число  на  2. В на-
чальный момент окно установлено на первую слева палочку.

   Решение. Программа работает для исходных чисел, не превышающих
по значению длину алфавита Корректора.

ЭТО Умножить_2
 Длина
 Добавить
КОНЕЦ

ЭТО Длина
 ОБМЕН
 ПИШИ 0
 ОБМЕН
 ПОКА НЕ ПУСТО
 {
   ОБМЕН
   ПЛЮС
   ОБМЕН
   ВПРАВО
 }
КОНЕЦ

ЭТО Добавить
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   ПИШИ |
   ВПРАВО
   ОБМЕН
 }
 ОБМЕН
КОНЕЦ


   Задача 9. <<509.kor>> Умножить палочное число на  3.  В начальный момент
окно установлено на первую слева палочку.

   Решение. Программа работает для исходных чисел, не превышающих
по значению длину алфавита Корректора.

ЭТО Умножить_3
 Длина
 Добавить
КОНЕЦ

ЭТО Длина
 ОБМЕН
 ПИШИ 0
 ОБМЕН
 ПОКА НЕ ПУСТО
 {
   ОБМЕН
   ПЛЮС
   ОБМЕН
   ВПРАВО
 }
КОНЕЦ

ЭТО Добавить
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   ПОВТОРИ 2
   {
      ПИШИ |
      ВПРАВО
   }
   ОБМЕН
 }
 ОБМЕН
КОНЕЦ


    Задача 10. <<510.kor>> Умножить  палочное  число на 6. В на-
чальный момент окно установлено на первую слева палочку.

     Решение. Программа  работает для исходных чисел, не превы-
шающих по значению длину алфавита Корректора.

ЭТО Умножить_6
 Длина
 Добавить
КОНЕЦ

ЭТО Длина
 ОБМЕН
 ПИШИ 0
 ОБМЕН
 ПОКА НЕ ПУСТО
 {
   ОБМЕН
   ПЛЮС
   ОБМЕН
   ВПРАВО
 }
КОНЕЦ

ЭТО Добавить
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   ПОВТОРИ 5
   {
      ПИШИ |
      ВПРАВО
   }
   ОБМЕН
 }
 ОБМЕН
КОНЕЦ

    Задача 11. <<511.kor>> На ленте записаны два палочных числа,
соединенные знаком вопроса.  Заменить знак "?" на один из знаков
"<", ">"  или "=" в  зависимости от отношения чисел. В начальный
момент окно установлено на первый символ записи.

    Решение.

ЭТО Проверка
 Дубль
 // Установка окна на знак "?"
 ПОКА НЕ ? ВПРАВО
 Работа_с_дублем
 Стереть_копию
 Установить_знак
КОНЕЦ

ЭТО Дубль
 ПОКА НЕ ПУСТО
 {
  ЯЩИК+   // Запомнить символ
  Перенос // Скопировать символ
  ВПРАВО  // Переместиться к следующему
 }
КОНЕЦ

ЭТО Перенос
 ВПРАВО
 ЕСЛИ ПУСТО
  ТО    Установка
  ИНАЧЕ Перенос
 ВЛЕВО
КОНЕЦ
ЭТО Установка
 ВПРАВО
 ПОКА НЕ ПУСТО ВПРАВО
 ЯЩИК-
 ПОКА НЕ ПУСТО ВЛЕВО
КОНЕЦ

ЭТО Работа_с_дублем
 Проверить_первое
 ОБМЕН
 ЕСЛИ 0
  ТО
  {
    ОБМЕН
    Проверить_второе
    ОБМЕН
    ЕСЛИ 0
     ТО
     {
       ПИШИ =
       ОБМЕН
     }
     ИНАЧЕ
     {
       ПИШИ <
       ОБМЕН
     }
  }
  ИНАЧЕ
  {
    ОБМЕН
    Проверить_второе
    ОБМЕН
    ЕСЛИ 0
     ТО
     {
       ПИШИ >
       ОБМЕН
     }
     ИНАЧЕ
     {
       ОБМЕН
       ПОКА НЕ ПУСТО ВЛЕВО
       ВПРАВО
       ПИШИ ПУСТО
       ВПРАВО
       ПОКА НЕ ПУСТО ВПРАВО
       ВЛЕВО
       ПИШИ ПУСТО
       ПОКА НЕ ? ВЛЕВО
       Работа_с_дублем
     }
  }
КОНЕЦ

ЭТО Проверить_первое
 ВЛЕВО
 ЕСЛИ ПУСТО
  ТО
  {
    ПИШИ 0
    ОБМЕН
    ПИШИ ПУСТО
   }
   ИНАЧЕ
   {
     ОБМЕН
     ПИШИ 1
     ОБМЕН
   }
 ПОКА НЕ ? ВПРАВО
КОНЕЦ

ЭТО Проверить_второе
 ПОКА НЕ ПУСТО ВПРАВО
 ВЛЕВО
 ЕСЛИ ?
  ТО
  {
      ПИШИ 0
      ОБМЕН
      ПИШИ ?
  }
  ИНАЧЕ
  {
    ОБМЕН
    ПИШИ 1
    ОБМЕН
  }
 ПОКА НЕ ? ВЛЕВО
КОНЕЦ

ЭТО Стереть_копию
 ПОКА НЕ ПУСТО ВПРАВО
 ВЛЕВО
 ПОКА НЕ ПУСТО
 {
   ПИШИ ПУСТО
   ВЛЕВО
 }
КОНЕЦ

ЭТО Установить_знак
 ПОКА НЕ ? ВЛЕВО
 ОБМЕН
КОНЕЦ

ЭТО Минус1
 ПОКА | ВЛЕВО
 ВПРАВО
 ПИШИ ПУСТО
КОНЕЦ


    Задача 12. <<512.kor>> Записать на ленту  через запятые пять
палочных чисел: 1, 2, 3, 4, 5.

   Решение.

ЭТО Последовательность
 ПИШИ ,
 ВПРАВО
 ПИШИ |
 ВПРАВО
 ПОВТОРИ 4
 {
   ПИШИ ,
   Запись_числа
 }
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Запись_числа
 ВЛЕВО
 ПОКА НЕ , ВЛЕВО
 ВПРАВО
 Копирование
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ |
 ВПРАВО
КОНЕЦ

ЭТО Копирование
 ПОКА |
 {
   Перенос
   ВПРАВО
 }
КОНЕЦ

ЭТО Перенос
 ВПРАВО
 ЕСЛИ ПУСТО
  ТО    ПИШИ |
  ИНАЧЕ Перенос
 ВЛЕВО
КОНЕЦ



   Задача 13. Записать на ленту:
     а) первые пять четных палочных числа <<513a.kor>>
     б) первые пять нечетных палочных числа <<513b.kor>>

Решение.

   а)

ЭТО Последовательность // 5 четных
 ПИШИ ,
 ВПРАВО
 ПИШИ |
 ВПРАВО
 ПИШИ |
 ВПРАВО
 ПОВТОРИ 4
 {
   ПИШИ ,
   Запись_числа
 }
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Запись_числа
 ВЛЕВО
 ПОКА НЕ , ВЛЕВО
 ВПРАВО
 Копирование
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ |
 ВПРАВО
 ПИШИ |
 ВПРАВО
КОНЕЦ

ЭТО Копирование
 ПОКА |
 {
   Перенос
   ВПРАВО
 }
КОНЕЦ

ЭТО Перенос
 ВПРАВО
 ЕСЛИ ПУСТО
  ТО    ПИШИ |
  ИНАЧЕ Перенос
 ВЛЕВО
КОНЕЦ

   б)
ЭТО Последовательность // 5 нечетных
 ПИШИ ,
 ВПРАВО
 ПИШИ |
 ВПРАВО
 ПОВТОРИ 4
 {
   ПИШИ ,
   Запись_числа
 }
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Запись_числа
 ВЛЕВО
 ПОКА НЕ , ВЛЕВО
 ВПРАВО
 Копирование
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ |
 ВПРАВО
 ПИШИ |
 ВПРАВО
КОНЕЦ

ЭТО Копирование
 ПОКА |
 {
   Перенос
   ВПРАВО
 }
КОНЕЦ

ЭТО Перенос
 ВПРАВО
 ЕСЛИ ПУСТО
  ТО    ПИШИ |
  ИНАЧЕ Перенос
 ВЛЕВО
КОНЕЦ

6-ое занятие. Глава 6. Преобразования, подсчеты, редактирование (░21)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)

- задачи про вычисление длины текста
- задачи на исправление ошибок в тексте

Замечания и рекомендации

   Это занятие предполагает использование всей мощи рассмотрен-
ных ранее приемов программирования Корректора.
   Урок можно построить одним из следующих способов.

   1. Разбор "полетов". Учитель  вместе  с детьми читают и ком-
ментируют Васины решения, приведенные в книге.
   2. Своя "игра". Учитель воссоздает на уроке Васины программы
вместе с детьми заново.
   3. Комбинация приемов  1 и 2  на уроке по отношению к разным
задачам.

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

Ответы на задания

     Задача  1.  <<601.kor>> На ленте записан текст не  длиннее
длины алфавита Корректора. Подсчитать  число  букв "о" в нем. В
начальный момент окно установлено на первый пустой символ перед
текстом.

   Решение.

ЭТО Подсчет_о
 Подготовка_счетчика
 Подсчет
 Оформление_результата
КОНЕЦ

ЭТО Подготовка_счетчика
 ПИШИ 0
 ЯЩИК+
 ПИШИ ПУСТО
 ВПРАВО
КОНЕЦ

ЭТО Подсчет
 ПОКА НЕ ПУСТО
 {
   ЕСЛИ о
    ТО
    {
      ОБМЕН
      ПЛЮС
      ОБМЕН
    }
   ВПРАВО
 }
КОНЕЦ

ЭТО Оформление_результата
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВЛЕВО
 ПИШИ =
 ВЛЕВО
 ПИШИ 0
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   Плюс1
   ПОКА НЕ = ВПРАВО
   ВЛЕВО
   ОБМЕН
 }
 ОБМЕН
КОНЕЦ

ЭТО Плюс1
 ЕСЛИ НЕ 9 // Если последняя
           // цифра не 9, то...
   ТО
   {
     ЕСЛИ ПУСТО    // если пусто, то
      ТО    ПИШИ 1 // записываем 1
      ИНАЧЕ ПЛЮС   // иначе ПЛЮС
   }
   ИНАЧЕ
   {
     ПИШИ 0 // Когда число заканчива-
            // ется на 9,
     ВЛЕВО  // заменяем девятку нулем
     Плюс1  // и  добавляем 1 к
            // числу слева.
   }
КОНЕЦ

    Задача 2.  <<602.kor>>  На  ленте записано число. Подсчитать
сумму наименьшей и наибольшей его цифры. В начальный момент окно
установлено на первую цифру числа.

Решение.

ЭТО Макс+Мин
 Найти_макс                            
 Запомнить_макс                        
 Найти_мин
 Сложить
КОНЕЦ

ЭТО Найти_макс
 ЯЩИК+
 ВПРАВО
 ПОКА НЕ ПУСТО
 {
   ЕСЛИ Я<Л ТО ЯЩИК+
   ВПРАВО
 }
КОНЕЦ

ЭТО Запомнить_макс
 ВПРАВО
 ЯЩИК-
 ПОВТОРИ 2 ВЛЕВО
КОНЕЦ

ЭТО Найти_мин
 ЯЩИК+
 ВЛЕВО
 ПОКА НЕ ПУСТО
 {
   ЕСЛИ Я>Л ТО ЯЩИК+
   ВЛЕВО
 }
КОНЕЦ

ЭТО Сложить
 ВПРАВО
 ПОКА НЕ ПУСТО ВПРАВО
 ВПРАВО
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   ПЛЮС
   ОБМЕН
 }
 ОБМЕН
 ЯЩИК+
 ПИШИ ПУСТО
 ПОВТОРИ 2 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ВЛЕВО
 ПИШИ =
 ВЛЕВО
 ПИШИ 0
 ОБМЕН
 ПОКА НЕ 0
 {
   МИНУС
   ОБМЕН
   Плюс1
   ПОКА НЕ = ВПРАВО
   ВЛЕВО
   ОБМЕН
 }
 ОБМЕН
КОНЕЦ

ЭТО Плюс1
 ЕСЛИ НЕ 9 // Если последняя
           // цифра не 9, то...
   ТО
   {
     ЕСЛИ ПУСТО    // если пусто, то
      ТО    ПИШИ 1 // записываем 1
      ИНАЧЕ ПЛЮС   // иначе ПЛЮС
   }
   ИНАЧЕ
   {
     ПИШИ 0 // Когда число заканчива-
            // ется на 9,
     ВЛЕВО  // заменяем девятку нулем
     Плюс1  // и  добавляем 1 к
            // числу слева.
   }
КОНЕЦ


    Задача 3. <<603.kor>> На ленте записан текст не длиннее дли-
ны алфавита Корректора. Подсчитать число двойных символов в нем.
В начальный момент  окно установлено на первый пустой символ пе-
ред текстом.

  Решение.

ЭТО Парные_символы
 Обнулить_счетчик
 Работа
 Ответ
КОНЕЦ

ЭТО Обнулить_счетчик
 ПИШИ 0
 ЯЩИК+
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Работа
 ВПРАВО
 ЕСЛИ НЕ ПУСТО
  ТО
  {
    ОБМЕН
    ВПРАВО
    ЕСЛИ Я=Л
     ТО
     {
       ВЛЕВО
       ПЛЮС
       ОБМЕН
     }
     ИНАЧЕ
     {
      ВЛЕВО
      ОБМЕН
     }
    Работа
  }
КОНЕЦ

ЭТО Ответ
 Подготовка
 Вычисления
КОНЕЦ

ЭТО Подготовка
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ПОВТОРИ 2 ВЛЕВО
 ПИШИ =
 ВЛЕВО
 ПИШИ 0
 ПОВТОРИ 2 ВПРАВО
 ЯЩИК-
КОНЕЦ

ЭТО Вычисления
 ПОКА НЕ 0
 {
   МИНУС
   ПОВТОРИ 2 ВЛЕВО
   Плюс1
   ПОКА НЕ = ВПРАВО
   ВПРАВО
 }
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Плюс1
 ЕСЛИ НЕ 9 // Если последняя
           // цифра не 9, то...
   ТО
   {
     ЕСЛИ ПУСТО    // если пусто, то
      ТО    ПИШИ 1 // записываем 1
      ИНАЧЕ ПЛЮС   // иначе ПЛЮС
   }
   ИНАЧЕ
   {
     ПИШИ 0 // Когда число заканчива-
            // ется на 9,
     ВЛЕВО  // заменяем девятку нулем
     Плюс1  // и  добавляем 1 к
            // числу слева.
   }
КОНЕЦ

     Задача  4.  <<604.kor>> На ленте записан текст не  длиннее
длины алфавита Корректора.  Записать на ленту число слов в нем.
В начальный момент окно установлено на первый пустой символ пе-
ред текстом.

Решение.

ЭТО Число_слов
 Обнуление_счетчика
 Работа
 Добавить_к_счетчику_1
 Ответ
КОНЕЦ

ЭТО Обнуление_счетчика
 ВЛЕВО
 ПИШИ 0
 ВПРАВО
КОНЕЦ

ЭТО Работа
 ВПРАВО
 ЕСЛИ НЕ ПУСТО
  ТО
  {
    ЕСЛИ ПРОБЕЛ
     ТО
     {
       Добавить_к_счетчику_1
       Пропустить_пробелы
     }
    Работа
  }
КОНЕЦ

ЭТО Добавить_к_счетчику_1
  ВЛЕВО
  ЕСЛИ НЕ ПУСТО
   ТО Добавить_к_счетчику_1
   ИНАЧЕ
   {
     ВЛЕВО
     ПЛЮС
     ВПРАВО
   }
  ВПРАВО // Отложенная команда. Она
         // возвращает окно на текущее
         // место в тексте.
КОНЕЦ

ЭТО Пропустить_пробелы
 ПОКА ПРОБЕЛ ВПРАВО
КОНЕЦ

ЭТО Ответ
 Подготовка
 Вычисления
КОНЕЦ

ЭТО Подготовка
 ВЛЕВО
 ПОКА НЕ ПУСТО ВЛЕВО
 ПОВТОРИ 2 ВЛЕВО
 ПИШИ =
 ВЛЕВО
 ПИШИ 0
 ПОВТОРИ 2 ВПРАВО
КОНЕЦ

ЭТО Вычисления
 ПОКА НЕ 0
 {
   МИНУС
   ПОВТОРИ 2 ВЛЕВО
   Плюс_1
   ПОКА НЕ = ВПРАВО
   ВПРАВО
 }
 ПИШИ ПУСТО
КОНЕЦ

ЭТО Плюс1
 ЕСЛИ НЕ 9 // Если последняя
           // цифра не 9, то...
   ТО
   {
     ЕСЛИ ПУСТО    // если пусто, то
      ТО    ПИШИ 1 // записываем 1
      ИНАЧЕ ПЛЮС   // иначе ПЛЮС
   }
   ИНАЧЕ
   {
     ПИШИ 0 // Когда число заканчива-
            // ется на 9,
     ВЛЕВО  // заменяем девятку нулем
     Плюс1  // и  добавляем 1 к
            // числу слева.
   }
КОНЕЦ

    Задача 5.  <<605.kor>> Окно установлено на единственный сим-
вол на ленте. Записать рядом с ним его порядковый номер  в алфа-
вите Корректора.

Решение.
ЭТО Номер
 ЯЩИК+
 ВЛЕВО
 ПИШИ =                                
 ВЛЕВО                                 
 ПИШИ 0                                
 ОБМЕН                                 
 ПОКА НЕ ПУСТО                         
 {
  МИНУС                                
  ОБМЕН                                
  Плюс_1
  ПОКА НЕ = ВПРАВО
  ВЛЕВО
  ОБМЕН
 }
 ОБМЕН
КОНЕЦ

ЭТО Плюс_1
 ЕСЛИ 9
   ТО    Девять
   ИНАЧЕ Цифра_не_девять
КОНЕЦ

ЭТО Цифра_не_девять
  ЕСЛИ ПУСТО
    ТО ПИШИ 1
    ИНАЧЕ ПЛЮС
КОНЕЦ

ЭТО Девять
 ПИШИ 0
 ВЛЕВО
 Плюс_1
КОНЕЦ

    Задача 6. <<606.kor>> На ленте записан текст. Убрать из него
лишние пробелы (каждую группу пробелов заменить на один пробел).
В начальный момент  окно установлено на первый пустой символ пе-
ред текстом.

Решение

ЭТО Лишние_пробелы
 ВПРАВО
 ПОКА НЕ ПУСТО
  {
    ВПРАВО
    ЕСЛИ ПРОБЕЛ
     ТО
     {
       // Если за первым пробелом есть
       // есть еще пробелы - удалять их
       ВПРАВО
       ПОКА ПРОБЕЛ Сдвиг
       ВЛЕВО
     }
  }
КОНЕЦ

ЭТО Сдвиг
 ЕСЛИ НЕ ПУСТО
   ТО
   {
     ЯЩИК+
     ВЛЕВО
     ЯЩИК-
     ВПРАВО
     ВПРАВО
     Сдвиг
     //------|Отложенная команда
     ВЛЕВО //|для возврата к месту
           //|с которого начался
     //------|сдвиг.
   }
   ИНАЧЕ
   {
     ВЛЕВО
     ПИШИ ПУСТО
     ВПРАВО
   }
КОНЕЦ


    Задача 7. <<607.kor>> На ленте записан текст. Добавить в не-
го пробелы после знаков препинания (.,!?:;), если они отсутству-
ют. В начальный  момент окно установлено на первый пустой символ
перед текстом.

 Решение.

ЭТО Вставка_пробелов                   
 ВПРАВО                                
 ПОКА НЕ ПУСТО                         
  {                                    
    ЕСЛИ . ТО Работа
    ЕСЛИ , ТО Работа                   
    ЕСЛИ ! ТО Работа                   
    ЕСЛИ ? ТО Работа                   
    ЕСЛИ : ТО Работа                   
    ЕСЛИ ; ТО Работа
    ВПРАВО
  }
КОНЕЦ

ЭТО Работа
 ВПРАВО
 ЕСЛИ НЕ ПРОБЕЛ ТО На_конец
 ПИШИ ПРОБЕЛ
КОНЕЦ

ЭТО На_конец
  ЕСЛИ НЕ ПУСТО
   ТО
   {
     ВПРАВО
     На_конец
     Сдвиг // Отложенная команда.
           // Она будет выполнена
           // столько раз сколько было
           // шагов вправо.
   }
КОНЕЦ

ЭТО Сдвиг
 ВЛЕВО
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ВЛЕВО
КОНЕЦ

    Задача 8. <<608.kor>> На ленте записан текст. В нем встреча-
ются символы #. Перед  текстом  записано слово, отделенное от ос-
новного текста  символом |. Заменить в  тексте все символы  # на
это слово. В начальный момент окно установлено на символ |, рас-
положенный между словом и текстом.

    Решение.
ЭТО Замена_#
 // Поставим разделитель в конце текста
 ВПРАВО                                
 ПОКА НЕ ПУСТО ВПРАВО                  
 ПИШИ |                                
 // Вернуться назад
 ВЛЕВО                                 
 ПОКА НЕ | ВЛЕВО
 // Основная работа
 ВПРАВО
 ПОКА НЕ |
  {
    ЕСЛИ #
      ТО Копировать_слово
      ИНАЧЕ
      {
        ЯЩИК+
        Копировать_символ
      }
    ВПРАВО
  }
КОНЕЦ

ЭТО Копировать_символ
  ВПРАВО
  ЕСЛИ НЕ ПУСТО ТО    Копировать_символ
                ИНАЧЕ ЯЩИК-
  ВЛЕВО  // Отложенная команда.
         // Она будет выполнена
         // столько раз, сколько было
         // шагов вправо.
КОНЕЦ

ЭТО Копировать_слово
 ВЛЕВО
 ЕСЛИ НЕ ПУСТО
  ТО    Копировать_слово
  ИНАЧЕ Перенос_слова
 ВПРАВО // Отложенная команда.
        // Она будет выполнена
        // столько раз, сколько было
        // шагов влево.
КОНЕЦ

ЭТО Перенос_слова
  ВПРАВО
  ПОКА НЕ |
  {
    ЯЩИК+
    Копировать_символ
    ВПРАВО
  }
  // Вернуться к началу слова
  ВЛЕВО
  ПОКА НЕ ПУСТО ВЛЕВО
КОНЕЦ

    Задача 9. <<609.kor>> На ленте записан  текст, заключенный в
символы | с обеих сторон. Перед  текстом записано двухсимвольное
слово (оно отделено от основного текста  символом |). Проверить,
входит ли слово в текст как составная часть. Если вхождение най-
дено, установить окно на  его  конец, в противном случае устано-
вить окно  на последний символ |  за концом текста.  В начальный
момент окно установлено на символ |,  расположенный между словом
и текстом.

 Решение.

ЭТО Поиск                              
  ПОКА НЕ ПУСТО                        
  {
    ВПРАВО
    Запомнить_первый_символ_слова
    ЕСЛИ Я=Л
     ТО
     {
       Запомнить_второй_символ_слова
       ВПРАВО
       ЕСЛИ Я=Л
        ТО    ПИШИ ПУСТО // для преры-
                         // вания цикла
        ИНАЧЕ ВЛЕВО
     }
  }
  ВЛЕВО
  ЕСЛИ НЕ |
   ТО
   {
     ВПРАВО
     ЯЩИК- // восстановление клетки на
           // ленте
   }
КОНЕЦ

ЭТО Запомнить_первый_символ_слова
  ВЛЕВО
  ЕСЛИ НЕ ПУСТО
   ТО
   {
     Запомнить_первый_символ_слова
     ВПРАВО
   }
   ИНАЧЕ
   {
     ВПРАВО
     ЯЩИК+
   }
КОНЕЦ

ЭТО Запомнить_второй_символ_слова
  ВЛЕВО
  ЕСЛИ НЕ ПУСТО
   ТО
   {
     Запомнить_второй_символ_слова
     ВПРАВО
   }
   ИНАЧЕ
   {
     ПОВТОРИ 2 ВПРАВО
     ЯЩИК+
     ВЛЕВО
   }
КОНЕЦ

    Задача 10.  <<610.kor>>  На ленте записан текст. Упорядочить
его символы по возрастанию их порядковых номеров в алфавите Кор-
ректора.  В  начальный момент окно установлено на первый  символ
текста.

Решение.

ЭТО Упорядочивание
 ВПРАВО
 ПОКА НЕ ПУСТО
 {
   ЯЩИК+
   ВЛЕВО
   ЕСЛИ Я<Л
    ТО
    {
      ОБМЕН
      ВПРАВО
      ОБМЕН
      Признак
    }
    ИНАЧЕ ВПРАВО
   ВПРАВО
  }
  ВПРАВО
  // Нужно ли делать новый проход?
  ЕСЛИ |
   ТО
   {
     ПИШИ ПУСТО
     Назад
     Упорядочивание
   }
КОНЕЦ
//-------------------------------------
// Процедура ставит знак | за концом
// текста и возвращает окно на
// прежнее место
//-------------------------------------
ЭТО Признак
 ЕСЛИ НЕ ПУСТО
  ТО
  {
    ВПРАВО
    Признак
    ВЛЕВО // Отложенная команда для
          // возврата окна на прежнее
          // место.
  }
  ИНАЧЕ
  {
    ВПРАВО
    ПИШИ |
    ВЛЕВО
  }
КОНЕЦ
//-------------------------------------
// Возврат от признака | на начало
// текста.
ЭТО Назад
  ПОВТОРИ 2 ВЛЕВО
  ПОКА НЕ ПУСТО ВЛЕВО
  ВПРАВО
КОНЕЦ


7-ое занятие. Глава 7. Трансляторы (░30)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

   Основные темы (план урока)

- понятие Транслятора
- идентификация объектов (лексический анализ)
  - проверка целого положительного числа
  - проверка любых целых чисел
  - проверка идентификаторов
- построение транслятора для Плюсика

Замечания и рекомендации
   Это занятие повышенной и сложности и  может быть рассмотрено
как факультативное.
   Если принято  решение  исключить  тему "Трансляторы" из рас-
смотрения, то занятие N7 может продолжать тему занятия N6.
   На турнире по программированию задач по этой теме для Коррек-
тора не будет.



Ответы на задания

     Задача 1.  <<701.kor>>  На ленте записан текст. Проверить,
является ли он числом, и записать результат проверки на ленте в
виде:
 цп - целое положительное
      (примеры: 75, +83)
 цо - целое отрицательное
      (пример: -17)
 дп - положительная десятичная дробь
      (примеры: 75.33, +35.79, .56, +.89)
 до - отрицательная десятичная дробь
      (пример: -60.45. -.78)
 пп - простая дробь положительная
      (пример: 55/65, +85/10)
 по - простая дробь отрицательная
      (пример: -25/45)
 ош - ошибка в записи
   В начальный момент окно установлено на первый символ текста.
   Замечание. Не забудьте  учесть тот факт, что наличие в записи
нескольких знаков ".", "/" - считается ошибкой.

 Решение.

//-------------------------------------
// Ящик:
//      0 - цп
//      1 - цо
//      2 - дп
//      3 - до
//      4 - пп
//      5 - по
//      6 - ош
//-------------------------------------
ЭТО Анализ_числа
 // Проверка знака числа
 ЕСЛИ +
  ТО { ОБМЕН ПИШИ 0 ОБМЕН ВПРАВО }
 ИНАЧЕ ЕСЛИ -
  ТО { ОБМЕН ПИШИ 1 ОБМЕН ВПРАВО }
 ИНАЧЕ ЕСЛИ ЦИФРА
  ТО { ОБМЕН ПИШИ 0 ОБМЕН ВПРАВО }
 // Проверка цифр до знака дроби
 ПОКА ЦИФРА ВПРАВО
 // Проверка знака дроби
 ЕСЛИ .
  ТО
  {
    ОБМЕН
    ЕСЛИ 0 ТО ПИШИ 2
    ЕСЛИ 1 ТО ПИШИ 3
    ОБМЕН
    ВПРАВО
  }
  ИНАЧЕ ЕСЛИ /
   ТО
   {
    ОБМЕН
    ЕСЛИ 0 ТО ПИШИ 4
    ЕСЛИ 1 ТО ПИШИ 5
    ОБМЕН
    ВПРАВО
   }
  ИНАЧЕ
  {
    ОБМЕН
    ПИШИ 6
    ОБМЕН
    ПОКА НЕ ПУСТО ВПРАВО
  }
  // Проверка цифр после знака дроби
  ПОКА НЕ ПУСТО
  {
    ЕСЛИ НЕ ЦИФРА
     ТО
     {
       ОБМЕН
       ПИШИ 6
       ОБМЕН
     }
     ВПРАВО
  }
  // Запись результата
  ВПРАВО
  ЯЩИК-
  ЕСЛИ 0 ТО { ПИШИ ц ВПРАВО ПИШИ п }
  ЕСЛИ 1 ТО { ПИШИ ц ВПРАВО ПИШИ о }
  ЕСЛИ 2 ТО { ПИШИ д ВПРАВО ПИШИ п }
  ЕСЛИ 3 ТО { ПИШИ д ВПРАВО ПИШИ о }
  ЕСЛИ 4 ТО { ПИШИ п ВПРАВО ПИШИ п }
  ЕСЛИ 5 ТО { ПИШИ п ВПРАВО ПИШИ о }
  ЕСЛИ 6 ТО { ПИШИ о ВПРАВО ПИШИ ш }
КОНЕЦ

    Задача 2. <<702.kor>> Идентификатор - это последовательность
из букв и  цифр, которая начинается с буквы. Проверить, является
ли текст на ленте идентификатором. В начальный момент окно уста-
новлено на первый символ текста.

Решение.

ЭТО Проверка                           
 Буква                                 
 ОБМЕН
 ЕСЛИ 0
  ТО
  {
   ОБМЕН
   Нет
  }
  ИНАЧЕ
  {
    ОБМЕН
    Работа
  }
КОНЕЦ

ЭТО Работа
 ВПРАВО
 ЕСЛИ НЕ ПУСТО
 ТО
 {
   Буква_или_цифра
   ОБМЕН
   ЕСЛИ 0
   ТО
   {
    ОБМЕН
    Нет
   }
   ИНАЧЕ
   {
    ОБМЕН
    Работа
   }
 }
 ИНАЧЕ Да
КОНЕЦ

ЭТО Буква
 ОБМЕН
 ПИШИ 9
 ОБМЕН
 ЕСЛИ Я<Л
  ТО
  {
    ОБМЕН
    ПИШИ ПРОБЕЛ
    ОБМЕН
    ЕСЛИ Я>Л
     ТО
     {
       ОБМЕН
       ПИШИ 1
       ОБМЕН
     }
     ИНАЧЕ
     {
       ОБМЕН
       ПИШИ 0
       ОБМЕН
     }
  }
  ИНАЧЕ
  {
    ОБМЕН
    ПИШИ 0
    ОБМЕН
  }
КОНЕЦ

ЭТО Буква_или_цифра
 Буква
 ОБМЕН
 ЕСЛИ 1
  ТО ОБМЕН
  ИНАЧЕ
  {
    ОБМЕН
    ЕСЛИ ЦИФРА
     ТО
     {
       ОБМЕН
       ПИШИ 1
       ОБМЕН
     }
     ИНАЧЕ
     {
       ОБМЕН
       ПИШИ 0
       ОБМЕН
     }
  }
КОНЕЦ

ЭТО Нет
 ПОКА НЕ ПУСТО ВПРАВО
 ВПРАВО
 ПИШИ н
 ВПРАВО
 ПИШИ е
 ВПРАВО
 ПИШИ т
КОНЕЦ

ЭТО Да
 ПОКА НЕ ПУСТО ВПРАВО
 ВПРАВО
 ПИШИ д
 ВПРАВО
 ПИШИ а
КОНЕЦ

   Задача 4. <<704.kor>>Перевести пример на сложение  нескольких
чисел  в  программу для Плюсика. Например, запись 25+7+20  может
быть преобразована  в  текст  п25п7сп20с.  В  начальный момент в
окошко виден первый пустой символ за записью примера.

    Решение

ЭТО Транслятор
 // Записать символ разделитель
 ПИШИ |
 // Окно на начало записи
 ВЛЕВО
 Первый_символ
 // Обработать первое число
 Число_в_конец_с_командой_п
 // Обработать остальные числа
 ПОКА +
 {
   // Стереть знак +
   ПИШИ ПУСТО
   ВПРАВО
   Число_в_конец_с_командами_пс
 }
 // Стереть разделитель
 ПИШИ ПУСТО
КОНЕЦ
//-------------------------------------
ЭТО Число_в_конец_с_командой_п
  Поставить_п
  Первый_символ
  ПОКА ЦИФРА
   {
     Символ_в_конец
     Первый_символ
   }
КОНЕЦ
//-------------------------------------
ЭТО Число_в_конец_с_командами_пс
  Поставить_п
  Первый_символ
  ПОКА ЦИФРА
   {
     Символ_в_конец
     Первый_символ
   }
  Поставить_с
  Первый_символ
КОНЕЦ
//-------------------------------------
ЭТО Символ_в_конец
 ЯЩИК+
 ПИШИ ПУСТО
 ВПРАВО
 ПОКА НЕ ПУСТО ВПРАВО
 ЯЩИК-
КОНЕЦ
//-------------------------------------
ЭТО Поставить_п
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ п
КОНЕЦ
//-------------------------------------
ЭТО Поставить_с
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ с
КОНЕЦ
//-------------------------------------
ЭТО Первый_символ
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
КОНЕЦ
//-------------------------------------
ЭТО Последний_символ
 ПОКА НЕ ПУСТО ВПРАВО
 ВЛЕВО
КОНЕЦ


   Задача 5. <<705.kor>> Арифметический  пример  содержит только
целые неотрицательные числа, соединенные знаками "+"  и "-". На-
писать программу для преобразования примера в программу для Плю-
сика. Например,  запись  100-20+67  может  быть  преобразована в
программу п100п20вп67с. В начальный момент в окошко виден первый
пустой символ за примером.

 Решение

ЭТО Транслятор
 // Записать символ разделитель        
 ПИШИ |
 // Окно на начало записи
 ВЛЕВО
 Первый_символ
 // Обработать первое число
 Число_в_конец_с_командой_п
 // Обработать остальные числа
 Работа
 // Стереть разделитель
 ПИШИ ПУСТО
КОНЕЦ
//-------------------------------------
ЭТО Работа
 ЕСЛИ       + ТО
              {
                Сложение
                Работа
              }
 ИНАЧЕ ЕСЛИ - ТО
              {
                Вычитание
                Работа
              }
КОНЕЦ
//-------------------------------------
ЭТО Сложение
 // Стереть знак +
 ПИШИ ПУСТО
 ВПРАВО
 Число_в_конец_с_командами_пс
КОНЕЦ
//-------------------------------------
ЭТО Вычитание
 // Стереть знак -
 ПИШИ ПУСТО
 ВПРАВО
 Число_в_конец_с_командами_пв
КОНЕЦ
//-------------------------------------
ЭТО Число_в_конец_с_командой_п
  Поставить_п
  Первый_символ
  ПОКА ЦИФРА
   {
     Символ_в_конец
     Первый_символ
   }
КОНЕЦ
//-------------------------------------
ЭТО Число_в_конец_с_командами_пс
  Поставить_п
  Первый_символ
  ПОКА ЦИФРА
   {
     Символ_в_конец
     Первый_символ
   }
  Поставить_с
  Первый_символ
КОНЕЦ
//-------------------------------------
ЭТО Число_в_конец_с_командами_пв
  Поставить_п
  Первый_символ
  ПОКА ЦИФРА
   {
     Символ_в_конец
     Первый_символ
   }
  Поставить_в
  Первый_символ
КОНЕЦ
//-------------------------------------
ЭТО Символ_в_конец
 ЯЩИК+
 ПИШИ ПУСТО
 ВПРАВО
 ПОКА НЕ ПУСТО ВПРАВО
 ЯЩИК-
КОНЕЦ
//-------------------------------------
ЭТО Поставить_п
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ п
КОНЕЦ
//-------------------------------------
ЭТО Поставить_с
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ с
КОНЕЦ
//-------------------------------------
ЭТО Поставить_в
 ПОКА НЕ ПУСТО ВПРАВО
 ПИШИ в
КОНЕЦ
//-------------------------------------
ЭТО Первый_символ
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
КОНЕЦ
//-------------------------------------
ЭТО Последний_символ
 ПОКА НЕ ПУСТО ВПРАВО
 ВЛЕВО
КОНЕЦ

Задача 7. <<707.kor>>
   Построить на  базе Корректора нового исполнителя со следующей
СКИ:
 п - ВПРАВО
 л - ВЛЕВО
 + - ПЛЮС
 - - МИНУС
 зs - ПИШИ s
 я+ - ЯЩИК+
 я- - ЯЩИК-
 о - ОБМЕН
   Информация на ленте Корректора имеет следующую структуру:
                программа|рабочая область|данные
   Программа составлена из команд СКИ нового исполнителя, следу-
ющих друг за другом без каких-либо разделителей.
   Рабочая область занимает 4 клетки, их  содержимое в начальный
момент произвольно. Рабочую область можно использовать для моде-
лирования ящика  нового исполнителя и временного хранения другой
информации.
   Данные,  подлежащие  обработке программой,  которая написана
для нового исполнителя, расположены за рабочей областью.
   Считается, что окно нового исполнителя установлено на первую
клетку данных.
   В начальный момент Корректор смотрит на первую команду прог-
раммы. Исполняя программу, Корректор в соответствии с командами
обрабатывает данные.  Обработка заканчивается, когда  выполнена
последняя команда.
   Написать программы для нового исполнителя, решающие следующие
задачи:
   а) Записать на ленту слово "кот";
   б) Перевернуть трехсимвольное слово в  области  данных "задом
наперед";
   в) В области данных записано трехзначное число, каждая цифра
которого больше единицы. От этого числа надо отнять число 111;
   г) В области данных записано трехзначное число, каждая цифра
которого не больше восьми. К этому числу прибавить число 111;
   д) Придумать другие  задачи для нового исполнителя и написать
для него программы, решающие эти задачи.

ЭТО Исполнитель
 На_начало_программы
 Обнулить_окно
 ПОКА НЕ |
 {
  ЕСЛИ       п ТО Вправо
  ИНАЧЕ ЕСЛИ л ТО Влево
  ИНАЧЕ ЕСЛИ + ТО Плюс
  ИНАЧЕ ЕСЛИ - ТО Минус
  ИНАЧЕ ЕСЛИ з ТО Пиши
  ИНАЧЕ ЕСЛИ я ТО Ящик
  ИНАЧЕ ЕСЛИ о ТО Обмен
  ВПРАВО
 }
 Установить_окно
КОНЕЦ
//-------------------------------------
ЭТО Вправо
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 ПЛЮС
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Влево
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 МИНУС
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Плюс
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 На_позицию_окна
 ПЛЮС
 Назад
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Минус
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 На_позицию_окна
 МИНУС
 Назад
 ПОВТОРИ 3 ВЛБВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Пиши
 ВПРАВО
 ЯЩИК+
 Запомнить_символ
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 На_позицию_окна
 Взять_символ
 ЯЩИК-
 Назад
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Ящик
 ВПРАВО
 ЕСЛИ +
   ТО    Ящик+
   ИНАЧЕ Ящик-
КОНЕЦ
//-------------------------------------
ЭТО Ящик+
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 На_позицию_окна
 ЯЩИК+
 Назад
 ПОВТОРИ 2 ВЛЕВО
 ЯЩИК-
 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Ящик-
 На_программный_счетчик
 ПОВТОРИ 3 ВПРАВО
 На_позицию_окна
 Взять_ящик
 ЯЩИК-
 Назад
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Обмен
 На_программный_счетчик
 // Копировать ящик в символ
 ВПРАВО
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ВПРАВО
 // С ленты в ящик
 На_позицию_окна
 ЯЩИК+
 Назад
 ПОВТОРИ 2 ВЛЕВО
 ЯЩИК-
 ПОВТОРИ 2 ВПРАВО
 // С символа на ленту
 На_позицию_окна
 Взять_символ
 ЯЩИК-
 Назад
 ПОВТОРИ 3 ВЛЕВО
 На_позицию_в_программе
КОНЕЦ
//-------------------------------------
ЭТО Запомнить_символ
 ВПРАВО
 ЕСЛИ |
  ТО
  {
    ПОВТОРИ 3 ВПРАВО
    ЯЩИК-
    ПОВТОРИ 3 ВЛЕВО
  }
  ИНАЧЕ Запомнить_символ
  ВЛЕВО // Отложенная команда
КОНЕЦ
//-------------------------------------
ЭТО Взять_символ
 ВЛЕВО
 ЕСЛИ |
  ТО
  {
    ПОВТОРИ 2 ВЛЕВО
    ЯЩИК+
    ПОВТОРИ 2 ВПРАВО
  }
  ИНАЧЕ Взять_символ
  ВПРАВО // Отложенная команда
КОНЕЦ
//-------------------------------------
ЭТО Взять_ящик
 ВЛЕВО
 ЕСЛИ |
  ТО
  {
    ПОВТОРИ 3 ВЛЕВО
    ЯЩИК+
    ПОВТОРИ 3 ВПРАВО
  }
  ИНАЧЕ Взять_ящик
  ВПРАВО // Отложенная команда
КОНЕЦ
//-------------------------------------
ЭТО На_программный_счетчик
 ОБМЕН
 ПИШИ 0
 ОБМЕН
 ВПРАВО
 ПОКА НЕ |
 {
   ОБМЕН
   ПЛЮС
   ОБМЕН
   ВПРАВО
 }
 ВПРАВО
 ЯЩИК-
КОНЕЦ
//-------------------------------------
ЭТО На_позицию_в_программе
 ЯЩИК+
 ПОВТОРИ 2 ВЛЕВО
 ОБМЕН
 ПОКА НЕ 0
  {
    МИНУС
    ОБМЕН
    ВЛЕВО
    ОБМЕН
  }
 ОБМЕН
КОНЕЦ
//-------------------------------------
ЭТО На_позицию_окна
 ЯЩИК+
 ПОВТОРИ 2 ВПРАВО
 ОБМЕН
 ПОКА НЕ 0
 {
    МИНУС
    ОБМЕН
    ВПРАВО
    ОБМЕН
 }
 ОБМЕН
КОНЕЦ
//-------------------------------------
ЭТО Назад
 ПОКА НЕ | ВЛЕВО
 ВЛЕВО
КОНЕЦ
//-------------------------------------
ЭТО Обнулить_окно
 ПОКА НЕ | ВПРАВО
 ПОВТОРИ 4 ВПРАВО
 ПИШИ 0
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
КОНЕЦ
//-------------------------------------
ЭТО Установить_окно
 ПОКА НЕ | ВПРАВО
 ПОВТОРИ 4 ВПРАВО
 На_позицию_окна
КОНЕЦ
//-------------------------------------
ЭТО На_начало_программы
 ПОКА НЕ ПУСТО ВЛЕВО
 ВПРАВО
КОНЕЦ
