ДРоботландский Университет 
2000/2001 учебный год
Курс 31 "Азы программирования"
Корректор
------------------------------------------------
     Р О Б О Т Л А Н Д С К О Е  П Р О Г Р А М М И Р О В А Н И Е

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

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

                                      Пособие   распространяется
                                      только в рамках  Роботлан-
                                      дских  Курсов  и  является
                                      объектом авторского права.

                       К О Р Р Е К Т О Р


Глава 1. Знакомство с исполнителем


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

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

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

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


          ┬───┬───┬───┬───┬───╬═══╬───┬───┬───┬───┬───┬
          │ ░ │ ░ │ ░ │ ░ │ ░ ║ ░ ║ ░ │ ░ │ ░ │ ░ │ ░ │
          ┴───┴───┴───┴───┴───╬═══╬───┴───┴───┴───┴───┴
                                │
     ╔═══╗                      └── это окно на ленте
     ║ ░ ║ ──── это ящик исполнителя
     ╚═══╝

    Символ ░ - обозначает пустую ячейку на ленте и в ящике

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

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

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

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

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

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

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

   Вася. Пустите меня за компьютер, я  хочу попробовать поуправ-
лять Корректором.
   Петя. Пожалуйста!  Вот  тебе задание: пусть Корректор напишет
на ленте слово "кот".
   Вася. А где мне писать команды?
   Папа. Команды для Корректора записываются в редакторе команд.
На экране он изображен в виде узкой полоски в правой нижней час-
ти экрана:
                 ┌───── редактор команд ──────────┐
   ┌──┐┌──┐┌──┐ ┌──────────────────────────────────┐
   │| ││- ││GO│ │█                                 │
   └──┘└──┘└──┘ └──────────────────────────────────┘
     │   │   └───── кнопка запуска
     │   └───────── кнопка установки среды в начальное положение
     └───────────── кнопка установки режима выполнения программы

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

                             ПИШИ к

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

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

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

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

         ┬─┬─┬─┬─┬─┬─┬─┬─╦═╦──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
         │░│░│░│░│░│░│к│о║т║ ░│░│░│░│░│░│░│░│░│░│░│░│░│
         ┴─┴─┴─┴─┴─┴─┴─┴─╩═╩──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴

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

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

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

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

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

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

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

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

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

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

         ┬─┬─┬─┬─┬─┬─┬─┬─╦═╦──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
         │░│░│░│░│░│1│2│3║░║ ░│░│░│░│░│░│░│░│░│░│░│░│░│
         ┴─┴─┴─┴─┴─┴─┴─┴─╩═╩──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴

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

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

         ┬─┬─┬─┬─┬─┬─┬─┬─╦═╦──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
         │░│░│░│░│░│░│1│2║5║ ░│░│░│░│░│░│░│░│░│░│░│░│░│
         ┴─┴─┴─┴─┴─┴─┴─┴─╩═╩──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴

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

   Вася еще раз нажал кнопку  GO,  Корректор  послушно  выполнил
программу, но, к  удивлению Васи, на ленте получилось число 135,
а не 125 как он ожидал.
         ┬─┬─┬─┬─┬─┬─┬─┬─╦═╦──┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬
         │░│░│░│░│░│░│░│1║3║ 5│░│░│░│░│░│░│░│░│░│░│░│░│
         ┴─┴─┴─┴─┴─┴─┴─┴─╩═╩──┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴

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

   ┌──┐┌──┐┌──┐ ┌──────────────────────────────────┐
   │| ││- ││GO│ │Плюс1                             │
   └──┘└──┘└──┘ └──────────────────────────────────┘
         └───────── кнопка установки среды в начальное положение

   Вася щелкнул мышью по этой кнопке, на ленте восстановился на-
чальный текст 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, в кото-
рый мы сегодня скопировали исполнителя.

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