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

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

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

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


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

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

     Далее в  тексте методических рекомендаций рядом с условием
задачи будет обозначено имя соответствующей готовой программы в
курсовом пакете в  виде <<имя файла>>, если такая программа су-
ществует. Аналогичные пометки проставлены и в  книге для школь-
ника. При  необходимости руководитель команды может удалить эти
пометки из книги ученика перед раздачей материалов школьникам.
  Замечание 2. По теме Кукарача предполагается 10 занятий. Семь
из них  посвящены  изучению программирования, восьмое - решению
задач тренировочного  тура  (на  базе конкурсных задач прошлого
года) и два занятия на решение задач турнира.
   Замечание 3.  В программной среде Кукарачи находится полезная
утилита coctotxt.exe. Подобно утилите labtotxt.exe Мудрого Крота
она позволяет преобразовывать файлы задачи  (*.coc  и  *.tsk)  в
один текстовый файл. Для выполнения преобразований  ее лучше пе-
реписать в каталог, содержащий задачи.
     Формат запуска:
          coctotxt.exe <имя coc-файла> [<имя txt-файла>]
   Первый параметр - имя файла с расширением coc - программа для
Кукарачи. Второй параметр  - необязательный - имя файла, в кото-
ром будет создано текстовое оформление задачи. Если второй пара-
метр отсутствует, то имя текстового файла строится из имени, за-
данным в качестве первого параметра, добавлением расширения txt.
     Утилита coctotxt.exe будет полезна, когда необходимо иметь
условие задачи, начальное  состоянии среды и решение в виде од-
ного текстового файла (для архива, для методических разработок,
в качестве раздаточного материала, для оформлении решения зада-
чи и для других нужд).

   Замечание 4. В программной среде Кукарачи  находится еще одна
утилита envtotsk.exe.
   Пользователи, которые работали со старой версией программы (в
ней  среда  исполнителя записывалась в файл с расширением  env),
могут конвертировать свои старые среды в новый формат при помощи
этой утилиты. Для выполнения преобразований надо переписать ути-
литу в каталог, содержащий старые файлы-среды (расширение env) и
запустить ее. Утилита просканирует текущий каталог и преобразует
старые файлы  env в новые файлы  tsk, сохраняя старые  файлы без
изменений.

     Замечание 5. Помимо  книги  для ученика и настоящего посо-
бия, руководителю команды необходимо ознакомиться с  инструкци-
ями для пользователя, прилагаемыми к программному продукту. Ин-
струкции можно прочитать непосредственно из Монитора на страни-
це Кукарачи или в  файле  tar.doc, расположенном в каталоге DOC
программной среды программы.
  KURS
  ├─ COC97
  │  ├─ DOC
  │  │  └── tar.doc   <───── инструкции к программе
  │  ├─ coctotxt.exe  <───── утилита-преобразователь в txt
  │  ├─ envtotsk.exe  <───── утилита-преобразователь старых сред

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

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

1-ое занятие. Главы 1-3 (░01)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  Первое занятие  состоит из трех частей, соответствующих главам
1-3 книги. Если учитель имеет возможность  провести 3 отдельных
занятий по первым трем  темам,  то это можно только приветство-
вать. Если нет,  то нужно выбрать из предлагаемой методики, за-
даний и упражнений то, что учителю  кажется наиболее подходящим
для его детей.

Часть 1. Глава 1. Кукарача и его среда обитания.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Основные темы:
   - среда Кукарачи
   - СКИ исполнителя
   - сообщения исполнителя
   - работа с кубиками на поле

Основные понятия
   СРЕДА Кукарачи состоит из одинаковых клетчатых полей, сложен-
ных в стопку.
     Исполнитель  может  ползать  внутри полей (команды  ВЛЕВО,
ВПРАВО, ВВЕРХ, ВНИЗ), а также перемещаться с поля  на поле (ко-
манды ВПЕРЕД, НАЗАД).
   Если при своем движении исполнитель натыкается  на кубики, он
толкает их  перед собой, пока  не вытолкнет их за пределы среды.
Сам исполнитель покинуть среду не может.

                СКИ (Система команд исполнителя)
          ┌────────┬─────────────────────────────────┐
          │Команда │             Описание            │
          ├────────┼─────────────────────────────────┤
          │ ВЛЕВО  │Сместиться влево на одну клетку  │
          │ ВПРАВО │Сместиться вправо на одну клетку │
          │ ВВЕРХ  │Сместиться вверх на одну клетку  │
          │ ВНИЗ   │Сместиться вниз на одну клетку   │
          │ ВПЕРЕД │Сместиться вниз на одно поле     │
          │ НАЗАД  │Сместиться вверх на одно поле    │
          │ СТОЯТЬ │Стоять на месте                  │
          └────────┴─────────────────────────────────┘
   Сообщение "Не  могу" возникает при попытке заставить исполни-
теля покинуть среду.

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

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

   1. Обсуждение и построение траектории движения исполнителя.
   2. Составление алгоритма решения задачи в общем  виде на рус-
ском языке.
   3. Детализация алгоритма (быть может в несколько ступеней) на
русском языке.
   4. Выполнение алгоритма при помощи команд из СКИ исполнителя.
Можно параллельно  с выполнением алгоритма, записывать его пере-
вод в программу (команды из СКИ), так как это делал Петя в зада-
че с куликом.  Такая работа полезна потому, что наглядно показы-
вает взаимосвязь  алгоритма и программы. Хорошо видно, например,
что одному  пункту алгоритма может соответствовать несколько ко-
манд из СКИ.

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

5. Получить имя знакомой кошки нашего Кукарачи.

              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │  │  │  │М │У │Р │А │Ш │К │А │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │  │  │  │  │  │# │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │  │  │  │  │  │  │  │  │

     Решение. Возможные варианты имен МУРА, МУРКА, МУШКА, МАША,
МАШКА.

                          Вариант МУРА.
          ┌─────────────────────────┬─────────────────┐
          │         Алгоритм        │    Программа    │
          ├─────────────────────────┼─────────────────┤
          │  1. Выбросить Ш         │     ВВЕРХ       │
          │                         │                 │
          │  2. Выбросить слог КА   │     ВПРАВО      │
          │                         │     ВПРАВО      │
          └─────────────────────────┴─────────────────┘

                         Вариант МУРКА.

     Предварительный алгоритм:
1. Выбросить АШ
2. Подойти к началу слова
3. Придвинуть МУР к КА.

1. Выбросить АШ
   1.1. Выбросить Ш
   1.2. Подойти к А
   1.3. Выбросить А
2. Подойти к началу слова
3. Придвинуть МУР к КА.
          ┌─────────────────────────┬─────────────────┐
          │Детализированный алгоритм│    Программа    │
          ├─────────────────────────┼─────────────────┤
          │1. Выбросить АШ          │                 │
          │   1.1. Выбросить Ш      │ ВВЕРХ           │
          │                         │ ВНИЗ            │
          │                         │                 │
          │   1.2. Подойти к А      │ ВЛЕВО           │
          │                         │                 │
          │   1.3. Выбросить А      │ ВВЕРХ           │
          │                         │ ВНИЗ            │
          │                         │                 │
          │2. Подойти к началу слова│ ВЛЕВО           │
          │                         │ ВЛЕВО           │
          │                         │ ВЛЕВО           │
          │                         │ ВЛЕВО           │
          │                         │ ВВЕРХ           │
          │                         │                 │
          │3. Придвинуть МУР к КА.  │ ВПРАВО          │
          │                         │ ВПРАВО          │
          └─────────────────────────┴─────────────────┘


Часть 2. Глава2. Вася экономит свой труд.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 Алгоритм и программа
 Процедура
 Запись программ
 Стиль записи программ
 Особая роль комментариев
 Интерфейс Кукарачи 97
 (запись программ и их запуск, редактирование среды,
  хранение программ на диске)

Основные понятия
     ПРОГРАММА для Кукарачи записывается в поле редактора прог-
рамм и состоит из ПРОЦЕДУР. Каждая процедура имеет вид:

                ЭТО Имя    <─── заголовок процедуры
                 ...
                 команды   <─── тело процедуры
                 ...
                КОНЕЦ      <─── окончание процедуры

   Слова ЭТО и  КОНЕЦ  являются КЛЮЧЕВЫМИ. Ключевые слова служат
для построения  конструкций языка программирования. Их можно ис-
пользовать  только  для тех целей, ради которых  они  введены  в
язык. Например, нельзя процедурам давать имена ЭТО и КОНЕЦ - та-
кие имена будут восприняты как ошибка.
     ИМЯ  ПРОЦЕДУРЫ  используют при ее ЗАПУСКЕ. Для того  чтобы
запустить процедуру, нужно написать ее имя в редакторе команд и
нажать экранную кнопку GO.
   Экранная кнопка "-", расположенная рядом с  кнопкой GO приво-
дит  среду  исполнителя в начальное состояние (то, которое  было
задано в редакторе среды).
   Записывая программу, удобно использовать КОММЕНТАРИИ. Коммен-
тарий начинается с двух символов  "//"  и  продолжается до конца
строки. Комментарии не порождают никаких команд исполнителю, они
служат программисту для записи  пояснений  того, что он делает в
своей программе.  Комментарии  можно  располагать  в любом месте
программы, как внутри процедур, так и между ними.
     Программа хранится в памяти до тех пор, пока мы работаем с
Кукарачей. Если  начать работать с другими компьютерными среда-
ми, например, Микроном или Художником, или выключить компьютер,
то программа, составленная для Кукарачи, стирается. Для долгов-
ременного хранения программ их надо записывать  на диск. Диско-
вое меню состоит из трех разделов:
   Новый - стереть задачу на экране (очищается поле исполнителя,
поле редактора программ и поле редактора команд. Копия задачи на
диске, если она имеется, сохраняется).
   Чтение - прочитать с диска задачу и показать ее на экране.
   Запись - переписать задачу с экрана на диск.
     При чтении или записи  нужно  задать имя дискового файла и
расширение "coc".  На  диске,  кроме  программы, хранится также
состояние среды исполнителя и имя команды,  записанное в редак-
торе команд на экране.

Замечание по поводу интерфейса
     Интерфейс - это способ взаимодействия компьютерного  поль-
зователя с программной средой. Знание интерфейса  предполагает,
что пользователь знает,  какие кнопки на клавиатуре и на экране
надо нажимать для получения желаемых результатов.
     В беседах  Васи  и Пети объяснения интерфейсных управлений
сведены к минимуму. Это сделано для того, чтобы не загромождать
принципиальный разговор братьев техническими подробностями. Од-
нако, знание  интерфейса  необходимо  для практической работы с
программной моделью Кукарачи.  Поэтому необходимо познакомиться
с описанием интерфейса по техническому описанию,  поставляемому
вместе с программным пакетом.
     Руководителю команды  следует обратить внимание  школьника
на способы работы с многочисленными меню программы.
     Выбор кнопки меню выполняется одним из трех способов:
     1) Щелкнуть левой мышиной кнопкой, когда курсор  находится
на экранной кнопке.
     2) Нажать Enter  на  клавиатуре, когда курсор находится на
экранной кнопке.
     3) Нажать клавишу на клавиатуре с цифрой,  соответствующей
порядковому номеру экранной кнопки.
     Последний способ - самый удобный, он позволяет существенно
ускорить техническую работу с программой и,  тем самым, сэконо-
мить дорогое время урока.
     Несколько конкретных примеров.
     1) Чтение задачи с  диска.  Два раза нажмите на клавиатуре
цифру 2, выберете имя нужного файла и нажмите клавишу F3.
     2) Запись задачи на диск. Цифра 2,  затем  цифра  3,  ввод
имени файла и F3 для записи.
     3) Быстрый ввод  конструкций языка. Находясь в поле редак-
тора программы, нажимайте:
     Tab и 1: для ввода шаблона процедуры
     Tab и 2: для ввода шаблона составной команды
     Tab и 3: для ввода шаблона команды ПОВТОРИ
     Tab и 4: для ввода шаблона команды ПОКА
     Tab и 5: для ввода шаблона команды ЕСЛИ

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

Стиль записи программ
     Для удобства восприятия человеком текста программы, приня-
ты следующие правила записи:
     1) ключевые слова ЭТО  и  КОНЕЦ записываются друг под дру-
гом;
     2) команды,  составляющие  тело программы,  записываются в
столбик со смещением вправо;
     3) лишние пробелы,  пустые строки и комментарии служат для
улучшения внешнего вида программы.

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

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

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

5. Исправьте пример, переместив один из кубиков.

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

   Решение.

ЭТО Исправление
 // 2 - в клетку (2,3)
 //////////
 ВВЕРХ   //
 //////////
 // 2 - в клетку (2,9)
 //////////
 ВЛЕВО   //
 ВВЕРХ   //
 ВПРАВО  //
 ВПРАВО  //
 ВПРАВО  //
 ВПРАВО  //
 ВПРАВО  //
 ВПРАВО  //
 //////////
 // 2 - в клетку (3,9)
 //////////
 ВВЕРХ   //
 ВПРАВО  //
 ВНИЗ    //
 //////////
КОНЕЦ

Часть 3. Глава 3. Множество новых команд и их повторение.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 (░01) Процедура
 (░01) Преимущества процедурного программирования
 (░01) Команда повторения
 (░11) Интерпретатор и его сообщения
 (░11) Режимы работы интерпретатора (непрерывный и пошаговый)
 (░11) Практическая работа по тестированию и отладке программ


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

Общие рекомендации

   1. Очень важно научиться не механическому разделению програм-
мы  на  процедуры, а выделению логических фрагментов, исходя  из
структурной технологии проектирования "сверху вниз". Эта  техно-
логия подразумевает приступать к программированию с  составления
общего плана,  постепенно  переходя  к детализации его отдельных
пунктов.
   2. Следует приучать детей к осмысленному именованию процедур.
Имя должно, по возможности, выражать содержание выполняемых дей-
ствий.
   3. При решении задач часто помогает рисование траектории дви-
жения исполнителя и выделение в ней повторяющихся частей.

Анатомия работы программной модели исполнителя

   Приведенная ниже схема условно изображает работу  программной
реализации исполнителя Кукарачи.
              ╔══════════════════╗
              ║  Редактор команд ║
              ║                  ║
              ╚═══════╤══════════╝
                      │
         ┌────────────┴───────────┐
         │      Интерпретатор     │
         │         команд         │
         │        ┌─────────┐     │
         │    да  │ команда │ нет │
         │     ┌──┤    из   ├──┐  │
         │     │  │   СКИ?  │  │  │
         │     │  └─────────┘  │  │
         └─────┼───────────────┼──┘             ╔═════════════╗
               │               │                ║   Редактор  ║
               │        ┌──────┴─────────┐      ║             ║
               │        │  Интерпретатор ├<─────╢   программ  ║
               │        │    программ    │      ║             ║
               │        └──────┬─────┬───┘      ║             ║
               V               V     V          ╚═════════════╝
               └───────┬───────┘     │
╔═══════════╗          V             │  ╔════════════╗
║НЕ МОГУ    ║  ╔═══════╧════════╗    └──╢НЕ ПОНИМАЮ  ║
║(когда  вы-╟──╢   Исполнитель  ║       ║(нет  проце-║
║полнение   ║  ║    Кукарача    ║       ║дуры с  име-║
║команды    ║  ║                ║       ║нем, указан-║
║уводит  ис-║  ║                ║       ║ным в редак-║
║полнителя  ║  ║                ║       ║торе команд)║
║из среды)  ║  ╚════════════════╝       ╚════════════╝
║           ║
╚═══════════╝


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

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

   При написании программ на  языке  программирования необходимо
строго следовать правилам записи, принятым в этом языке (ГРАММА-
ТИКЕ языка). Любое отклонение от грамматики приведет к печальным
последствиям: программа либо не будет работать, либо будет рабо-
тать неправильно.  Нельзя,  например,  записывать ключевые слова
маленькими буквами или  использовать их не в том смысле, который
задает описание языка.
   Исполнитель Кукарача  не может сам выполнить программу, запи-
санную на языке программирования, ведь он понимает только коман-
ды из своей  СКИ.  Значит, нужен новый исполнитель, надстроенный
над Кукарачей, который понимал бы команды языка программирования
и преобразовывал бы их в команды из СКИ Кукарачи. Таким исполни-
телем является интерпретатор программ  -  специальная процедура,
составляющая часть компьютерной реализации Кукарачи. Интерпрета-
тор, выполняя, например,  команду ПОВТОРИ 9 ВНИЗ, переводит ее в
девять обычных команд ВНИЗ, понятных Кукараче.

 Классификация ошибок программирования
     Обсуждая правила записи алгоритма на языке  программирова-
ния,  братья  подробно  рассмотрели синтаксические ошибки.  Они
возникают при нарушении формальных правил использования  языко-
вых конструкций.  Однако,  существуют и более сложное нарушения
правил грамматики  - СЕМАНТИЧЕСКАЯ (смысловая) ошибка. Она воз-
никает, когда формально правила записи не  нарушены, но постро-
енную языковую конструкцию интерпретатор воспринимает совсем не
в том смысле,  который хотел в нее вложить пользователь. Типич-
ный пример - неверное использование команды  цикла. Пусть, нап-
ример, программист  написал ПОВТОРИ 2 ВНИЗ ВПРАВО, рассчитывая,
что команды ВНИЗ и ВПРАВО повторяться два раза. Однако, по пра-
вилам языка повторяется  только  одна команда, поэтому два раза
выполнится команда ВНИЗ, а затем - один раз команда ВПРАВО. Та-
кую ошибку интерпретатор обнаружить не способен.  Семантические
ошибки (как и  логические) можно найти при пошаговой работе ин-
терпретатора, наблюдая за тем, что выполняется  в поле программ
и как при этом меняется среда Кукарачи.
   Ниже, в  виде  схемы, представлена более полная классификация
ошибок программирования:
                   ┌──────────────────────────┐
                   │ Ошибки программирования  │
                   └──────────┬───────────────┘
                  ┌───────────┴───────────┐
      ┌───────────┴───────────┐┌──────────┴────────────┐
      │ Грамматические ошибки ││ Логические или        │
      │ (нарушение правил     ││ алгоритмические ошибки│
      │  использования языка  ││ (неверный алгоритм)   │
      │  программирования)    ││                       │
      └───────────┬───────────┘└───────────────────────┘
         ┌────────┴───────┐
 ┌───────┴───────┐ ┌──────┴──────┐
 │ Синтаксические│ │Семантические│
 │     ошибки    │ │ ошибки      │
 └───────────────┘ └─────────────┘

Отладка программ
   Поиск ошибки по сообщению интерпретатора часто вызывает труд-
ности у начинающих программистов.
   Примером многочисленных синтаксических ошибок служит програм-
ма из задачи 2 в п.2 предыдущей главы:
         Это Очень хорошая команда
           СТОЯТЬ  (Кукарача стоит на месте)
         Конец.

   Ключевые слова  здесь записаны неправильно (нужно писать ЭТО,
КОНЕЦ). Недопустима точка после ключевого слова  КОНЕЦ. Имя про-
цедуры "Очень хорошая команда" содержит пробелы. Комментарий за-
писан в круглых скобках.

     Исправленная программа выглядит следующим образом:
         ЭТО Очень_хорошая_команда
           СТОЯТЬ // Кукарача стоит на месте
         КОНЕЦ

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

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

2. Команда повторения
     1. Первый вопрос, по-видимому, не вызовет трудностей. Надо
лишь обратить  внимание на наличие нескольких вариантов ответа.
Что  касается  второго вопроса, то отрицательный ответ на  него
дается только в последнем рисунке: какая бы часть в этом рисун-
ке  не  выделялась, всегда после ее повторения остается  "хвос-
тик".
     2. Какие из приведенных ниже команд повторения правильные,
а какие нет и почему?
а)   ПОВТОРИ 7 СТОЯТЬ
     Ответ. Формально команда правильная, хотя сомнительно,  что
полезная.
б)   Повтори 2 ВПРАВО
     Ответ. Ключевое слово написано  с  синтаксической ошибкой,
нужно писать ПОВТОРИ.
в)   ПОВТОРИ 5-2 ВНИЗ
     Ответ. Число повторений  должно быть числом и не может быть
арифметическим выражением.
г)   ПОВТОРИ 100 ВНИЗ ВПРАВО
     Ответ.  Команда  повторения  должна после числа  содержать
только одну  команду.  Если  необходимо повторить большее число
команд, их надо оформлять   в  отдельную процедуру, а в команде
повторения записывать ее имя. Другой способ - использовать СОС-
ТАВНУЮ команду, но об этом будет рассказано позже.
д)   ПОВТОРИ 8 Колесо
     Ответ. Если программа содержит  описание  процедуры "Коле-
со", то она записана без ошибок.
е)   ПОВТОРИ 7 ПОВТОРИ 2 ВПРАВО
     Ответ. Формальная запись совершенно правильная: после чис-
ла повторений  следует  одна команда (команда повторения), хотя
конструкция выглядит  немного  странно.  Эта команда повторения
эквивалента следующей:
          ПОВТОРИ 14  ВПРАВО
ж)   ПОВТОРИ 1 ВПЕРЕД
     Ответ. Запись  правильная, но, конечно, не разумная, лучше
просто записать команду ВПЕРЕД, без всякого однократного повто-
рения.

3. Интерпретатор и его странные сообщения
     1. Помогите Кукараче взобраться по лесенке.
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │  │  │  │  │┌─┼─ │  │  │
             ├──┼──┼──┼──┼──┼──┼┼─┼──┼──┼──┤
           4 │  │  │  │  │  │┌─┼┘ │А │  │  │
             ├──┼──┼──┼──┼──┼┼─┼──┼──┼──┼──┤
           5 │  │  │  │  │┌─┼┘ │К │  │  │  │
             ├──┼──┼──┼──┼┼─┼──┼──┼──┼──┼──┤
           6 │  │  │  │┌─┼┘ │Н │  │  │  │  │
             ├──┼──┼──┼┼─┼──┼──┼──┼──┼──┼──┤
           7 │  │  │┌─┼┘ │Е │  │  │  │  │  │
             ├──┼──┼┼─┼──┼──┼──┼──┼──┼──┼──┤
           8 │  │┌─┼┘ │С │  │  │  │  │  │  │
             ├──┼┼─┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │┌─┼┘ │Е │  │  │  │  │  │  │  │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │# │Л │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

     Решение

      ЭТО Лесенка
       ПОВТОРИ 7 Ступень
      КОНЕЦ

      ЭТО Ступень
       ВВЕРХ
       ВПРАВО
      КОНЕЦ

     2. Составьте программу прогулки Кукарачи по заданному мар-
шруту так, чтобы он прошел его пять раз.
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │#─┼>─┼──┼──┼──┼──┼──┼──┼──┼┐ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           2 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           3 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           4 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           5 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           6 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           7 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           8 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
           9 ││ │  │  │  │  │  │  │  │  ││ │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼┼─┤
          10 │└─┼──┼──┼──┼──┼──┼──┼──┼<─┼┘ │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
     Ответ.
     ЭТО Большая_прогулка
       ПОВТОРИ 5 Прогулка
     КОНЕЦ

     ЭТО Прогулка
      ПОВТОРИ 9 ВПРАВО
      ПОВТОРИ 9 ВНИЗ
      ПОВТОРИ 9 ВЛЕВО
      ПОВТОРИ 9 ВВЕРХ
    КОНЕЦ

     3. Контроль  поля.  Заставьте исполнителя  Кукарачу обойти
все клетки поля так, чтобы  в  каждой из них он побывал  только
один раз.

     Ответ.

     ЭТО Контроль
      // Обойти первые 8 столбцов
      ПОВТОРИ 4 Вниз_Вверх
      // Обойти последние 2 столбца
      Вниз
      ВПРАВО
      Вверх
     КОНЕЦ

      // Обойти два столбца и сместится в третий
     ЭТО Вниз_Вверх
      Вниз
      ВПРАВО
      Вверх
      ВПРАВО
     КОНЕЦ

     // Движение вниз по столбцу
     ЭТО Вниз
      ПОВТОРИ 9 ВНИЗ
     КОНЕЦ

     // Движение вверх по столбцу
     ЭТО Вверх
      ПОВТОРИ 9 ВВЕРХ
     КОНЕЦ

     5. Получить на поле слово КОЛЕСО.
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │# │  │  │  │  │  │  │  │  │К │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │  │  │  │  │  │  │  │О │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │Л │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │Е │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │С │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │О │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │  │  │  │  │  │  │  │

     Ответ. Нарисуем траекторию движения исполнителя:
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 ││ │  │  │  │  │  │  │  │  │К │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 ││ │  │  │  │  │  │  │  │  │О │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │╞═╪══╪══╪══╪══╪══╪══╪══╪═ │  │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 ││ │  │  │  │  │  │  │  │  │Е │
             ├┼─┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │└─┼──┼──┼──┼──┼──┼──┼──┼─ │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │О │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │  │  │  │  │  │  │  │

     Заметим, что она состоит из двух одинаковых частей, поэто-
му программа будет записана следующим образом:

       ЭТО Колесо
        ПОВТОРИ 2 Установка_буквы
       КОНЕЦ

       // Установка одной буквы
       ЭТО Установка_буквы
        ПОВТОРИ 2 ВНИЗ
        ПОВТОРИ 8 ВПРАВО
        ПОВТОРИ 8 ВЛЕВО
       КОНЕЦ

     7. Помогите  Кукараче  очистить поле  от  мусора  (кубики
"Х"), не сдвигая остальных кубиков (<<task302.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │# │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │- │- │- │- │- │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │Х │Х │Х │Х │Х │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │- │- │- │- │- │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │Х │Х │Х │Х │Х │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │- │- │- │- │- │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │Х │Х │Х │Х │Х │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │- │- │- │- │- │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │Х │Х │Х │Х │Х │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │- │- │- │- │- │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

     Ответ. Решение задачи начнем опять с построения траектории
и выделением на ней повторяющихся частей.
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │──┼──┼──┼──┼──┼─┐│  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           2 │- │- │- │- │- │ ││  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           3 │══╪══╪══╪══╪══╪═╡│  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           4 │- │- │- │- │- │ ││  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           5 │══╪══╪══╪══╪══╪═╡│  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           6 │- │- │- │- │- │ ││  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           7 │══╪══╪══╪══╪══╪═╡│  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           8 │- │- │- │- │- │ ││  │  │  │  │
             ├──┼──┼──┼──┼──┼─┼┼──┼──┼──┼──┤
           9 │──┼──┼──┼──┼──┼─┘│  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │  │  │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

//-------------------------------------
// Помогите  Кукараче  очистить поле   
// от  мусора  (кубики "Х"),
// не сдвигая остальных кубиков.       
//-------------------------------------
ЭТО Уборка
 // Подвод исполнителя в клетку (1,6)
 ПОВТОРИ 5 ВПРАВО                      

 ПОВТОРИ 4 Уборка_строк
КОНЕЦ                                  

// Уборка строк                        
ЭТО Уборка_строк                       
 ПОВТОРИ 2 ВНИЗ
 ПОВТОРИ 5 ВЛЕВО
 ПОВТОРИ 5 ВПРАВО
КОНЕЦ

2-ое занятие. Главы 4, 5.
~~~~~~~~~~~~~~~~~~~~~~~~~
  Это занятие состоит из  2  частей в соответствии с разбиением
на главы 4 и 5 книги.

Часть 1. Глава 4. Кукарача на распутье.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 (░01) Команда ветвления
 (░11) Переключатели

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

Отдельные рекомендации, пояснения и примеры.
   1. Следующие примеры  на ветвления взяты из повседневной жиз-
ни:
   1) Планирование воскресного дня: если  будет  хорошая погода,
пойду гулять, если нет, буду читать книгу.
   2) Правило телефонного звонка: если, набрав номер, вы слышите
частые гудки, то  повторите звонок, если гудки редкие, ждите со-
единения, если гудков вовсе нет, пригласите телефонного мастера.
   3) Если по телевизору показывают мультики, то сделать перерыв
в домашних заданиях, в противном случае закончить домашнюю рабо-
ту.
   4) Правило русского  языка:  если  глагол отвечает на вопросы
"что делать?", "что сделать?", то надо писать "-ться", если гла-
гол отвечает на вопросы "что  делает  (сделает)?",  "что  делают
(сделают)?", то пишется "-тся".
   5) Как отличить ужа  от змеи: если на голове рептилии имеется
два желтых пятнышка, то это уж.
     Общее, что важно увидеть во всех примерах - ситуация выбо-
ра на основе информации, получаемой в  момент выполнения ветвя-
щейся инструкции. И еще, очень важно подчеркнуть проблему, воз-
никающую перед составителем инструкции: он заранее  не знает, с
каким вариантом  на практике встретится исполнитель. Значит, он
должен предусмотреть по возможности все случаи, отсюда и возни-
кают ветвления.
   2. При проверке  программ  с  ветвлениями недостаточно одного
запуска. Чтобы  проверить все ветви алгоритма, необходимо запус-
кать программу со всеми возможными значениями скрытых кубиков.
   Если скрытых кубиков на поле два или больше, то для перемеши-
вания их значений можно использовать  клавишу  Tab  в  редакторе
среды. При  этом кубики будут перемешиваться регулярным образом.
Это означает, что каждое нажатие Tab будет выводить на поле сле-
дующую комбинацию, пока все возможные комбинации не будут переб-
раны. Пусть, например, на поле три скрытых кубика. Это означает,
что для полной проверки программы потребуется  6 запусков. Перед
каждым запуском нужно  входить в поле редактора среды и нажимать
клавишу Tab. Если, например, на кубиках написаны цифры  1, 2, 3,
работа клавиши Tab приводит к следующим результатам:
                  в начальный момент:    1 2 3
                  первое нажатие Tab:    1 3 2
                  второе нажатие Tab:    2 1 3
                  третье нажатие Tab:    2 3 1
                  четвертое нажатие Tab: 3 1 2
                  пятое нажатие Tab:     3 2 1
                  шестое нажатие Tab:    1 2 3
                  и так далее.

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

   3. При записи условия в команде ветвления разрешается исполь-
зовать ключевое слово НЕ, обозначающее логическую операцию отри-
цания. Можно привести множество примеров, где операция отрицания
используется в повседневной жизни:
     Примеры:
  1) Если завтра НЕ будет дождя, пойду в поход.
  2) Если НЕ зададут уроков, буду кататься на велосипеде.
  3) Если дома НЕТ хлеба, схожу в магазин.
  4) Если на светофоре НЕ горит зеленый свет, надо подождать.

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

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

2. Особые случаи
     1. На перевернутых кубиках буквы О и У (какая буква на ка-
ком кубике - неизвестно): <<task402.coc>>
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │  │С │Т │  │Л │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │  │  │? │# │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │  │  │? │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │  │

     Какое слово соберет Кукарача, выполняя команды
     а) Мебель1
     б) Мебель2
     в) Мебель3
     г) Мебель4
     д) Мебель5
     е) Мебель6
     ж) Мебель7
     з) Мебель8
если в поле программы написан следующий текст:
//-------------------------------------
ЭТО Мебель1
 ВЛЕВО
 ЕСЛИ У
  ТО    Работа1
  ИНАЧЕ Работа2
КОНЕЦ
//-------------------------------------
ЭТО Мебель2
 ВЛЕВО
 ЕСЛИ НЕ У
  ТО    Работа1
  ИНАЧЕ Работа2
КОНЕЦ
//-------------------------------------
ЭТО Мебель3
 ВЛЕВО
 ЕСЛИ У
  ТО    Работа2
  ИНАЧЕ Работа1
КОНЕЦ
//-------------------------------------
ЭТО Мебель4
 ВЛЕВО
 ЕСЛИ НЕ У
  ТО    Работа2
  ИНАЧЕ Работа1
КОНЕЦ
//-------------------------------------
ЭТО Мебель5
 ВЛЕВО
 ЕСЛИ О
  ТО    Работа1
  ИНАЧЕ Работа2
КОНЕЦ
//-------------------------------------
ЭТО Мебель6
 ВЛЕВО
 ЕСЛИ НЕ О
  ТО    Работа1
  ИНАЧЕ Работа2
КОНЕЦ
//-------------------------------------
ЭТО Мебель7
 ВЛЕВО
 ЕСЛИ О
  ТО    Работа2
  ИНАЧЕ Работа1
КОНЕЦ
//-------------------------------------
ЭТО Мебель8
 ВЛЕВО
 ЕСЛИ НЕ О
  ТО    Работа2
  ИНАЧЕ Работа1
КОНЕЦ
//-------------------------------------
ЭТО Работа1
 ВНИЗ
 ВЛЕВО
 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Работа2
  ВПРАВО
  ВНИЗ                                 
  ВЛЕВО
  ВНИЗ
  ВЛЕВО
  ПОВТОРИ 2 ВВЕРХ
КОНЕЦ

   Решение.

   Слово СТУЛ будет  собрано  при выполнении команд Мебель1, Ме-
бель4, Мебель6,  Мебель7.  Выполняя  остальные команды, Кукарача
соберет слово СТОЛ.

   7. Помогите Кукараче составить слово КОТ. На одном из кубиков
есть буква "Т" (<<task407.coc>>).
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │К │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │О │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │? │# │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │? │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │? │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │  │  │  │  │  │  │  │  │  │  │

     Решение
//-------------------------------------
ЭТО Кот
 ВЛЕВО
 ЕСЛИ НЕ Т                             
   ТО Буква_2
КОНЕЦ                                  
//-------------------------------------
ЭТО Буква_2                            
 // Выбросить первую букву с поля
 ВЛЕВО
 // Подойти ко второй букве
 ПОВТОРИ 2  ВПРАВО
 ВНИЗ
 // Толкнуть вторую букву
 ВЛЕВО
 ЕСЛИ Т
  ТО    Поставить_вторую_букву         
  ИНАЧЕ Поставить_третью_букву         
КОНЕЦ
//-------------------------------------
ЭТО Поставить_вторую_букву             
 ВНИЗ                                  
 ВЛЕВО
 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Поставить_третью_букву
 // Вытолкнуть вторую букву            
 ВЛЕВО
 // Подойти к третьей букве            
 ПОВТОРИ 2 ВПРАВО
 ВНИЗ
 // Толкнуть третью букву
 ВЛЕВО
 // Поставить третью букву
 ВНИЗ
 ВЛЕВО
 ПОВТОРИ 2 ВВЕРХ
КОНЕЦ

   Заметив в  процедурах  повторяющиеся  части, можно усовершен-
ствовать программу  введением новой процедуры Работа и использо-
ванием  процедуру  Поставить_вторую_букву   в  процедуре  Поста-
вить_третью_букву:
//-------------------------------------
ЭТО Кот
 ВЛЕВО
 ЕСЛИ НЕ Т
   ТО Буква_2
КОНЕЦ                                  
//-------------------------------------
ЭТО Буква_2
 Работа
 ЕСЛИ Т
  ТО    Поставить_вторую_букву
  ИНАЧЕ Поставить_третью_букву
КОНЕЦ
//-------------------------------------
ЭТО Работа
 // Выбросить  букву с поля
 ВЛЕВО                                 
 // Подойти ко следующей букве
 ПОВТОРИ 2  ВПРАВО
 ВНИЗ                                  
 // Толкнуть следующую букву
 ВЛЕВО
КОНЕЦ
//-------------------------------------
ЭТО Поставить_вторую_букву             
 ВНИЗ
 ВЛЕВО
 ВВЕРХ                                 
КОНЕЦ                                  
//-------------------------------------
ЭТО Поставить_третью_букву
 Работа
 // Поставить третью букву
 Поставить_вторую_букву
 ВВЕРХ
КОНЕЦ

   8. Во второй строке злоумышленник перемешал буквы в слове ЭК- ?
РАН. Восстановить испорченное слово (<<task408.coc>>).

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

   Решение основано на следующей простой идее: переместить буквы
в строки 3-7, а затем собрать слово в 10 столбце. При этом буква
"Э" перемещается в третью строку, буква "К" - в четвертую, и так
далее, наконец, буква "Н"  перемещается  в 7 строку. Таким обра-
зом, независимо от  того, как стояли буквы изначально, они будут
стоять в правильном  порядке  по строкам. Теперь остается только
сместить их в один столбец.

//-------------------------------------
ЭТО Экран
 ПОВТОРИ 5 Буква_в_нужную_строку
 Исполнитель_в_угол
 Установка_слова
КОНЕЦ                                  
//-------------------------------------
ЭТО Буква_в_нужную_строку              
 Работа                                
 ВПРАВО                                
КОНЕЦ
//-------------------------------------
ЭТО Работа
 ВНИЗ
 ЕСЛИ       К ТО Поставить_К
 ИНАЧЕ ЕСЛИ Р ТО Поставить_Р
 ИНАЧЕ ЕСЛИ А ТО Поставить_А
 ИНАЧЕ ЕСЛИ Н ТО Поставить_Н
 ВВЕРХ                                 
КОНЕЦ                                  
//-------------------------------------
ЭТО Поставить_К                        
 ВНИЗ                                  
 ВВЕРХ                                 
КОНЕЦ
//-------------------------------------
ЭТО Поставить_Р
 ПОВТОРИ 2 ВНИЗ                        
 ПОВТОРИ 2 ВВЕРХ
КОНЕЦ                                  
//-------------------------------------
ЭТО Поставить_А                        
 ПОВТОРИ 3 ВНИЗ
 ПОВТОРИ 3 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Поставить_Н
 ПОВТОРИ 4 ВНИЗ
 ПОВТОРИ 4 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Исполнитель_в_угол                 
 ПОВТОРИ 6 ВЛЕВО
КОНЕЦ                                  
//-------------------------------------
ЭТО Установка_слова                    
 ПОВТОРИ 2 ВНИЗ
 ПОВТОРИ 5 Установка_буквы
КОНЕЦ
//-------------------------------------
ЭТО Установка_буквы
 ПОВТОРИ 8 ВПРАВО                      
 ПОВТОРИ 8 ВЛЕВО
 ВНИЗ                                  
КОНЕЦ

Часть 2. Глава 5. Другой тип повторения
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 (░01) Команда ПОКА
 (░01) Составная команда
 (░11) Практикум программиста

Основные понятия
   Команда ПОКА  используется  тогда, когда нужно выполнить нес-
колько раз одни и то же действия, но число повторений заранее не
известно. Эта  ситуация  возникает,  если повторения должны быть
закончены при  обнаружении  нужных  кубиков (или их отсутствии).
Вид команды ПОКА:
                      ПОКА условие команда
   Работа команды  ПОКА  заключается в повторении выполнения ко-
манды, записанной после условия, до тех  пор,  пока  условие  не
станет ложным. Если условие ложно изначально,  команда не выпол-
нится ни разу.
   СОСТАВНАЯ КОМАНДА  позволяет  объединять группу команд в одну
команду. Составную  команду можно использовать всюду, где разре-
шено использовать простую команду. Вид составной команды:
                      {
                        список команд
                      }

Отдельные комментарии.

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

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

   3. Благодаря неутомимым стараниям Пети, его брат познакомился
со всеми  конструкциями  языка  программирования для исполнителя
Кукарачи. Ниже приводится справочное описание этого  языка и со-
общения интерпретатора программ.

            Краткое изложение языка программирования

1) Программа
   Программа это последовательность процедур.
2) Процедура
Процедура - это конструкция вида:
             ┌────────────────┬───────────────────┐
             │     Вид        │      Описание     │
             ├────────────────┼───────────────────┤
             │ЭТО имя         │начало процедуры   │
             │ список команд  │тело процедуры     │
             │КОНЕЦ           │конец процедуры    │
             └────────────────┴───────────────────┘
3) Комментарии
     Комментарии могут  располагаться  как  в процедурах, так и
между ними. Комментарий имеет вид:

             // начало комментария и до конца строки

4) Разделители слов языка
     В качестве разделителей  слов  языка служат пробелы и концы
строк.

5) Команды.
     Команды бывают простые и составные.

5.1) Составная команда.
     Составная команда имеет структуру:
             ┌────────────────┬───────────────────┐
             │     Вид        │      Описание     │
             ├────────────────┼───────────────────┤
             │{               │начало составной   │
             │ список команд  │тело составной     │
             │}               │конец составной    │
             └────────────────┴───────────────────┘
5.2) Простые команды
5.2.1) Команда из СКИ исполнителя
          ┌────────┬─────────────────────────────────┐
          │Вид     │             Описание            │
          ├────────┼─────────────────────────────────┤
          │ ВЛЕВО  │Сместиться влево на одну клетку  │
          │ ВПРАВО │Сместиться вправо на одну клетку │
          │ ВВЕРХ  │Сместиться вверх на одну клетку  │
          │ ВНИЗ   │Сместиться вниз на одну клетку   │
          │ ВПЕРЕД │Сместиться вниз на одно поле     │
          │ НАЗАД  │Сместиться вверх на одно поле    │
          │ СТОЯТЬ │Стоять на месте                  │
          └────────┴─────────────────────────────────┘

5.2.2) Вызов процедуры
     Вызовом процедуры служит ее имя.

5.2.3) Цикл ПОВТОРИ
            ┌───────────────────┬───────────────────┐
            │     Вид           │      Описание     │
            ├───────────────────┼───────────────────┤
            │ПОВТОРИ n команда  │Выполнение  команды│
            │                   │повторяется  безус-│
            │                   │ловно n раз.       │
            └───────────────────┴───────────────────┘
     Здесь n - целое неотрицательное число.

5.2.4) Цикл ПОКА
        ┌────────────────────┬───────────────────────────────┐
        │    Вид             │            Описание           │
        ├────────────────────┼───────────────────────────────┤
        │ПОКА условие команда│Пока выполнено условие,  выпол-│
        │                    │няется  команда.  Если  условие│
        │                    │ложно изначально, то команда не│
        │                    │выполнится ни разу.            │
        └────────────────────┴───────────────────────────────┘

5.2.5) Условная команда
        ┌────────────────┬─────────────────────────────┐
        │    Формат      │           Описание          │
        ├────────────────┼─────────────────────────────┤
        │ЕСЛИ  условие   │В  зависимости  от истинности│
        │ ТО     команда1│условия выполняется  команда1│
        │ ИНАЧЕ  команда2│после ТО или  команда2  после│
        │                │ИНАЧЕ. Ветвь  ИНАЧЕ может от-│
        │                │сутствовать.                 │
        └────────────────┴─────────────────────────────┘

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

7) Сообщения интерпретатора программ
┌──────────────────────────────┬──────────────────────────────┐
│           Сообщение          │   Дополнительные пояснения   │
├──────────────────────────────┼──────────────────────────────┤
│    Не   обнаружено   ключевое│Ожидалось начало процедуры, но│
│слово ЭТО                     │ключевого слова ЭТО не обнару-│
│                              │жено.                         │
│                              │                              │
│    Нет имени процедуры       │После ключевого  слова ЭТО нет│
│                              │имени процедуры.              │
│                              │                              │
│    Повторное определение про-│В программе описаны две проце-│
│цедуры                        │дуры с одинаковым именем.     │
│                              │                              │
│    Не  описана  процедура   с│К  процедуре  с  именем  "имя"│
│именем: "имя"                 │есть обращение, но она не опи-│
│                              │сана.                         │
│                              │                              │
│    Неверное  начало   команды│Обнаружена   непонятная   кон-│
│или нет ключевого слова КОНЕЦ │струкция  там,  где  ожидалась│
│                              │команда.                      │
│                              │                              │
│    В команде ПОВТОРИ не зада-│За  ключевым  словом   ПОВТОРИ│
│но число повторений           │должно следовать число.       │
│                              │                              │
│    В команде  ЕСЛИ не обнару-│                              │
│жено ключевое слово ТО        │                              │
│                              │                              │
│    В команде  ЕСЛИ не обнару-│                              │
│жено условие                  │                              │
└──────────────────────────────┴──────────────────────────────┘

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

1. Когда неизвестно число повторений
     1. В каких случаях при программировании придется  восполь-
зоваться командой ПОКА, а в каких - командой ПОВТОРИ:
     а) Кукарача спускается  по  диагонали  из  клетки  (1,1) до
буквы "С", расположенной в клетке (8, 8).
     Ответ. ПОВТОРИ,  потому что расположение буквы "С" известно
заранее. Значит, заранее известно число шагов по диагонали.
     б) Кукарача спускается  по  диагонали  из  клетки (1,1) до
буквы "С", расположенной где-то на этой диагонали.
     Ответ. ПОКА,  потому  что расположение буквы заранее неиз-
вестно.
     в) Робот-станок должен изготовить 100 одинаковых деталей.
     Ответ. ПОВТОРИ, робот должен  повторить  100 раз одни и те
же действия, приводящие к изготовлению одной детали.
     г) Робот-станок должен изготовлять одинаковые детали в те-
чение дневной рабочей смены.
     Ответ. ПОКА. Условием в этой команде  будет проверка теку-
щего времени.
     д) Робот-станок  должен  изготовлять одинаковые  детали до
тех пор, пока у него не кончатся заготовки.
     Ответ. ПОКА. Условием будет служить проверка наличия заго-
товок.
     е) Компьютерная программа должна  обрабатывать  длительное
нажатие клавиши на клавиатуре.
     Ответ. ПОКА пользователь не отпустил клавишу
            {
              повторять вывод на экран символа,
              соответствующего нажатой клавише
            }
     ж) Автомат, отключающий двигатель  стиральной машины через
3 минуты после включения.
      Ответ.
             Включить двигатель
             ПОКА не прошли 3 минуты
             {
              проверять время
             }
             Выключить двигатель

     з) Автомат, отключающий двигатель  стиральной машины через
3 000 оборотов двигателя.
      Ответ.
             Включить двигатель
             ПОКА число оборотов меньше 3 000
             {
              считать обороты
             }
             Выключить двигатель

2. Как обмануть интерпретатор
     3. Провести исполнителя по прямоугольнику А-Б-В-Г. Размеры
прямоугольника заранее неизвестны. (<<task502.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │Г │# │  │  │  │  │  │А │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │В │  │  │  │  │  │  │Б │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │  │  │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

     Решение.

        ЭТО А_Б_В_Г
         ПОКА ПУСТО ВПРАВО
         ПОКА ПУСТО ВНИЗ
         ПОКА ПУСТО ВПРАВО
         ПОКА ПУСТО ВВЕРХ
        КОНЕЦ

     4. На одном из перевернутых кубиков  в  первом  столбце  -
буква "Ш". Найдите ее и составьте слово ИШАК. Букву "Ф"  с поля
надо убрать. (<<task505.coc>>)
                1 2 3 4 5 6 7 8 9 10
               ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
             1 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             2 │#│?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             3 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             4 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             5 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             6 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             7 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             8 │ │?│ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             9 │ │ │ │Ф│ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             10│ │ │ │ │И│ │А│К│ │ │
               └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

     Решение.
ЭТО Ишак
    // Поиск буквы Ш
    ВПРАВО
    ПОКА НЕ Ш Поиск
    // Букву Ш в шестой столбец
    ПОВТОРИ 3  ВПРАВО
    // Определиться на "местности" - поиск Ф
    ВЛЕВО
    ПОКА НЕ Ф ВНИЗ
    // Выбросить Ф с поля
    ВНИЗ
    // Поставить Ш на место
    Установка
КОНЕЦ

ЭТО Поиск
    ВЛЕВО
    ВНИЗ
    ВПРАВО
КОНЕЦ

ЭТО Установка
    // Исполнителя в первую строку
    ПОВТОРИ 9 ВВЕРХ
    // Исполнителя в клетку (1,6)
    ПОВТОРИ 2 ВПРАВО
    // Букву Ш на место
    ПОВТОРИ 8 ВНИЗ
КОНЕЦ

     5. На  одном  из перевернутых кубиков в пятой строке  поля
Кукарачи - буква "Ь". Найдите ее и составьте слово МЫШЬ. В пер-
вом  столбце  третьей строки расположена буква "Ф"  -  ее  надо
спихнуть в ров. (<<task506.coc>>)

                1 2 3 4 5 6 7 8 9 10
               ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
             1 │М│Ы│Ш│ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             2 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             3 │Ф│ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             4 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             5 │ │?│?│?│?│?│?│?│?│ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             6 │ │ │ │ │ │ │ │ │#│ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             7 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             8 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             9 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             10│ │ │ │ │ │ │ │ │ │ │
               └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

  Решение.

ЭТО Мышь
    // Поиск Ь
    ВВЕРХ
    ПОКА НЕ Ь Поиск
    // Букву Ь во вторую строку
    ПОВТОРИ 2 ВВЕРХ
    // Определиться на "местности"
    ПОКА НЕ Ф ВЛЕВО
    ВВЕРХ
    // Поставить букву Ь на место
    Установка
КОНЕЦ

ЭТО Поиск
    ВНИЗ
    ВЛЕВО
    ВВЕРХ
КОНЕЦ

ЭТО Установка
    // Букву Ь в 9 столбец
    ПОВТОРИ 7 ВПРАВО
    // Букву Ь в первую строку
    ВНИЗ
    ВПРАВО
    ВВЕРХ
    // Подойти к букве Ь справа
    ВПРАВО
    ВВЕРХ
    // Поставить Ь на место
    ПОВТОРИ 5 ВЛЕВО
КОНЕЦ

     6. Во второй строке со второй позиции  записано число, все
цифры которого разные.  Упорядочить  цифры числа в порядке воз-
растания, если известно, что среди цифр числа нет  нулей и еди-
ниц. Букву Н, расположенную в клетке (1,1), удалить  с поля. На
рисунке показано  возможное  состояние среды в начальный момент
(<<task507.coc>>):

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

     Решение. Программа написана на  основе  той же идеи, что и
программа для задачи 10 про ЭКРАН из предыдущей главы.

//-------------------------------------
ЭТО Порядок                            
 // Смещение первой цифры
 ВНИЗ                                  
 ПОКА НЕ ПУСТО                         
 {
  Цифру_в_нужную_строку
  // Исполнитель в первую строку
  ВВЕРХ
  // Смещение в следующий столбец      
  ВПРАВО
  // Проверка клетки под исполнителем
  ВНИЗ
 }
 Собрать_цифры_в_последнем_столбце
КОНЕЦ

//-------------------------------------
// Переключатель
ЭТО Цифру_в_нужную_строку              
 ЕСЛИ       3 ТО Цифра_3
 ИНАЧЕ ЕСЛИ 4 ТО Цифра_4
 ИНАЧЕ ЕСЛИ 5 ТО Цифра_5               
 ИНАЧЕ ЕСЛИ 6 ТО Цифра_6
 ИНАЧЕ ЕСЛИ 7 ТО Цифра_7               
 ИНАЧЕ ЕСЛИ 8 ТО Цифра_8
 ИНАЧЕ ЕСЛИ 9 ТО Цифра_9               
КОНЕЦ                                  
//-------------------------------------
ЭТО Цифра_3
 ВНИЗ
 ВВЕРХ
КОНЕЦ                                  
//-------------------------------------
ЭТО Цифра_4
 ПОВТОРИ 2 ВНИЗ
 ПОВТОРИ 2 ВВЕРХ
КОНЕЦ                                  
//-------------------------------------
ЭТО Цифра_5
 ПОВТОРИ 3 ВНИЗ
 ПОВТОРИ 3 ВВЕРХ                       
КОНЕЦ
//-------------------------------------
ЭТО Цифра_6                            
 ПОВТОРИ 4 ВНИЗ
 ПОВТОРИ 4 ВВЕРХ                       
КОНЕЦ
//-------------------------------------
ЭТО Цифра_7                            
 ПОВТОРИ 5 ВНИЗ
 ПОВТОРИ 5 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Цифра_8                            
 ПОВТОРИ 6 ВНИЗ
 ПОВТОРИ 6 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Цифра_9                            
 ПОВТОРИ 7 ВНИЗ
 ПОВТОРИ 7 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО Собрать_цифры_в_последнем_столбце
 // Исполнителя в клетку (1,1)
 ВВЕРХ                                 
 ПОКА ПУСТО ВЛЕВО
 // Установка цифр в последнем столбце
 ВНИЗ
 ПОВТОРИ 8                             
 {                                     
  ВНИЗ
  ПОВТОРИ 8 ВПРАВО
  ПОВТОРИ 8 ВЛЕВО
 }
КОНЕЦ                                  


3-ое занятие. Глава 6. Кукарача хочет укусить себя за хвост
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 (░11) Представление о рекурсии, простые примеры
 (░20) Рекурсивный практикум, программы с "отложенным" выполнением команд

Основные понятия
   РЕКУРСИЯ -  это метод программирования, при котором процедура
сама (ПРЯМАЯ РЕКУРСИЯ) или через другие процедуры (КОСВЕННАЯ РЕ-
КУРСИЯ) вызывает саму  себя.  Рекурсия может никогда не заканчи-
ваться, и в  этом случае она называется БЕСКОНЕЧНОЙ. Когда прог-
раммист при  помощи  условий  обеспечивает выход из рекурсивного
цикла, рекурсия становится КОНЕЧНОЙ.

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

3. Головоломное программирование
  1. На одном из перевернутых  кубиков  (не на первом!) - буква
"И". Найдите ее и составьте слово  ТИГР.  Используйте  кубик  с
буквой "М" для определения положения Кукарачи.
(<<task602.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │# │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │? │? │? │? │? │? │? │? │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │  │  │  │  │  │  │  │М │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │  │  │  │  │  │Т │  │Г │Р │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │  │  │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

     Решение.
//-------------------------------------
ЭТО Тигр                               
 Поиск_И                               
 Идти_к_М
 Поставить_И
КОНЕЦ // Тигр                          
//-------------------------------------
ЭТО Поиск_И                            
 ВНИЗ
 ЕСЛИ НЕ И
  ТО                                   
  {                                    
   // убрать букву с поля              
   ВПЕРЕД                              
   ВНИЗ
   НАЗАД
   ВПЕРЕД                              
   ВВЕРХ                               
   НАЗАД
   // сместиться к следующей букве     
   ВВЕРХ
   ВПРАВО                              
   Поиск_И
  }                                    
КОНЕЦ // Поиск_И                       
//-------------------------------------
ЭТО Идти_к_М
 ВПРАВО                                
 ВНИЗ
 ВПРАВО                                
 ЕСЛИ НЕ М
  ТО
  {                                    
   ВЛЕВО
   ВВЕРХ                               
   ПОВТОРИ 2 ВЛЕВО                     
   ВНИЗ
   ВПРАВО
   ВВЕРХ                               
   ВПРАВО                              
   Идти_к_М                            
  }                                    
  ИНАЧЕ  // выброс последней буквы
  {
   ПОВТОРИ 3 ВВЕРХ
   ПОВТОРИ 3 ВНИЗ                      
  }                                    
КОНЕЦ // Идти_к_М

//-------------------------------------
ЭТО Поставить_И                        
  ПОВТОРИ 2 ВЛЕВО
  ВВЕРХ                                
  ВЛЕВО
  ПОВТОРИ 2 ВНИЗ
КОНЕЦ // Поставить_И

   2. Исполнитель располагается в левом верхнем углу поля. Куби-
ки с буквами стоят ниже него по одному в каждом столбце (их рас-
положение в столбце  произвольно, но не выше второй строки). На-
писать программу,  которая  перемещает  все  эти  кубики на одну
строку ниже. (<<task603.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │# │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │Ж │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │Ж │  │Ж │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │Ж │  │Ж │  │  │  │  │Ж │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │  │  │Ж │  │  │Ж │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │  │  │  │  │  │  │Ж │Ж │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │  │  │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

     Решение
//-------------------------------------
ЭТО Смещение                           
 ПОВТОРИ 9
 {
  Столбец                              
  ВПРАВО                               
 }
 Столбец
КОНЕЦ // Смещение                      
//-------------------------------------
ЭТО Столбец                            
 ВНИЗ
 ЕСЛИ ПУСТО ТО Столбец                 
 ВВЕРХ                                 
КОНЕЦ // Столбец                       

   3. Исполнитель располагается в клетке (2,2) поля внутри кори-
дора неизвестной  длины.  Внизу  коридора нижняя стенка сломана.
Починить коридор  и  вернуть  исполнителя  в исходное положение.
(<<task604.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │  │  │Ж │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │Ж │# │  │Ж │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │Ж │  │  │Ж │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           4 │  │  │Ж │  │  │Ж │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           5 │  │  │  │Ж │  │  │Ж │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           6 │  │  │  │  │Ж │  │  │Ж │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           7 │  │  │  │  │  │Ж │  │  │Ж │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           8 │  │  │  │  │  │  │Ж │Ж │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           9 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
          10 │  │  │  │  │  │  │  │  │  │  │
             └──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
     Решение

//-------------------------------------
ЭТО Работа                             
  Шаг
  Шаг1                                 
КОНЕЦ // Имя
//-------------------------------------
ЭТО Шаг
 ЕСЛИ ПУСТО
  ТО
  {
   Шаг1 // Шаг по диагонали вниз
   Шаг
  }
 // Возврат на место
 Шаг2                                  
КОНЕЦ // Шаг                           
//-------------------------------------
ЭТО Шаг1 // Шаг по диагонали вниз
 ВПРАВО                                
 ВНИЗ
КОНЕЦ // Шаг1
//-------------------------------------
ЭТО Шаг2  // Шаг по диагонали вверх
  ВВЕРХ                                
  ВЛЕВО
КОНЕЦ // Шаг2                          
//-------------------------------------

   4. Исполнитель находится  в  левом  верхнем  углу.  Во второй
строке, начиная с первой позиции  записано  слово  не длиннее 7
символов. Поставить Кукарачу в строку, номер которой равен длине
этого слова. (<<task605.coc>>)
              1  2  3  4  5  6  7  8  9  10
             ┌──┬──┬──┬──┬──┬──┬──┬──┬──┬──┐
           1 │# │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           2 │к │о │р │о │в │а │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤
           3 │  │  │  │  │  │  │  │  │  │  │
             ├──┼──┼──┼──┼──┼──┼──┼──┼──┼──┤

     Решение
//-----------------------------------
ЭТО Счет                               
 Счет_
 // Корректировка положения исполнителя
 ПОВТОРИ 3 ВВЕРХ
КОНЕЦ // Счет                          
//-------------------------------------
ЭТО Счет_                              
 ВНИЗ
 ЕСЛИ НЕ ПУСТО ТО
 {
   ВВЕРХ
   ВПРАВО                              
   Счет_
 }
 // Движение исполнителя вниз
 // после выхода из рекурсии
 ВНИЗ                                  
КОНЕЦ // Счет_                         

   5. (автор Лилитко  Е.П.). Кукарача расположен в верхнем левом
углу поля.  Где-то под ним в  первом столбце находится  буква А.
Требуется умножить номер строки, в которой стоит буква, на два и
поставить Кукарачу в соответствующую строку. Сообщение "Не могу"
допускается, если результат больше десяти. (<<task606.coc>>)

     Решение

ЭТО Умножение
  Умножить_на_2
  ВНИЗ
КОНЕЦ

ЭТО Умножить_на_2                      
  ВНИЗ
  ЕСЛИ НЕ А
    ТО Умножить_на_2
  ВНИЗ
КОНЕЦ

   6. Автор Е.П.Лилитко. Требуется построить нового исполнителя,
"управляемого данными", поведение которого будет полностью зави-
сеть от расположения букв на поле, а именно: изначально Кукарача
движется вниз до  тех  пор, пока не встретит  одну  из букв "В",
"Н", "Л", "П" или "С". Встретив одну из этих букв, он продолжает
движение соответственно "вверх", "вниз",  "влево",  "вправо" или
немедленно останавливается.  На  дальнейшем  пути Кукарачи может
вновь повстречаться одна из  приведенных  букв, и тогда он вновь
изменяет направление вышеописанным способом. Для нового исполни-
теля создайте программу (установите в нужные места буквы-команды
и Кукарачу),  заставляющую  ходить его по расширяющейся спирали.
(<<task607.coc>>)

     Решение

ЭТО Идти_Вниз
    ВНИЗ
    ЕСЛИ П
      ТО Идти_Вправо
    ЕСЛИ Л
      ТО Идти_Влево
    ЕСЛИ В
      ТО Идти_Вверх
    ЕСЛИ НЕ С
      ТО Идти_Вниз
КОНЕЦ

ЭТО Идти_Вверх
    ВВЕРХ
    ЕСЛИ П
      ТО Идти_Вправо
    ЕСЛИ Л
      ТО Идти_Влево
    ЕСЛИ Н
      ТО Идти_Вниз
    ЕСЛИ НЕ С
      ТО Идти_Вверх
КОНЕЦ

ЭТО Идти_Влево
    ВЛЕВО
    ЕСЛИ П
      ТО Идти_Вправо
    ЕСЛИ В
      ТО Идти_Вверх
    ЕСЛИ Н
      ТО Идти_Вниз
    ЕСЛИ НЕ С
      ТО Идти_Влево
КОНЕЦ

ЭТО Идти_Вправо
    ВПРАВО
    ЕСЛИ Л
      ТО Идти_Влево
    ЕСЛИ В
      ТО Идти_Вверх
    ЕСЛИ Н
      ТО Идти_Вниз
    ЕСЛИ НЕ С
      ТО Идти_Вправо
КОНЕЦ

Программа для нового исполнителя "Поход по спирали":
                1 2 3 4 5 6 7 8 9 10
               ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
             1 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             2 │С│ │ │ │ │ │ │Л│ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             3 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             4 │ │ │Н│ │ │Л│ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             5 │ │ │ │ │#│ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             6 │ │ │ │ │П│В│ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             7 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             8 │ │ │П│ │ │ │ │В│ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             9 │ │ │ │ │ │ │ │ │ │ │
               ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
             10│ │ │ │ │ │ │ │ │ │ │
               └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘


     7. Кукарача расположен в нижнем левом углу поля. Прямо над
ним в расположена строка из букв Г, заканчивающаяся знаком "-".
Буквы Г начинаются с первого столбца и их не больше семи. Напи-
сать программу, выполняя которую Кукарача построит лесенку (как
на рисунке) и  после завершения своих трудов остановится в пра-
вом верхнем углу поля. (<<task608.coc>>)

   1 2 3 4 5 6 7 8 9 10         1 2 3 4 5 6 7 8 9 10
  ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐        ┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐
1 │ │ │ │ │ │ │ │ │ │ │      1 │ │ │ │ │ │ │ │ │ │#│
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
2 │ │ │ │ │ │ │ │ │ │ │      2 │ │ │ │ │ │ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
3 │ │ │ │ │ │ │ │ │ │ │      3 │ │ │ │ │ │ │-│ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
4 │ │ │ │ │ │ │ │ │ │ │      4 │ │ │ │ │ │Г│ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
5 │ │ │ │ │ │ │ │ │ │ │ ──>  5 │ │ │ │ │Г│ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
6 │ │ │ │ │ │ │ │ │ │ │      6 │ │ │ │Г│ │ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
7 │ │ │ │ │ │ │ │ │ │ │      7 │ │ │Г│ │ │ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
8 │ │ │ │ │ │ │ │ │ │ │      8 │ │Г│ │ │ │ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
9 │Г│Г│Г│Г│Г│Г│Г│-│ │ │      9 │Г│ │ │ │ │ │ │ │ │ │
  ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤        ├─┼─┼─┼─┼─┼─┼─┼─┼─┼─┤
10│#│ │ │ │ │ │ │ │ │ │      10│ │ │ │ │ │ │ │ │ │ │
  └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘        └─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

     Решение

ЭТО Лесенка
    ВПРАВО
    ПОВТОРИ 7 На_строку
    ПОВТОРИ 2 ВВЕРХ
    ВПРАВО
КОНЕЦ

ЭТО На_строку
    ВВЕРХ
    ЕСЛИ Г
      ТО // Ступень
      {
        ВНИЗ
        ВПРАВО
        На_строку
      }
      ИНАЧЕ ПОВТОРИ 2 ВПРАВО // Коррекция
    ВЛЕВО
КОНЕЦ

     8. Автор Е.П.Лилитко. Кукарача расположен  в  нижнем левом
углу поля. Первая строка и первый столбец поля  пусты за исклю-
чением буквы "Г",  расположенной точно в левом верхнем углу по-
ля. На  остальном  пространстве поля разбросано некоторое коли-
чество букв  "А", не более чем по одной  на строку. Таким обра-
зом, некоторые строки содержат  одну  букву "А", а некоторые ни
одной. Требуется очистить поле от букв,  попутно подсчитывая их
количество. В конце работы Кукарача должен остановиться в стро-
ке, номер которой равен  количеству  сброшенных в ров букв "А".
Т.е. если изначально на поле была одна буква "А", Кукарача дол-
жен остановиться в первой строке, если две, то во второй и т.д.
Сообщение "Не могу" допускается только  в  том  случае, если ни
одной буквы "А" на поле не оказалось. (<<task609.coc>>)

ЭТО Сосчитать
    Проход
    ВВЕРХ
КОНЕЦ

ЭТО Проход
    ПОВТОРИ 9 ВПРАВО
    ЕСЛИ А
      ТО    Запомнить
      ИНАЧЕ Новый_Проход
КОНЕЦ

ЭТО Новый_Проход
    ПОВТОРИ 9 ВЛЕВО
    ВВЕРХ
    ЕСЛИ НЕ Г
      ТО Проход
КОНЕЦ

ЭТО Запомнить
    Новый_Проход
    ВНИЗ
КОНЕЦ

   9. Автор Е.П.Лилитко. Кукарача расположен в верхнем левом уг-
лу поля. Где-то на поле находится буква "А". Других букв на поле
нет. Требуется  найти эту букву  и встать на ее место. Сообщение
"Не могу" допускается только в том случае, если буквы "А" на по-
ле не оказалось. (<<task610.coc>>)

     Решение

ЭТО Найти_Букву_А
    Вверх_Вниз
    ЕСЛИ НЕ А
      ТО ВПРАВО
    ЕСЛИ НЕ А
      ТО Найти_Букву_А
КОНЕЦ

ЭТО Вверх_Вниз                         
    ПОВТОРИ 9 Поиск_Вниз
    ЕСЛИ НЕ А
      ТО Вправо_Вверх
КОНЕЦ

ЭТО Поиск_Вниз                         
    ЕСЛИ НЕ А
      ТО ВНИЗ
КОНЕЦ                                  
                                       
ЭТО Поиск_Вверх
    ЕСЛИ НЕ А
      ТО ВВЕРХ
КОНЕЦ

ЭТО Вправо_Вверх
    ВПРАВО
    ЕСЛИ НЕ А
      ТО ПОВТОРИ 9 Поиск_Вверх
КОНЕЦ

4-ое занятие. Глава 7. Неожиданные профессии Кукарачи
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Основные темы
 (░00) Команды ВПЕРЕД, НАЗАД; переходы исполнителя с поля на поле
 (░10) Решение задач

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

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


     Решение
//-------------------------------------
ЭТО Цифры_на_место                     
 ПОВТОРИ 9
 {                                     
  Работа                               
  ВПРАВО
  НАЗАД
 }
 Работа
 НАЗАД
КОНЕЦ // Цифры_на_место                
//-------------------------------------
ЭТО Работа
  ВНИЗ                                 
  ЕСЛИ       1 ТО Цифра_1
  ИНАЧЕ ЕСЛИ 2 ТО Цифра_2              
  ИНАЧЕ ЕСЛИ 3 ТО Цифра_3
  ИНАЧЕ ЕСЛИ 4 ТО Цифра_4
  ИНАЧЕ ЕСЛИ 5 ТО Цифра_5              
  ИНАЧЕ ЕСЛИ 6 ТО Цифра_6
  ИНАЧЕ ЕСЛИ 7 ТО Цифра_7              
  ИНАЧЕ ЕСЛИ 8 ТО Цифра_8              
  ИНАЧЕ ЕСЛИ 9 ТО Цифра_9
КОНЕЦ // Работа                        
//-------------------------------------
ЭТО Цифра_1                            
 ВПЕРЕД                                
 ПОВТОРИ 2 ВНИЗ
 НАЗАД
 ПОВТОРИ 2 ВВЕРХ
 ВПЕРЕД
 ВВЕРХ
КОНЕЦ // Цифра_1
//-------------------------------------
ЭТО Цифра_2
 ВПЕРЕД                                
 ПОВТОРИ 2 ВНИЗ
 НАЗАД                                 
 ВВЕРХ                                 
 ВПЕРЕД
 ПОВТОРИ 2 ВВЕРХ                       
КОНЕЦ // Цифра_2
//-------------------------------------
ЭТО Цифра_3                            
 ВВЕРХ
 ВПЕРЕД                                
КОНЕЦ // Цифра_4
//-------------------------------------
ЭТО Цифра_4                            
 ВНИЗ
 ПОВТОРИ 2 ВВЕРХ
 ВПЕРЕД
КОНЕЦ // Цифра_4
//-------------------------------------
ЭТО Цифра_5
 ПОВТОРИ 2 ВНИЗ                        
 ПОВТОРИ 3 ВВЕРХ
 ВПЕРЕД                                
КОНЕЦ // Цифра_5
//-------------------------------------
ЭТО Цифра_6                            
 ПОВТОРИ 3  ВНИЗ
 ПОВТОРИ 4  ВВЕРХ                      
 ВПЕРЕД
КОНЕЦ // Цифра_6                       
//-------------------------------------
ЭТО Цифра_7
 ПОВТОРИ 4  ВНИЗ                       
 ПОВТОРИ 5  ВВЕРХ
 ВПЕРЕД                                
КОНЕЦ // Цифра_7                       
//-------------------------------------
ЭТО Цифра_8
 ПОВТОРИ 5  ВНИЗ
 ПОВТОРИ 6  ВВЕРХ
 ВПЕРЕД
КОНЕЦ // Цифра_8
//-------------------------------------
ЭТО Цифра_9
 ПОВТОРИ 6  ВНИЗ                       
 ПОВТОРИ 7  ВВЕРХ
 ВПЕРЕД                                
КОНЕЦ // Цифра_9                       

   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 │  │  │# │  │  │  │  │  │  │  │

     Решение

//-------------------------------------
ЭТО Умножение_на_5
 ВВЕРХ                                 
 ЕСЛИ       0 ТО Ноль                  
 ИНАЧЕ ЕСЛИ 1 ТО Один
 ИНАЧЕ ЕСЛИ 2 ТО Два                   
 ИНАЧЕ ЕСЛИ 3 ТО Три
 ИНАЧЕ ЕСЛИ 4 ТО Четыре
 ИНАЧЕ ЕСЛИ 5 ТО Пять                  
 ИНАЧЕ ЕСЛИ 6 ТО Шесть                 
 ИНАЧЕ ЕСЛИ 7 ТО Семь
 ИНАЧЕ ЕСЛИ 8 ТО Восемь
 ИНАЧЕ ЕСЛИ 9 ТО Девять                
КОНЕЦ                                  
//-------------------------------------
ЭТО В_конец_первого_столбика_цифр
 ПОВТОРИ 2 ВПРАВО
 ПОВТОРИ 7 ВПЕРЕД
 ВВЕРХ
КОНЕЦ
//-------------------------------------
ЭТО В_конец_второго_столбика_цифр
 ВПРАВО                                
 ПОВТОРИ 3 ВПЕРЕД
 ВВЕРХ                                 
КОНЕЦ                                  
//-------------------------------------
ЭТО Вторая_цифра_0                     
 В_конец_второго_столбика_цифр
 НАЗАД
 ВНИЗ                                  
 ПОВТОРИ 2 НАЗАД                       
КОНЕЦ
//-------------------------------------
ЭТО Вторая_цифра_5                     
 В_конец_второго_столбика_цифр         
 ПОВТОРИ 2 НАЗАД
 ВНИЗ
 НАЗАД
КОНЕЦ
//-------------------------------------
ЭТО Первая_цифра_0                     
 В_конец_первого_столбика_цифр         
 НАЗАД
 ВНИЗ                                  
 ПОВТОРИ 6 НАЗАД
КОНЕЦ                                  
//-------------------------------------
ЭТО Первая_цифра_1
 В_конец_первого_столбика_цифр         
 ПОВТОРИ 2 НАЗАД
 ВНИЗ
 ПОВТОРИ 5 НАЗАД                       
КОНЕЦ                                  
//-------------------------------------
ЭТО Первая_цифра_2
 В_конец_первого_столбика_цифр         
 ПОВТОРИ 3 НАЗАД                       
 ВНИЗ
 ПОВТОРИ 4 НАЗАД
КОНЕЦ
//-------------------------------------
ЭТО Первая_цифра_3
 В_конец_первого_столбика_цифр         
 ПОВТОРИ 4 НАЗАД                       
 ВНИЗ
 ПОВТОРИ 3 НАЗАД                       
КОНЕЦ
//-------------------------------------
ЭТО Первая_цифра_4                     
 В_конец_первого_столбика_цифр
 ПОВТОРИ 5 НАЗАД                       
 ВНИЗ
 ПОВТОРИ 2 НАЗАД
КОНЕЦ                                  
//-------------------------------------
ЭТО Первая_цифра_5
 В_конец_первого_столбика_цифр
 ПОВТОРИ 6 НАЗАД                       
 ВНИЗ                                  
 НАЗАД
КОНЕЦ
//-------------------------------------
ЭТО Ноль
 Первая_цифра_0
КОНЕЦ                                  
//-------------------------------------
ЭТО Один
 Первая_цифра_5                        
КОНЕЦ
//-------------------------------------
ЭТО Два                                
 Первая_цифра_1
 Вторая_цифра_0                        
КОНЕЦ
//-------------------------------------
ЭТО Три                                
 Первая_цифра_1                        
 Вторая_цифра_5
КОНЕЦ
//-------------------------------------
ЭТО Четыре                             
 Первая_цифра_2
 Вторая_цифра_0
КОНЕЦ
//-------------------------------------
ЭТО Пять
 Первая_цифра_2                        
 Вторая_цифра_5                        
КОНЕЦ
//-------------------------------------
ЭТО Шесть
 Первая_цифра_3                        
 Вторая_цифра_0                        
КОНЕЦ
//-------------------------------------
ЭТО Семь
 Первая_цифра_3
 Вторая_цифра_5                        
КОНЕЦ                                  
//-------------------------------------
ЭТО Восемь
 Первая_цифра_4                        
 Вторая_цифра_0                        
КОНЕЦ
//-------------------------------------
ЭТО Девять
 Первая_цифра_4
 Вторая_цифра_5
КОНЕЦ                                  

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

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

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

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

     Решение

     а) Пусть, двигаясь по полю, Кукарача сделал  n шагов ВЛЕВО
и m  шагов ВВЕРХ. Так как Кукарача пришел  в исходную точку, то
он сделал столько же шагов ВЛЕВО,  сколько  и  ВПРАВО,  столько
ВВЕРХ, сколько и ВНИЗ, поэтому в программе
                   n цифр 1
                   n цифр 3
                   m цифр 2
                   m цифр 4.
   Сумма всех цифр программы равна: n*1 + n*3 + m*2 + m*4 =
   = n*(1+3) + m(2+4) = 4n + 6m = 2(2n+3m) - четное число.

   б) Нет, обратное утверждение не  верно,  пример опровергающей
программы: 11.
   в) Пусть:                                     2
            n - число команд ВЛЕВО               │
            m - число команд ВВЕРХ          1 ───┼──── 3
            l - число команд ВПРАВО              │
            d - число команд ВНИЗ                4
   Сумма цифр числа-программы = n + 2m + 3l + 4d.
   В первом случае m = 0 и n = l,  тогда  сумма цифр числа-прог-
раммы = 4n + 4d = 4(n+d).  Во втором  случае n  = d и сумма цифр
числа-программы = 8n.
