                       Быстрое начало

                                                    А.А.Дуванов
                                           1997 (C) Роботландия

1. Знакомство с исполнителем
   Петя, студент университета, будущий программист, приехал  до-
мой на каникулы. Его брат,  Вася  очень этому рад, ведь он  тоже
увлечен информатикой и использует каждую встречу  с Петей, чтобы
задать ему многочисленные вопросы и поупражняться в практическом
программировании роботов.  На  этот  раз  приезд  брата для Васи
складывался особенно удачно:  папа  купил новый пакет программ с
исполнителем  Корректор,  и сегодня вся семья Куков собралась  у
компьютера, чтобы  познакомиться с этим новым исполнителем. Кро-
ме, мамы.  Надежду  Семеновну  больше волновал праздничный ужин,
затеянный в честь приезда старшего сына, и она  осталась на кух-
не.

1.1. Корректор и его среда обитания.

                                   - А меня зовут  Гена. Я рабо-
                                   таю в зоопарке Крокодилом.
                                   - А что  мы будем сейчас  де-
                                   лать?
                                   - Ничего. Давайте просто  по-
                                   беседуем.
                                                     Э.Успенский

   Папа. Привет ребята! Я принес для вас дискету  с новым робот-
ландским исполнителем.
   Петя. Новый исполнитель? Это интересно.
   Вася. А как его зовут?
   Папа. Сейчас  Петя  скопирует  дискету  на  винчестер  нашего
компьютера, и мы увидим Корректора - так зовут этого робота.
   Вася. Корректор - звучное имя.
   Папа. Корректорами называют людей, которые занимаются в изда-
тельствах правкой текста. Видимо, этот исполнитель  не зря полу-
чил свое имя.
   Петя. Готово! Я закончил копирование и  теперь запускаю прог-
раммный файл kor.exe.
   Папа. Сейчас  я перескажу то,  что узнал про Корректора в Ро-
ботландии, где приобрел дискету, а подробное  описание робота вы
прочитаете в сопровождающей документации.
   Итак, этого робота зовут Корректор.  Он  работает  с  длинной
лентой, которая разбита на клетки или  ячейки.  В  ячейку  может
быть записан  один символ. Символ -  это буква, цифра,  знак "+"
или что-нибудь еще в этом роде. Полный набор допустимых символов
составляет алфавит исполнителя и может настраиваться пользовате-
лем при помощи текстового файла kor.ini,  который расположен там
же на диске, где и запускаемый файл-программа kor.exe.
   Считается, что лента склеена в кольцо и спрятана в непрозрач-
ный для Корректора футляр. Исполнитель может  видеть только одну
ячейку ленты через специальное окно  в  футляре,  и записывать в
"оконную" ячейку любые символы из своего алфавита. Он может так-
же перемещать  окно вправо и влево  вдоль ленты и  таким образом
записывать символы в любые ячейки на ней.
   Вася. А может Корректор стирать символы на ленте?
   Папа. Исполнитель очищает ячейку, записывая в нее специальный
символ ПУСТО. Этот символ стоит самым первым в алфавите.
   Еще наш робот имеет ящик - специальную ячейку памяти, в кото-
рый может снимать копию с той клетки ленты, что видна  через ок-
но.
   Вот я специально  заготовил  листочек с описанием всех команд
Корректора и  тем  вариантом  его алфавита, который поставляется
Роботландией на дискете.

ВПРАВО - переместить окно на одну клетку ленты вправо
ВЛЕВО  - переместить окно на одну клетку ленты влево
ПИШИ символ - записать указанный символ в клетку на ленте
ЯЩИК+ - копировать символ с ленты в ящик
ЯЩИК- - копировать символ из ящика на ленту
ОБМЕН - поменять местами содержимое  ящика  и  "оконной"  ячейки
        ленты
ПЛЮС - заменить символ на ленте символом, следующим по порядку в
        алфавите Корректора.
МИНУС - заменить символ на ленте символом, предыдущим по порядку
        в алфавите Корректора.
СТОЯТЬ - пустая команда; ее выполнение не вызывает никаких изме-
        нений в среде робота.

      ┌────────────────────────────────────────────────────┐
      │                Алфавит Корректора                  │
      │                                                    │
      │ ПУСТО 0 1 2 3 4 5 6 7 8 9 а б в г д е ж з и й к л  │
      │ м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я   - + / *  │
      │ = < > ( ) [ ] { } . , ! ? ; : ' " # | $ % ~ @      │
      └────────────────────────────────────────────────────┘

   Порядок символов в алфавите очень важен. Команда ПЛЮС застав-
ляет исполнителя заменить  символ  в оконной ячейке на следующий
по порядку в алфавите, а команда МИНУС -  на предыдущий. Команда
ПЛЮС для последнего символа в алфавите и команда  МИНУС для пер-
вого, приводят к отказу  -  Корректор выводит на экран сообщение
"Не могу".

1.2. Попробуем управлять

                       Палку в воду бросит, а теленок принесет.
                       Скажет ему: "Лежать" - и Гаврюша лежит.
                       Прикажет ему Матроскин: "Взять! Куси!" -
                       тот сразу бежит и бодаться начинает.
                                                   Э.Успенский

   Вася. Пустите меня за компьютер, я  хочу попробовать поуправ-
лять Корректором.
   Петя. Пожалуйста!  Вот  тебе задание: пусть корректор напишет
на ленте слово "кот".
   Вася. А где мне писать команды?
   Папа. Команды для Корректора записываются в редакторе команд.
На экране поле  редактора команд изображено в виде узкой полоски
в правой нижней части экрана.
   Петя. Для того  чтобы войти в редактор команд, нужно щелкнуть
по этому полю левой кнопкой мыши.
   Вася. Готово!  Мышиный курсор заменился на прямоугольник вво-
да. Первая команда понятна:

                             ПИШИ к
 Команду я написал, но Корректор ничего не сделал!
   Папа. Для того  чтобы  Корректор выполнил команду, надо выйти
из редактора и щелкнуть мышкой по кнопке запуска (на ней написа-
но английское слово GO).
   Петя. В инструкции написано также, что можно выполнить запуск
не  выходя   из  редактора  команд,  нажав  клавиатурный  аккорд
Shift+Enter.
   Вася. Я думаю, последний способ удобнее.

   Вася  нажал  нужный аккорд (сначала клавишу Shift, затем,  не
отпуская ее, клавишу Enter) и Корректор записал в оконную ячейку
букву к:
          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │   │   │   │ к │   │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                                |

   Вася. Если я теперь задам команду ПИШИ о, то буква  к, конеч-
но, исчезнет. Понятно,  сначала  нужно переместить окно на ленте
вправо!

   Вася по-порядку записывал и запускал следующие команды:
                 ВПРАВО
                 ПИШИ о
                 ВПРАВО
                 ПИШИ т
 В конце работы исполнителя его лента выглядела так:

          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │   │ к │ о │ т │   │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                                |


1.3. Управление при помощи программы.

                        - Это по правилам, - отвечает Печкин, -
                        Я, может, вас очень люблю. Я, может,
                        плакать буду. А только правила нарушать
                        нельзя.
                                                    Э.Успенский

   Вася. Почти половина экрана занимает  темное  пустое  поле  с
одинокой надписью "Конец текста". Для чего оно нужно?
   Папа. Это поле редактора программ. В  него записываются прог-
раммы для исполнителя на специальном языке программирования.
   Петя. Этот язык  отличается от того, на котором мы записывали
программы для исполнителя  Кукарача?
   Папа. Он полностью с ним совпадает. Эти исполнители отличают-
ся своими средами и СКИ, но язык программирования для них один и
тот же.
   Вася. Я вспомнил! В  редакторе  программ можно один раз запи-
сать программу, а  затем запускать ее на выполнение столько раз,
сколько потребуется, не набирая ее заново.
     Петя. Войти  в  редактор  программ  можно, видимо, щелкнув
мышкой в его окошке, а программа записывается так:

                          ЭТО Имя
                           ...
                           команды
                           ...
                          КОНЕЦ

     Слова ЭТО и  КОНЕЦ  называют КЛЮЧЕВЫМИ словами. Между ними
записываются команды.
     Вася. После слова ЭТО я должен записать имя моей программы.
Это имя становится как бы именем новой команды для Кукарачи, хо-
тя такая команда, понятно, не входит в его СКИ. Написав програм-
му, можно  запустить ее на  выполнение, задав ее имя в редакторе
команд,  если,  конечно, управление Корректором такое же, как  и
Кукарачей.
     Папа. Ты прав, ведь и Корректор, и Кукарача создавались од-
ной и той  же  фирмой "Роботландия". Попробуй написать программу
для решения следующей задачи.

   Задача. На ленте записано четное число. Исполнитель в началь-
ный момент смотрит на пустую  клетку  за  последней цифрой этого
числа. Написать программу сложения числа на ленте с единицей.

   Вася. Как записать на ленту число, над которым будет работать
Корректор?
   Папа. Для этого нужно  войти  в редактор среды, щелкнув мышью
по иэображению ленты на экране.
   Вася. Подвожу мышиный курсор-стрелку к ленте  и нажимаю левую
кнопку мыши. Готово!
   Папа. Теперь ты  можешь набирать символы на клавиатуре, как в
обычном текстовом  редакторе.  Выход из редактора выполняется по
клавише Enter или Esc.

   Вася записал на ленту Корректора  число  124,  нажал  клавишу
Enter (на экране снова появился мышиный курсор) и задумался.

          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │   │ 1 │ 2 │ 4 │   │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                                    |
   Вася. В СКИ Корректора нет нужной команды.
   Папа.  Не  торопись. Посмотри еще раз на СКИ  повнимательнее.
   Вася. Я понял!  Нужно использовать команду ПЛЮС, когда в окне
видна последняя цифра  числа. Ведь эта команда заменяет символ в
окне на следующий  в алфавите. Цифры в алфавите идут по-порядку,
значит получится то, что нужно.
   Вася щелкнул мышкой по редактору программ (мышиный курсор за-
менился на прямоугольник ввода) и набрал следующую программу:
                ЭТО Плюс1
                 ВЛЕВО  // установить окно на последнюю цифру
                 ПЛЮС   // заменить цифру на следующую
                КОНЕЦ

   Васю написал КОММЕНТАРИИ в своей  короткой  программе.  Он  с
важным видом объяснил брату и отцу, что комментарии не обрабаты-
ваются компьютером, они записываются для удобства  программиста.
     И Вася, конечно, прав. С комментариями программа становится
более понятной: человеку ее легче читать и отлаживать. Для запи-
си комментариев в  программах Корректора, как и в программах Ку-
карачи, используют две косых черты "//". Они сами и все, что на-
ходится правее них до  конца  строки, не принимаются во внимание
при выполнении программы.
   Папа. Ну вот, программа записана. Выйди  из программного поля
по клавише Esc, набери в редакторе команд имя  твоей программы и
щелкни мышкой по экранной кнопке GO.
   Вася. Записываю Плюс1, нажимаю GO. Да, здорово, Корректор как
заводная игрушка трудится на поле, и,  что удивительно, действи-
тельно прибавляет к числу на ленте единицу!

          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │   │ 1 │ 2 │ 5 │   │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                                |

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

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

          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │   │ 1 │ 3 │ 5 │   │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                            |

   Вася. Не понял!
   Петя. Корректор начал выполнение твоей программы в том состо-
янии среды, которая осталась после первого запуска.
   Папа.  Для  установки среды в исходное положение нужно  перед
запуском нажать экранную кнопку с изображением знака "-".
   Вася щелкнул мышью по этой кнопке, на ленте восстановился на-
чальный текст 124, и окно переместилось в соответствии с услови-
ем задачи  на первый пустой символ  за ним. Теперь  новый запуск
программы прошел правильно, без каких-либо неожиданностей.
   Папа. Как вы думаете, почему в  условии  задачи  говорится  о
четном числе?
   Вася. Я думаю  программа будет работать и для нечетных чисел.
Если я запишу на ленту число 123, то  выполнение программы изме-
нит его на 124.  Ведь по команде ПЛЮС цифра 3 будет  заменена на
следующую в алфавите. В итоге тройка заменится на четверку.
   Петя. Я понял, в чем дело. Все дело в цифре 9.
   Вася. Ну, конечно,  я упустил это  из виду. Число  9  команда
ПЛЮС заменит на букву а. Вот почему папа  исключил девятку, зап-
ретив использовать нечетные числа.
   Папа. Все правильно, вы разгадали мою хитрость! Теперь давай-
те запишем нашу задачу  на диск и пойдем ужинать, а то  мама уже
начинает сердиться.
     Петя. Работа с  диском у Корректора выполняется так же, как
это было у Кукарачи?
   Папа. Абсолютно так же. Только имена программ Корректора име-
ют расширение kor, а не coc.
   Вася. Ну тогда я сам справлюсь с этой задачей. Нажимаю экран-
ную кнопку в верхнем полоске меню с изображением дискеты.
   На экране появилось  меню,  из которого теперь выбираю кнопку
"Запись".

                         ┌────────────┐
                         │  Новый     │
                         │  Чтение    │
                         │  Запись    │
                         │  Добавить  │
                         └────────────┘
   Теперь на экране появилось окно для ввода имени  файла, в ко-
тором на диске будет записана моя программа. Имя записываю в по-
ле ввода имени. Пусть это будет "1.kor".

┌──────────────────────────────────────────────────────────────┐
│ Картинка с экрана с изображением окна ввода имени            │
│┌────────────────────────────────────┐                        │
││┌──┐                            ┌──┐│                        │
│││| │           Запись           │Ok││<── Заголовок окна      │
││└──┘                            └──┘│                        │
│├────────────────────────────────────┤                        │
││┌──────────────────────────────────┐│                        │
│││C:\KOR\TASK\                      ││<── Текущий каталог     │
││└──────────────────────────────────┘│                        │
││ Имя файла     ┌───────────────┐┌──┐│                        │
││┌────────────┐ │ 8-6-1.kor     │├──┤│                        │
│││1.kor     <─┼─┼───────────────┼┼──┼┼─── Поле ввода имени    │
││└────────────┘ │ tsk2-1-0.kor  ││  ││                        │
││         ┌───┐ │ tsk2-1-1.kor  ││  ││                        │
││         │lat│<┼───────────────┼┼──┼┼─── Индикатор регистра  │
││         └───┘ │ tsk2-1-3.kor<─┼┼──┼┼─── Список файлов       │
││ Диски         │ tsk2-2-1.kor  ││<─┼┼─── Линейка протяжки    │
││┌────────────┐ │ tsk2-2-2.kor  ││  ││                        │
│││ a b c d f<─┼─┼───────────────┼┼──┼┼─── Список дисководов   │
│││            │ │ tsk2-2-4.kor  │├──┤│                        │
││└────────────┘ └───────────────┘└──┘│                        │
│└────────────────────────────────────┘                        │
│                                                              │
└──────────────────────────────────────────────────────────────┘
   Теперь щелкаю по экранной кнопке Ok в правом верхнем углу ок-
на, и моя программа записывается на диск.
   Папа. Очень хорошо. Кроме программы на  диск запишется состо-
яние среды  и имя команды "Плюс1"  из редактора команд.  Все это
появится на экране, если ты поработаешь в дисковом  меню с режи-
мом "Чтение".
   Вася. А для  служат еще две позиции дискового меню Корректора
"Новый" и "Добавить"?
   Папа. По  команде  "Новый",  среда исполнителя, программное и
командное поле будут очищены  от  всей информации, которая в них
записана. Этот раздел меню выбирается, когда  решена одна задача
и нужно приступить к решению следующей.  Позиция "Добавить" поз-
воляет "подклеить" к тексту на экране  программу  с  диска.  Это
часто требуется, когда одна программа используется  в другой как
составная часть.
   Петя. Помнится, у Кукарачи языковая конструкция
   ЭТО
   ...
   КОНЕЦ
которую мы сегодня рассматривали, называлась ПРОЦЕДУРОЙ, а прог-
рамма могла содержать  не одну процедуру, а несколько. У Коррек-
тора это свойство языка сохранилось?
   Папа. Я уже говорил, что язык программирования для Корректора
полностью совпадает  с  языком  программирования для Кукарачи. И
все на этом. Пойдемте ужинать. После ужина можете почитать доку-
ментацию. Она расположена  в подкаталоге DOC каталога KOR, в ко-
торый мы сегодня скопировали нашего исполнителя.

2. Язык программирования Корректора

                              И стал он  галчонка учить разгова-
                              ривать. Целыми днями  сидел  около
                              него и говорил:
                              - Кто там? Кто там? Кто там?
                                                     Э.Успенский

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

2.1. Процедурное программирование

   Папа. Начнем нашу  работу с такой задачи: на ленте Корректора
записан один символ, и он виден через окошко в футляре. Требует-
ся записать рядом  с ним еще пять символов, последовательно иду-
щих в алфавите исполнителя за тме, что виден в окошке.
   Вася. Значит, если на ленте записан символ 0,  то нужно напи-
сать еще символы 1,2,3,4,5.
   Петя. А  если на ленте  записан символ 8, то новыми символами
будут 9, а, б, в, г.
   Папа. Вы правильно поняли условие. Давайте  сначала решим бо-
лее простую задачу: пусть требуется записать на ленту не пять, а
только один новый символ по тому же правилу. Как ее решить?
   Петя. Я, думаю, надо  скопировать  символ в соседнюю ячейку и
применить к копии команду ПЛЮС.
   Папа. А как скопировать символ?
   Петя. В  среде Корректора кроме  ленты есть ящик - эта ячейка
памяти вполне подходит для наших целей.
   Вася. Мне все ясно! Вот мое решение:

ЭТО Следующий_символ
 ЯЩИК+   // ┌───────────────────┐
 ВПРАВО  // │Копирование символа│
 ЯЩИК-   // └───────────────────┘
 ПЛЮС    // Заменить символ на следующий
КОНЕЦ

   Папа. Очень хорошо! Ну, теперь я думаю, несложно решить зада-
чу в начальной постановке.
   Петя. Ничего нет проще. Нужно просто повторить процедуру Сле-
дующий_символ пять раз.
   Вася. Получается длинная программа... В ней будет 20 команд:
ЭТО Символы_по_порядку
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ПЛЮС
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ПЛЮС
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ПЛЮС
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ПЛЮС
 ЯЩИК+
 ВПРАВО
 ЯЩИК-
 ПЛЮС
КОНЕЦ
     Петя. Запись  можно  существенно сократить, используя в ка-
честве команды вызов процедуры Следующий_символ.
     Вася. Да,  конечно,  мы  так делали, программируя Кукарачу.
Теперь я вспомнил преимущество процедур! Их  вызов можно исполь-
зовать многократно,  и это здорово экономит усилия программиста!
Вот мое новое решение:

ЭТО Символы_по_порядку
 Следующий_символ
 Следующий_символ
 Следующий_символ
 Следующий_символ
 Следующий_символ
КОНЕЦ

   Петя. Преимущество ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ еще и в том,
что  программы  становятся более простыми и наглядными, так  как
раскладываются  на  множество  маленьких  процедур,  описывающих
простые и короткие действия.
   Папа.  Прошу  вас заметить, что использовать имя процедуры  в
качестве команды позволяет  нам не СКИ исполнителя, а язык прог-
раммирования.
   Вася. Процедуры как  бы  расширяют СКИ, "дополняя" его новыми
командами.
   Петя. Эта одна точка  зрения.  А можно, наоборот, считать ко-
манды из СКИ специальными стандартными процедурами, понятные ин-
терпретатору программ без описаний.
   Вася. Напомните мне, пожалуйста, что такое интерпретатор.
   Петя. Я готов. Исполнитель понимает и выполняет только коман-
ды из своей СКИ, такие, как ВПРАВО, ВЛЕВО, ПЛЮС. Мы пишем коман-
ду Следующий_символ, а ее нет в  СКИ. Тем не  менее, исполнитель
прекрасно работает и не выдает сообщения "Не понимаю". Почему?
   Вася. Мы пишем для него программу.
   Петя. И что, он ее выполняет?
   Вася. Конечно,  ты же сам видел, как он забавно  трудился над
лентой и ящиком.
   Петя. И Корректор выполнял команду Следующий_символ, она ведь
не входит в его СКИ?
   Вася. Ну, не знаю.
   Петя. На самом деле  программу  выполняет не Корректор, а ин-
терпретатор. Он  читает твою программу  и переводит ее в СКИ ис-
полнителя.
   Вася.  Кажется, я поминаю. Когда интерпретатор читает в  моей
программе команду  Следующий_символ,  он  передает исполнителю 5
команд из его СКИ.
     Петя. Точно.  Интерпретатор - это переводчик. Он позволяет
использовать язык  программирования,  а это очень облегчает уп-
равление роботом.
   Вася. А как выглядит интерпретатор на экране компьютера?
   Петя. Никак. Интерпретатор - это одна  из процедур программы,
моделирующей исполнителя на компьютере, и  он не имеет на экране
никакого внешнего отображения.

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

2.2. Циклы

   Папа. Запись нашей  последней  программы можно сделать более
компактной и наглядной, используя команду цикла ПОВТОРИ.
   Петя. Я  напомню  эту конструкцию языка программирования. Эта
команда выглядит так:

                      ПОВТОРИ число команда

   ПОВТОРИ - это ключевое слово языка, "число" - это целое поло-
жительное число,  обозначающее число повторений, "команда" - это
любая команда языка (только одна!), которая подлежит повторению.
   Вася. Вот новый  вариант нашей программы. С командой цикла он
выглядит гораздо веселее.

ЭТО Следующий_символ
 ЯЩИК+   // ┌───────────────────┐
 ВПРАВО  // │Копирование символа│
 ЯЩИК-   // └───────────────────┘
 ПЛЮС    // Заменить символ на следующий
КОНЕЦ

ЭТО Символы_по_порядку
 ПОВТОРИ 5 Следующий_символ
КОНЕЦ

   Петя.  Эту  программу можно записать в виде одной  процедуры,
используя составную команду:

ЭТО Символы_по_порядку
 ПОВТОРИ 5
 {
   ЯЩИК+
   ВПРАВО
   ЯЩИК-
   ПЛЮС
 }
КОНЕЦ

   Папа. Так, конечно, сделать можно. Составная команда позволя-
ет объединять несколько команд  в  одну при помощи фигурных ско-
бок. Но, на мой  взгляд,  последняя программа чуть хуже предыду-
щей, так как она менее наглядна.
   Формулирую следующую  задачу:  лента Корректора пуста, за ис-
ключением одной ячейки, в которую записан некоторый символ. Тре-
буется найти этот символ и показать его в окне.
   Петя. Я думаю,  самое удобное средство языка для решения этой
задачи - цикл ПОКА.
   Вася. Я помню, как выглядит этот цикл:

                      ПОКА условие команда

Работает цикл так:
     - Сначала проверяется условие.
     - Если условие ложно, выполнение команды повторения закан-
чивается.
     - Если условие истинно,  выполняется "команда", записанная
после условия,  и  все начинается сначала: проверяется условие,
выполняется команда и так далее.
   Петя. Верно! Заметь,  что если условие ложно с самого начала,
то "команда", записанная после условия, не выполнится ни разу.
   Папа. Осталось рассказать, как записывается и проверяется ус-
ловие.
   Петя. Обычно  в качестве условия записывают символ. Интерпре-
татор будет сравнивать  этот символ с тем, который Корректор ви-
дит через окошко на ленте. Если они совпадают, условие считается
выполненным, если отличаются - условие ложно.
   Папа. Для обозначения пробела и пустого места можно использо-
вать ключевые слова ПРОБЕЛ и ПУСТО. Эти же  ключевые слова можно
применять и в команде ПИШИ.
   Петя. Еще одна важная деталь.  При  записи  условия можно ис-
пользовать ключевое слово НЕ. Это слово  означает, что интерпре-
татор программ будет проверять условие наоборот: когда символ на
ленте не совпадает  с указанным после слова ПОКА, условие счита-
ется выполненным.
   Вася. Сейчас ключевое  слово НЕ, я думаю, нам не потребуется.
Ведь Корректор должен перемещать окно на  ленте (например, впра-
во), пока в нем пусто.  Как  только в окошке появится не  пустой
символ, работа его заканчивается:

 ЭТО Поиск_символа
   ПОКА ПУСТО ВПРАВО
 КОНЕЦ

   Папа. Верное  решение. А вот вам  задача, где как  раз удобно
воспользоваться ключевым  словом  НЕ: на ленте записан некоторый
текст, содержащий пробелы. Установить окно на первый пробел, ес-
ли в начальный момент в окно виден первый символ текста.
   Вася. Корректор должен перемещать окно вправо,  пока видимый в
нем символ - не пробел:

 ЭТО Поиск_пробела
   ПОКА НЕ ПРОБЕЛ ВПРАВО
 КОНЕЦ

   Петя. В инструкции указано еще несколько разновидностей усло-
вия. Они связаны со сравнением символа в оконной  ячейке ленты с
символом, расположенным в ящике:
   Я=Л - условие истинно, если символ в ящике совпадает с симво-
   лом в оконной ячейке ленты;
   Я#Л - условие истинно, если символ в ящике отличается от сим-
   вола в оконной ячейке ленты;
   Я>Л - условие истинно, если символ в ящике  имеет больший по-
рядковый номер в алфавите  Корректора  по сравнению с символом в
оконной ячейке ленты;
   Я<Л - условие истинно, если символ в ящике  имеет меньший по-
рядковый номер в алфавите  Корректора  по сравнению с символом в
оконной ячейке ленты.
   Папа. Ну  вот еще одна  задача, где пригодятся эти типы усло-
вия: на  ленте записан текст  и окошко установлено на первый его
символ. Известно, что первый символ  встречается  в  тексте  еще
несколько раз. Найти первое его повторение.
   Вася. Если бы у  Корректора не было ящика, я бы не  знал, как
решить эту  задачу. Ну, а с ящиком все  очень просто: сначала мы
поместим в него первый  символ  текста, а затем будем перемещать
окно вдоль текста, пока символ в ящике и на ленте отличаются:

 ЭТО Поиск_повтора
   ЯЩИК+
   ПОКА Я#Л ВПРАВО
 КОНЕЦ

   Петя. И еще,  в  качестве условия можно использовать ключевое
слово ЦИФРА. Оно принимает  истинное  значение, если в окошке на
ленте записан любой из символов 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
   Папа. Простая  задача  на  использование  этого типа условия:
найти в тексте на ленте  первое  вхождение  цифры (установить на
нее окно). Если  в тексте цифр  нет, установить окно  на  первый
пустой символ справа. В начальный момент окно установлено на на-
чало текста.
   Вася. Вот мое решение:

 ЭТО Поиск_цифры
   ПОКА НЕ ЦИФРА ВПРАВО
 КОНЕЦ

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

2.3. Развилки
   Вася. Решая задачи Кукарачи, мы использовали еще одну команду
языка программирования - команду ветвления.
   Петя. И ты помнишь, как ее записывать?
   Вася. Помню.  Команда ветвления содержит ключевые слова ЕСЛИ,
ТО, ИНАЧЕ. Вот как она выглядит:
                 ЕСЛИ условие
                  ТО    команда1
                  ИНАЧЕ команда2
   Слова ЕСЛИ, ТО, ИНАЧЕ здесь ключевые слова языка программиро-
вания. Они как цемент связывают команду ветвления воедино. Рабо-
тает новая команда так: интерпретатор программ проверяет условие
и, если  оно верное, выполняет  команду 1, если условие ложное -
выполняет команду 2.  В любом случае работает только одна коман-
да, либо команда 1, либо команда 2. Условие  в команде ветвления
записывается и проверяется точно так же, как в команде цикла ПО-
КА.
   Петя. Правильно! Покажи, как она работает  на примере решения
следующей задачи:  на  ленте записано целое положительное число,
меньшее 90. Увеличить его на один, если в начальный момент в ок-
но виден последний символ числа.
   Вася. Но такая  задача уже была,  и она решается  без  всяких
ветвлений одной командой ПЛЮС!
   Петя. Не торопись. А если число оканчивается на цифру девять?
   Вася. Да... Тогда  по команде ПЛЮС на место девятки запишется
буква а. Я  понял! Тут, действительно, без развилки не обойтись.
Сначала надо проверить последнюю цифру.  Если  она  - не девять,
применить  команду  ПЛЮС, а если - девять, обработать  отдельно:
вместо девятки записать  ноль,  сместиться влево и применить ко-
манду ПЛЮС  к первой цифре числа.  Этот ПЛЮС сработает  всегда -
ведь по условию первая цифра не может быть девяткой. Вот мое ре-
шение:

ЭТО Плюс1
 ЕСЛИ 9
  ТО    Девять // Особый случай
  ИНАЧЕ ПЛЮС
КОНЕЦ

ЭТО Девять
 ПИШИ 0
 ВЛЕВО
 ПЛЮС
КОНЕЦ

   Папа. Обращаю еще раз ваше внимание на то, что после  слов ТО
и ИНАЧЕ можно писать только одну  команду.  Кроме  того,  запись
"ИНАЧЕ команда2"  может отсутствовать, и тогда команда принимает
вид:
                 ЕСЛИ условие
                  ТО  команда1
   Эта запись равнозначна следующей:
                 ЕСЛИ условие
                  ТО  команда1
                  ИНАЧЕ СТОЯТЬ
   Команда  СТОЯТЬ  из СКИ - пустая: выполняя  ее, Корректор  не
предпринимает никаких действий.
   Вот  вам  еще  одна  "развилочная" задача: на  ленте  записан
текст, в котором злоумышленник заменил все  буквы  "л"  на  "к".
Восстановить исходный вид текст. В начальный момент в окно виден
первый символ записи.
   Вася. Какой текст мне записать на ленту?
   Папа. Ну, давай запишем текст "киса на кугу"  и пусть Коррек-
тор его расшифрует.

   Вася вошел в редактор среды,  записал  на  ленту эту забавную
фразу и стал думать, как написать решение.

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

  ЭТО Шифр
   ПОКА НЕ ПУСТО
   {
     Проверка
     Шаг
   }
  КОНЕЦ

   Петя. Неплохо! Мне кажется, занятия с Кукарачей не прошли для
тебя даром.

   Вася, довольный похвалой брата, продолжал свои рассуждения.

   Вася. Проверка будет содержать команду ветвления: если в окне
видна буква "к", то ее нужно заменить на букву "л":

ЭТО Проверка
 ЕСЛИ к ТО ПИШИ л
КОНЕЦ

   Ну, а процедура Шаг совсем проста: она просто перемещает окно
на одну клетку вправо:

ЭТО Шаг
 ВПРАВО
КОНЕЦ

Я думаю, можно записать мою программу в виде одной процедуры.

   Папа. Конечно можно,  но это хуже. Если все-таки это сделать,
необходимо использовать комментарии, так как содержательные име-
на процедур Проверка и Шаг исчезают:

  ЭТО Шифр
   ПОКА НЕ ПУСТО
   {
     ЕСЛИ к ТО ПИШИ л  // Проверка и замена, если нужно
     ВПРАВО            // Шаг к следующему символу
   }
  КОНЕЦ

Задача 3.

          ┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬
          │   │   │ с │ а │ в │ а │ у │   │   │   │   │
          ┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴───┴
                    |

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

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

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

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

ЭТО Поход
 ВПРАВО
 Поход
КОНЕЦ

то Корректор  как  заводная игрушка будет безостановочно переме-
щать окно вдоль ленты, пока мы не выключим компьютер, ведь лента
склеена в кольцо!
   Петя. Выключать компьютер не  надо,  в любой момен можно пре-
вать работу программы нажав клавишу Pause, а в остальном ты, ко-
нечно, прав.  Такая программа называется РЕКУРСИВНОЙ. Рекурсия -
это способ программирования, при котором программа вызывает сама
себя. Рекурсия, которая не имеет  проверки  на  окончание, как в
твоей программе, называется БЕСКОНЕЧНОЙ.
   Папа. Поробуйте переписать программу Шифр в рекурсивном вари-
анте.

   Вася и Петя немного поспорили, но потом пришли к единому мне-
нию и показали папе свое решение:

  ЭТО Шифр
     ЕСЛИ к ТО ПИШИ л  // Проверка и замена, если нужно
     ВПРАВО            // Шаг к следующему символу
     ЕСЛИ НЕ ПУСТО     // Проверка на окончание
      ТО Шифр          // Рекурсивный вызов
   }
  КОНЕЦ


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