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

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

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

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

Глава 7. Неожиданные профессии Кукарачи

7.1. Кукарача-водолаз
   Вася. В самом начале, когда я знакомился с  Кукарачей, ты го-
ворил мне, что у него не одно поле, а несколько.
   Петя. Верно. И в СКИ есть две команды, ВПЕРЕД и  НАЗАД, кото-
рые могут заставить Кукарачу скакать с поля на поле.
   Вася. Однако мы еще ни разу не писали эти команды.
   Петя. Будем считать, что  сейчас  пробил их час. Вот посмотри
на следующую задачу:
   Задача 1.  Убрать с поля восклицательные знаки, расположенные
в угловых клетках поля. Остальные знаки должны остаться на месте
и сам исполнитель после работы должен вернуться в исходную клет-
ку. (<<task701.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │! │* │* │* │* │* │* │* │* │! │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │* │* │* │* │# │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │* │* │* │* │* │* │* │* │* │* │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │! │* │* │* │* │* │* │* │* │! │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
   Вася. Да,  эту задачу не  решить на одном поле! Придется "ны-
рять" в расположенное ниже, добираться в нем до  лишних знаков и
выталкивать их коротким "всплытием". Кукараче придется  работать
словно водолазу!
   Петя. Идея алгоритма правильная,  приступай  к программирова-
нию.
   Вася. Первая процедура, как всегда, выражает план действий:

ЭТО Уборка!
 Убрать_клетку_1-1
 Убрать_клетку_1-10
 Убрать_клетку_10-10                   
 Убрать_клетку_10-1
 Вернуться_на_место
КОНЕЦ

   Вася. В остальных процедурах  придется  программировать "ныр-
ки", перемещения и "всплытия":

ЭТО Убрать_клетку_1-1
 ВПЕРЕД                                
 ПОВТОРИ 4 ВЛЕВО                       
 ПОВТОРИ 4 ВВЕРХ                       
 НАЗАД                                 
КОНЕЦ                                  
                                       
ЭТО Убрать_клетку_1-10                 
 ВПЕРЕД                                
 ПОВТОРИ 9 ВПРАВО                      
 НАЗАД                                 
КОНЕЦ

ЭТО Убрать_клетку_10-10
 ВПЕРЕД
 ПОВТОРИ 9 ВНИЗ
 НАЗАД
КОНЕЦ

ЭТО Убрать_клетку_10-1                 
 ВПЕРЕД
 ПОВТОРИ 9 ВЛЕВО
 НАЗАД
КОНЕЦ                                  
                                       
ЭТО Вернуться_на_место                 
 ВПЕРЕД                                
 ПОВТОРИ 4 ВПРАВО                      
 ПОВТОРИ 5 ВВЕРХ                       
 НАЗАД                                 
КОНЕЦ                                  

     Задание
   В середине - в клетке (5,5) - каждого из шести  полей, обра-
зующих стопку, стоит кубик со звездочкой. Таким образом постро-
ен столбик  из  звездочек.  Кукараче предстоит переместить весь
столбик в левый верхний угол стопки.

7.2. Кукарача-математик
   Петя. В следующей задаче тебе придется  обучить Кукарачу сло-
жению:
   Задача 2. На первом поле расположен пример на сложение. Кука-
рача должен определить второе слагаемое (оно  может иметь значе-
ния от 0  до  8) и записать правильный  ответ.  Под первым полем
располагаются еще одиннадцать. На втором поле в клетке (1,5) сто-
ит цифра  1.  На третьем поле в клетке (1,5) - цифра 2 и так да-
лее. На десятом поле в клетке (1,5) - цифра 9. Одиннадцатое поле
пустое. (<<task702.coc>>)

              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │1 │+ │  │= │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │? │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │# │  │  │  │  │  │  │  │

   Вася. В  условии задачи сказано,  что у Кукарачи 11 полей, но
на экране компьютера изображено только 4!
   Петя. Ну, это не проблема. Кукарача может работать с 99 поля-
ми. Чтобы установить необходимое число полей, нужно вызвать окно
установки режимов (третья  экранная кнопка в главном меню) и из-
менить число 4 в поле ВПЕРЕД на число 11:
      ┌──┬────────────────────────────────────────────┬──┐
      │| │          Р Е Ж И М Ы  Р А Б О Т Ы          │Ok│
      ├──┴────────────────────────────────────────────┴──┤
      │  Программа                                       │
      │ ┌──────────────────┐                             │
      │ │ х  Непрерывно    │                             │
      │ │                  │                             │
      │ │ о  По Шагам      │                             │
      │ │                  │                             │
      │ │ о  Не показывать │                             │
      │ └──────────────────┘                             │
      │ Размеры поля                                     │
      │┌───────┬───┬──────┬───┬────────┬───┬────────────┐│
      ││ВПРАВО │10 │ ВНИЗ │10 │ ВПЕРЕД │11█│            ││
      │└───────┴───┴──────┴───┴────────┴───┴────────────┘│
      └──────────────────────────────────────────────────┘

   Вася. А поля ВПРАВО и ВНИЗ меняют размеры полей?
   Петя. Правильно!  Максимальный  размер поля может быть уста-
новлен в  99 строк и 99 столбцов, но  для нашей задачи стандар-
тный размер 10х10 вполне  подходит.  Так что давай закроем окно
(кнопка Ok) и вернемся к нашей задаче.
   Вася. Определить второе слагаемое совсем просто. Нужно просто
написать команду ВВЕРХ. А дальше, видимо, для каждой цифры нужно
предусмотреть свою обработку:

ЭТО Сложение
  // Какая цифра прибавляется
  // к единице?
  ВВЕРХ                                
  // Переключатель работы
  ЕСЛИ       0  ТО Ноль
  ИНАЧЕ ЕСЛИ 1  ТО Один
  ИНАЧЕ ЕСЛИ 2  ТО Два                 
  ИНАЧЕ ЕСЛИ 3  ТО Три
  ИНАЧЕ ЕСЛИ 4  ТО Четыре              
  ИНАЧЕ ЕСЛИ 5  ТО Пять
  ИНАЧЕ ЕСЛИ 6  ТО Шесть
  ИНАЧЕ ЕСЛИ 7  ТО Семь                
  ИНАЧЕ ЕСЛИ 8  ТО Восемь
КОНЕЦ                                  

   Петя. Хорошее начало, а дальше?
   Вася.  Теперь  надо записать правильный ответ после кубика  с
символом "=" в клетке (1,5). Ответ может быть любой цифрой  от 1
до 9 и эти цифры спрятаны  у нас в стопке полей, находящихся под
основным.
   Петя. Заметь, что  все  эти цифры располагаются "столбиком" в
клетке (1,5) всех полей, лежащих ниже основного.
   Вася. Сделаю  так.  Заставлю  Кукарачу  "поднырнуть" под этот
"столбик" и двигать его целиком по направлению к основному полю,
пока в его клетке (1,5) не появится правильная цифра-ответ. "Ны-
рок" описывается следующей процедурой:

ЭТО На_начало_группы_цифр
 ПОВТОРИ 2 ВПРАВО
 ПОВТОРИ 10 ВПЕРЕД
 ВВЕРХ
КОНЕЦ

   А сдвиги и возврат в основное поле будут  разными для каждого
значения второго слагаемого:

ЭТО Ноль  // Ответ 1
 На_начало_группы_цифр
 НАЗАД
 ВНИЗ
 ПОВТОРИ 9 НАЗАД
КОНЕЦ

ЭТО Один // Ответ 2
 На_начало_группы_цифр                 
 ПОВТОРИ 2 НАЗАД                       
 ВНИЗ
 ПОВТОРИ 8 НАЗАД                       
КОНЕЦ                                  

ЭТО Два // Ответ 3
 На_начало_группы_цифр
 ПОВТОРИ 3 НАЗАД                       
 ВНИЗ
 ПОВТОРИ 7 НАЗАД
КОНЕЦ

ЭТО Три // Ответ 4
 На_начало_группы_цифр
 ПОВТОРИ 4 НАЗАД
 ВНИЗ
 ПОВТОРИ 6 НАЗАД
КОНЕЦ

ЭТО Четыре // Ответ 5
 На_начало_группы_цифр                 
 ПОВТОРИ 5 НАЗАД                       
 ВНИЗ                                  
 ПОВТОРИ 5 НАЗАД
КОНЕЦ                                  

ЭТО Пять // Ответ 6
 На_начало_группы_цифр                 
 ПОВТОРИ 6 НАЗАД
 ВНИЗ                                  
 ПОВТОРИ 4 НАЗАД
КОНЕЦ

ЭТО Шесть // Ответ 7
 На_начало_группы_цифр
 ПОВТОРИ 7 НАЗАД
 ВНИЗ
 ПОВТОРИ 3 НАЗАД
КОНЕЦ

ЭТО Семь // Ответ 8
 На_начало_группы_цифр                 
 ПОВТОРИ 8 НАЗАД                       
 ВНИЗ                                  
 ПОВТОРИ 2 НАЗАД                       
КОНЕЦ

ЭТО Восемь // Ответ 9
 На_начало_группы_цифр
 ПОВТОРИ 9 НАЗАД                       
 ВНИЗ
 НАЗАД                                 
КОНЕЦ

   Петя. Обрати внимание, что  общее  число команд НАЗАД во всех
процедурах Ноль, Один, ... Восемь равно числу 10.
   Вася. Это потому, что Кукарача  должен  в  итоге "всплыть" в
основном поле, а для этого ему нужно сделать  в общей сложности
10 переходов с поля на поле.

   Вопросы и задания:

   1. Исполнитель стоит в левом верхнем  углу  поля.  Во  второй
строке расположены  кубики  с  ненулевыми цифрами в произвольном
порядке. Поставить  их  в  строки  с  соответствующими номерами.
(<<task703.coc>>)

     2. На первом  поле записан пример на умножение. Определить
второй сомножитель и записать ответ. Под  первым полем распола-
гаются еще  семь. Во втором поле в клетке  (1,5) и клетке (1,6)
записаны нули.  В третьем поле в клетке  (1,5) -  цифра 1, а  в
клетке (1,6)  - цифра 5. В  четвертом, пятом, шестом  и седьмом
полях в клетках (1,5) располагаются соответственно  цифры 2, 3,
4, 5. Восьмое поле - пустое. (<<task704.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │5 │* │  │= │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │? │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │# │  │  │  │  │  │  │  │


     3. Кукарачья арифметика. Введем новые обозначения для  ко-
манд исполнителя Кукарача:

            2             ВЛЕВО  - 1
            │             ВВЕРХ  - 2
        1 ──┼── 3         ВПРАВО - 3
            │             ВНИЗ   - 4
            4
     Программа для исполнителя теперь будет задаваться  числом,
состоящим из цифр 1, 2, 3, 4, например короткий поход Кукарачи

                ─┼─┼─┼─┼─┼─┼─┼─┼─┼─
                 │ │ │┌┼┐│ │ │ │ │
                ─┼─┼─┼┼┼┼┼─┼─┼─┼─┼─
                 │ │ │└┼#│ │ │ │ │
                ─┼─┼─┼─┼─┼─┼─┼─┼─┼─

запишется в виде программы: 1234.
   Будем  полагать  также, что поле Кукарачи бесконечно (или, по
крайней мере, очень большое).
     а) Доказать, что если траектория движения приводит Кукара-
чу в клетку, с которой он начал движение, то сумма  цифр числа,
задающего программу исполнителя четна.
   б) Верно ли обратное: если сумма цифр числа, задающего прог-
рамму движения исполнителя, четна, то после выполнения програм-
мы Кукарача оказывается в исходной позиции.
     в) Известно, что в программе исполнителя нет команд ВВЕРХ,
а число команд ВЛЕВО равно числу команд ВПРАВО. Докажите, что в
этом случае сумма цифр числа-программы делится на 4, а если при
этом условии еще число команд ВЛЕВО равно числу команд ВНИЗ, то
сумма цифр числа-программы делится на 8.

7.2. Кукарача - писатель

   Петя. Следующая задача будет для тебя сюрпризом.

  Задача 3. <<task706.coc>> Создать небольшую электронную книж-
ку, в которой Кукараче  рассказывает  о своей жизни в Роботлан-
дии, и  программу, которая будет автоматически показывать стра-
ницы этой книжки читателю.

   Вася. Вот  уж действительно неожиданность! Рассказ о Кукараче
написать не проблема, но как заставить его показывать страницы?
   Петя. Подумай! Кукарача  способен  листать книжку до 99 стра-
ниц.
   Вася. А, понял. Каждое поле можно  рассматривать как страницу
книги, написав на нем  текст.  А листать страницы Кукарача будет
простым переползанием с поля  на  поле. Начну с составления рас-
сказа:
     Первое поле:
                  ┌─────────────────────┐
                  │      Моя жизнь      │
                  │                     │
                  │    в Роботландии    │
                  └─────────────────────┘

     Второе поле:
                  ┌─────────────────────┐
                  │      Меня зовут     │
                  │                     │
                  │       Кукарача      │
                  └─────────────────────┘

     Третье поле:

                  ┌─────────────────────┐
                  │       Я робот       │
                  │        и моя        │
                  │       среда -       │
                  │    клетчатое поле   │
                  └─────────────────────┘

     Четвертое поле:
                  ┌─────────────────────┐
                  │ А вот моя СКИ:      │
                  │ВПРАВО               │
                  │ВЛЕВО                │
                  │ВВЕРХ                │
                  │ВНИЗ                 │
                  │ВПЕРЕД               │
                  │НАЗАД                │
                  │СТОЯТЬ               │
                  └─────────────────────┘

   Петя. Рассказ короткий, но выразительный. Ты уложился в четы-
ре поля.
   Вася. Исполнителя установим в нижнем правом  углу первого по-
ля, ну, а программа показа страниц очень простая:

            ЭТО Рассказ
             ПОВТОРИ 3 ВПЕРЕД
            КОНЕЦ

   Вася запустил программу и испытал некоторое разочарование.
   Вася.  Страницы  листаются очень быстро. Их не успеть  прочи-
тать. Нет ли  в  языке Кукарачи какой-нибудь специальной команды
ПОДОЖДАТЬ?
   Петя. Такой  специальной  команды  нет, но временную задержку
можно устроить выполнением обычных команд.
   Вася. Да, в самом деле, пусть пока я читаю страницу, Кукарача
прогуливается влево, вправо и тянет  время.  Вот  как надо напи-
сать:
            ЭТО Рассказ
             ПОВТОРИ 3
             {
               Задержка
               ВПЕРЕД
             }
            КОНЕЦ

            ЭТО Задержка
              ПОВТОРИ 6
              {
                ВЛЕВО
                ВПРАВО
              }
            КОНЕЦ

   При запуске  программы обнаружилось, что задержка слишкжм ве-
лика и, кроме  того, задержки не хватает после последней страни-
цы. Окончательный вариант программы выглядел так:
            ЭТО Рассказ
             ПОВТОРИ 3
             {
               Задержка
               ВПЕРЕД
             }
             Задержка
            КОНЕЦ

            ЭТО Задержка
              ПОВТОРИ 3
              {
                ВЛЕВО
                ВПРАВО
              }
            КОНЕЦ

Вопросы и задания
     1. Напишите небольшой рассказ, который бы Кукарача показы-
вал, листая страницы на своем поле.
     2. На экране из кубиков выложен текст, в котором все слова
написаны вплотную,  без  пробелов.  Напишите программу, которая
вставляет отсутствующие пробелы. Используйте "нырки" исполните-
ля в соседние поля при выполнении этой работы.

7.3. Кукарача-киномеханик
   Петя. Знаешь, Вася, а ведь Кукарача может на своем поле пока-
зывать мультики!
   Вася. Послушай, а  не может он еще прогуливать собаку, варить
обед и играть на пианино?
   Петя. Ты  напрасно  смеешься.  Ведь как показывается мультик:
рисуют много  кадров, а потом  быстро показывают их друг за дру-
гом. Глаз человека устроен  так,  что мы видим движение персона-
жей, если если их  положение  в разных кадрах немного отличаются
друг от друга.
   Вася. Ты, конечно, намекаешь, что поля Кукарачи могут служить
кадрами мультфильма, а  его прыжки вдоль них - ручкой кинопроек-
тора, которой пользовались в старые времена?
   Петя. Ты все ловишь с полуслова.
   Вася. Но как же  мне рисовать кадры, если на поле я  могу пи-
сать только буквы?
   Петя. Я и  не  говорил об очень качественной мультипликации.
Но что-нибудь на поле  можно  нарисовать и буквами. Кроме букв,
есть еще цифры и разные  специальные  символы.  Вот,  например,
можно показать мультфильм  восхождения  гордой буквы Л вверх по
лестнице, в то время как сам Кукарача не трогает ее и не толка-
ет (<<task705.coc>>):
┌────────┐ ┌────────┐  ┌────────┐ ┌────────┐ ┌────────┐
│        │ │        │  │        │ │        │ │ Л      │
│ =      │ │ =      │  │ =      │ │ =Л     │ │ =      │
│ ==     │ │ ==     │  │ ==Л    │ │ ==     │ │ ==     │
│ ===    │ │ ===Л   │  │ ===    │ │ ===    │ │ ===    │
│ ====Л# │ │ ==== # │  │ ==== # │ │ ==== # │ │ ==== # │
└────────┘ └────────┘  └────────┘ └────────┘ └────────┘

   Петя и Вася занимались мультипликацией весь вечер и у них по-
лучилось несколько занимательных сюжетов, которые они с удоволь-
ствием показали маме.

Вопросы и задания
     1. Придумайте мультфильм на свой вкус и заставьте Кукарачу
поработать киномехаником.
     2. Организуйте путешествие Кукарачи по большому ландшафту,
увеличивая стандартные размеры поля и изображая  на нем пересе-
ченную местность.
