    5. Процесс разработки программ. Один пример 

    Формулировка задачи. Пусть известно, что квадрант, в котором действует 
Путник, состоит из нечетного числа горизонтальных полей различной ненулевой 
высоты. Первая (верхняя) и последняя (нижняя) полосы свободны от 
препятствий. В каждой полосе с четным 

    Рис. 5.1 

номером имеются некоторое ненулевое число прямоугольных препятствий, 
высота которых равна высоте полосы, и хотя бы один проход (рис. 5.1). 
    Задача Путника состоит в том, чтобы пройти по квадранту из левого верхнего 
угла в правый нижний и по дороге подсчитать некоторые характеристики 
квадранта, например площадь всех препятствий, число полос с препятствиями, 
периметр проходов, у которых высота больше ширины, и т. п. (проходами 
называются прямоугольные промежутки между препятствиями или между 
препятствием и стеной в полосе препятствий), 
    Для проведения необходимых вычислений и запоминания информации в ваше 
распоряжение предоставлен базовый исполнитель 

    8. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ОДИН ПРИМЕР 65 

«Бортовой вычислитель» (БВ), предназначенный для подсчета характеристик 
квадранта. Его система предписаний такова:

    1. начать работу 
    2. число установить в нуль 
    3. число увеличить на единицу 
    4. число показать значение 
    5. общее число установить в нуль 
    6. общее число увеличить на единицу 
    7. общее число показать значение 
    8. общее число увеличить на число 

    Предписания 9—36 аналогичны предписаниям 2—8 и получаются заменой пары 
(число, общее число) на соответственно (ширина, общая ширина), (высота, общая 
высота), (периметр, общий периметр), (площадь, общая площадь). Так, например, 
есть предписание 

    36. общая площадь увеличить на площадь 

    Кроме того, Бортовой вычислитель умеет выполнять перекрестные операции: 

    37. периметр увеличить на ширину        
    38. периметр увеличить на высоту 
    39. площадь увеличить на произведение ширины на высоту 
    40. ширина меньше высоты      : да/нет 
    41. ширина равна высоте	: да/нет 
    42. ширина больше высоты      j да/нет 

    Наконец, имеются предписания, позволяющие запомнить некоторую информацию, 
а потом узнать, какая информация была запомнена; 

    43. запомнить что край 
    44. запомнить что ряд свободен 
    45. запомнить что есть препятствия 
    46. край	: да/нет 
    47. ряд свободен	: да/нет 
    48. есть препятствия	: да/нет 
    49. запомнить что флаг поднят 
    50. запомнить что флаг опущен 
    51. флаг поднят	: да/нет 
    52. флаг опущен	: да/нет 
    53. кончить работу 

    Бортовой вычислитель можно представлять в виде специализированного 
калькулятора — коробочки с кнопками, соответствующими перечисленным выше 
предписаниям. Внутри Бортового вычислителя имеется 12 объектов (его память). 
Это 10 встроенных

    3    А- Г. Кушниренко, Г, В, Лебедев 
    66 ГЛ. 1. НАЧАЛА ПРОГРАММИРОВАНИЯ 

счетчиков (число, общее число, ширина, общая ширина, высота, общая высота, 
периметр, общий периметр, площадь, общая площадь), а также два объекта для 
запоминания информации — один на три положения (край/ряд свободен/есть 
препятствия), а другой на два (флат поднят/флаг опущен), Состояния всех этих 
объектов и, в частности, ответы на вопросы типа « край» или «ряд свободен» 
зависят лишь от «нажатий на кнопки» Бортового вычислителя и физически никак 
не связаны с положением Путника в квадранте. 
    Кроме кнопок на передней панели Бортового вычислителя имеется табло, на 
котором по предписаниям «...показать значение» изображается состояние того или 
иного счетчика. 
    Итак, пусгь перед нами стоит задача написать программу: 

   программа подсчет площади всех препятствий 

    .  дано     :     | Путник в северо-западном (левом верхнем) углу 
    .	        | квадранта. Препятствия в квадранте расположены 
    .	        | горизонтальными полосами и не прилегают к 
    .	        | северной и южной стенам квадранта 
    .  получить:  | Путник в юго-восточном углу,  лицом на восток, 
    .	        | на табло Бортового вычислителя — суммарная 
    .	        | площадь всех препятствий в квадранте 

    Решение. В соответствии с технологией «сверху вниз» следует выделить 
наиболее крупные образования — структуры, которые были бы меньше, чем квадрант 
целиком, и придумать промежуточного исполнителя, который с этими образованиями 
будет работать. Легко видеть, что такими наиболее крупными образованиями 
являются полосы. Поэтому примем решение, что у нас будет специальный 
исполнитель «Обработчик полос» (ОП), выполняющий всю работу с полосами целиком. 
    Мы определили уровень подзадач, на которые будем разбивать исходную 
задачу. Поскольку число полос неизвестно, то решение будет содержать какой-то 
повторяющийся процесс. А так как есть по крайней мере два объекта, которые при 
этом меняются (положение Путника и счетчик Бортового вычислителя, в котором мы 
будем считать общую площадь всех препятствий), то попробуем применить схему 
проектирования цикла с помощью инварианта. 
    Прежде всего надо в терминах полос сформулировать общую стратегию решения 
задачи. Будем спускаться вдоль левого (западного) края квадранта и по дороге 
считать площадь препятствий в пройденных полосах (рис. 5.2). 
    Теперь надо описать начальное,  промежуточные b конечное состояния 
изменяющихся в цикле объектов. Пусть конечное положение Путника — в левом 
нижнем углу, промежуточные -- в левом

    5. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ОДИН ПРИМЕР 67 

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

    Рис.   5.2 

 же проход есть, то это — начало полосы препятствий. Назовем эти действия 
разведкой ряда южнее Путника и будем запоминать результат разведки в объекте 
«край»/«ряд свободен»/«есть препятствия» Бортового вычислителя. Например, если 
Путник находится у южной стены квадранта, то результат разведки — установка 
этого объекта в состояние «край». 
    Таким образом, искомую программу можно записать в виде программа подсчет 
площади всех препятствий 

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


    3*
    68 ГЛ. 1. НАЧАЛА ПРОГРАММИРОВАНИЯ 


    .  .        | площадь препятствий в пройденной части квадранта 
    .  .  пока не  БВ.край 
    .  .  выполнять 
    .  .    ОП. проход полосы препятствий с подсчетом площади 
    .  .    БВ. общая площадь увеличить на площадь 
    .  .    ОП. проход свободной полосы с разведкой следующего ряда 
    .  конец цикла 
    .    утв: | общая площадь = площадь препятствий в пройденной 
    .            | части квадранта. А так как пройден весь квадрант, k	
    .            | то общая площадь = площади препятствий во всем 
    .             | квадранте 
    .  БВ. общая площадь показать значение 
    .  Путник, повернуться на восток . 
    .  Путник, шагать до упора 
    конец программы 

    Итак, мы совершили первый шаг декомпозиции и получили реализацию программы 
«подсчет площади всех препятствий» на базе Обработчика полос, Путника и 
Бортового вычислителя. Обработчик полос не является базовым, и, следовательно, 
мы должны сделать следующий шаг декомпозиции — реализовать этого исполнителя. 

    исполнитель Обработчик полос (ОП) 
    . СП: 
    .  1. проход свободной полосы с разведкой следующего ряда 
    .  2. проход полосы препятствий с подсчетом площади 

    Начнем с предписания «проход свободной полосы с разведкой следующего 
ряда»: программа проход свободной полосы с разведкой следующего ряда 

   .  дано      :   | Путник в северо-западном углу свободной полосы 
   .  получить:  | Путник   в юго-западном углу той же свободной 
                         | полосы.   Разведан ряд южнее Путника 
   . -----------------

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

    5. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ОДИН ПРИМЕР 69 

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

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

    Реализуем теперь программу «разведка ряда южнее Путника, используя,  как  
и  выше,  схему  проектирования  цикла  с  помощью инварианта: 

    программа разведка ряда южнее Путника 
    .  дано         :  | Путник у западного края в свободном ряду 
    .  получить  :  | Путник там же, ряд южнее Путника разведан, 
    .                       | результат разведки запомнен в Бортовом вычислители 
    . ---------------------
    .    Путник.повернуться на восток 
    .   выбор 
    .  .     при Путник.справа занято ==> БВ.запомнить что край 
    .  .     при Путник.справа свободно => 
    .  .	БВ.запомнить что ряд свободен 
    . конец выбора 
    .  цикл 
    .  .   инв: | разведана часть ряда южнее Путника от западной 
    .  .	| стены и до клетки, севернее которой стоит Путник, 
    .  .	| включительно. Результат  разведки запомнен в БВ 
    .  .   пока Путник.впереди свободно и не БВ.есть препятствия 
    .  .   выполнять 
    .  .   Путник.сделать шаг 


    70 ГЛ. I. НАЧАЛА ПРОГРАММИРОВАНИЯ 


    .  .  если (БВ.край и Путник.справа свободно) или 
    .  .  .        (БВ.ряд свободен и Путник.справа занято) 
    .  .  .  то 
    .  .  .     БВ.запомнить что есть препятствия 
    .  .  конец если 
    .  конец цикла 
    .  Путник.повернуться на запад 
    .  Путник.шагать до упора 
    конец программы 

    Осталось реализовать предписание «проход полосы препятствий с подсчетом 
площади». Будем делать это в два этапа — сначала пройдем полосу препятствий и 
подсчитаем ее высоту, а затем пройдем под полосой препятствий и, уже зная 
высоту препятствий, подсчитаем их площадь: 
  
    программа проход полосы препятствий с подсчетом площади 
    .  дано        : | Путник у западного края в ряду над полосой 
    .                     | препятствий 
    .  получить : | Путник у западного края в ряду под полосой 
    .	        | препятствий, в счетчике "площадь" Бортового 
    .	        | вычислителя — площадь препятствий в 
    ,	        | пройденной полосе 
    . -----------------
    .  проход полосы препятствий с подсчетом ее высоты 
    .     утв: | Путник у западного края под полосой препятствий, 
    .	| в счетчике "высота" — высота полосы 

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

    .  Путник.повернуться на восток 
    .  БВ. ширина установить в нуль 
    .  если Путник.слева занято 
    .  .  то 
    .  .    БВ. ширина увеличить на единицу 
    .  конец если 
    .  цикл 
    .  .  инв: | в счетчике "ширина" — суммарная ширина препятствий в 
    .  .	| пройденной части полосы (включая клетку над Путником) 
    .  .  пока Путник. впереди свободно 
    .  .   выполнять 


    5. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ©ДНИ ПРИМЕР 71 


    .  .     Путник.сделать шаг 
    .  .    если Путник.слева занято то 
    .  .   .   БВ.ширина увеличить на единицу 
    .  .    конец если 
    .  конец цикла 
    .    утв: | Путник у восточного края под полосой препятствий, 
    .           | в счетчике "ширина" — суммарная ширина всех .	
    .           | препятствий в полосе 

    Осталось вычислить площадь препятствий и вернуться к западному краю: 

    .  БВ.площадь установить в нуль 
    .  Б В. плоп!адь увеличить на произведение ширины на высоту 
    .  Путник.повернуться на запад 
    .  Путник.шагать до упора 
    конец программы 

    Итак, мы реализовали предписание «проход полосы препятствий с подсчетом 
площади», использовав при этом вызов программы «проход полосы препятствий с 
подсчетом ее высоты». Теперь надо сделать следующий шаг и реализовать эту программу:

    программа проход полосы препятствий с подсчетом ее высоты 
   .  дано        :  | Путник у западного края над полосой препятствий 
   .  получить :  | Путник у западного края под полосой препятствий, 
   .                      | в счетчике "высота" — высота полосы 
   . -----------------
    БВ.высота установить в нуль 

    При проходе полосы препятствий могут быть две существенно различные 
ситуации — препятствие может прилегать или не прилегать к западной стенке 
квадранта. В первом случае можно просто обойти препятствие и на спуске 
подсчитать его высоту 
    
    Рис,   5.4 
    
    (рис. 5.4). Сам спуск и подсчет высоты естественно программировать, 
используя схему проектирования цикла с помощью инварианта; 
    
    .  Путник.повернуться на юг 
    ,  вы5ор 
    .    при   Путник.впереди занято => | у западного  края препятствие 
    .	   Путник.повернуться на восток 


    72	ГЛ.  1. НАЧАЛА ПРОГРАММИРОВАНИЯ 


    .  .	цикл пока Путник.справа занято выполнять 
    .  .	.    Путник.сделать шаг 
    .  .	конец цикла 
    .  .	Путник.повернуться на юг 
    .  .	Путник.сделать шаг 
    .  .	цикл 
    .  .	.   инв: | в счетчике "высота" — высота пройденной 	
    .  .          .           | части препятствия (клетка правее 	.            
    .  .          .           | Путника пройденной не считается) 
    .  .	.   пока Путник.справа занято 
    .  .	.   выполнять 
    .  .	.    Путник.сделать шаг 
    .  .	.    БВ.высота увеличить на единицу 
    .  .	конец цикла 

    Во втором случае нужно сначала найти какое-нибудь препятствие, чтобы вдоль 
него спуститься и подсчитать высоту  (рис. 5.5). 
    
    Рис.   5.5 

    .  .  при Путник.впереди свободно =*- |у западного  края свободно 
    .  .	Путник.сделать шаг 
    .  .	Путник.повернуться на восток 
    .  .	Путник.шагать до упора 
    .  .	Путник.повернуться на юг 
    .  .	цикл 
    .  .	.   инв: | в счетчике "высота" — высота пройденной 
    .  .	.           |части препятствия (клетка левее 
    .  .          .           | Путника пройденной не считается) 
    .  .          .   пока Путник.слева занято 
    .  .          .   выполнять 
    .  .          .   Путник.сделать шаг 
    .  .          .   БВ.высота увеличить на единицу 
    .  .           конец цикла 
    .   конец выбора 

    В  обоих случаях после спуска  с подсчетом высоты надо еще вернуться к 
западной стене квадранта: 

    .  Путник.повернуться на запад 
    .  Путник.шагать до упора 
    конец программы 

    5. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ОДИН ПРИМЕР 73 

    В заключение соберем все тексты воедино, чтобы создать представление о 
том, как выглядит полное решение задачи: 

   программа подсчет площади всех препятствий 
   .  дано        : | Путник в северо-западном (левом верхнем) углу 
   .                     | квадранта. Препятствия в квадранте расположены 
   .	       | горизонтальными полосами и не прилегают к 
   .                     | северной и южной стенам квадранта 
   .  получить:  | Путник в юго-восточном углу, лицом на восток, на 
   .                     I табло Бортового   вычислителя — суммарная  площадь 
   .                     | всех препятствий в квадранте 
   . -----------------
   .    БВ.общая площадь установить в нуль 
    .   ОП.проход свободной полосы с разведкой  следующего ряда 
    .    цикл 
    .    .   инв: | Путник в юго-западном углу свободной полосы, 
    .    .	] разведан ряд южнее Путника, в счетчике "общая 
    .    .	| площадь" — площадь препятствий в пройденной 
    .    .	|части квадранта 
    .    .   пока не БВ.край 
    .    .   выполнять	. 
    .    .     ОП.проход полосы препятствий с подсчетом площади 
    .    .     БВ.общая площадь увеличить на площадь 
    .    .    ОП.проход свободной полосы с разведкой следующего ряда 
    .    конец цикла 
    .   утв: | общая площадь = площадь   препятствий в пройденной 
    .           | части квадранта. А так как пройден весь 
    .           | квадрант, то общая площадь == площади препятствий 
    .           |во всем квадранте 
    .    БВ.общая площадь показать значение 
    .    Путник.повернуться на восток 
    .    Путник.шагать до упора 
    конец программы | 

    исполнитель Обработчик полос (ОП) 
    .  СП : 
    .  1. проход свободной полосы с разведкой следующего ряда 
    .    — разведка ряда южнее Путника 
    .    2. проход полосы препятствий с подсчетом площади 
    .   — проход полосы препятствий с подсчетом ее высоты 
    .
    .   используемые исполнители: 
    .    Путник 
    .    Бортовой вычислитель (БВ) 
    конец  описаний | ---------------------------------------


    74 ГЛ. I. НАЧАЛА ПРОГРАММИРОВАНИЯ 


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

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


    5. ПРОЦЕСС РАЗРАБОТКИ ПРОГРАММ. ОДИН ПРИМЕР	75 


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

    Программа проход полосы препятствий с подсчетом ее высоты 
    .  дано        :  | Путник у западного края над полосой препятствий . получить: 
    .                      | Путник у западного края под полосой препятствий, 
    .                      | в счетчике "высота" — высота полосы 
    .  БВ. высота установить в нуль 
    .  Путник, повернуться на юг 
    .  выбор 


    76 ГЛ. 1. НАЧАЛА ПРОГРАММИРОВАНИЯ 


    .  .   при Путник.впереди занято ==> | у западного края препятствие . 
    .  .        Путник.повернуться на восток 
    .  .               цикл пока Путник.справа занято
    .  .               .  выполнять Путник.сделать шаг 
    .  .               конец цикла 
    .  .               Путник.повернуться на юг 
    .  .               Путник.сделать шаг 
    .  .               цикл 
    .  .	     .   инв: | в счетчике "высота" — высота пройденной . .                
    .  .               .           |части препятствия (клетка правее 
    .  .               .           | Путника пройденной не считается) 
    .  .               .   пока Путник, справа занято                
    .  .               .   выполнять 
    .  .               .      Путник.сделать шаг 
    .  .               .     БВ. высота увеличить на единицу 
    .  .               конец цикла                                                                
    .  .  при Путник.впереди свободно => | у западного края свободно 
    .  .              Путник.сделать шаг 
    .  .              Путник.повернуться на восток                                 
    .  .              Путник.шагать до упора 
    .  .              Путник, повернуться на юг  
    .  .              цикл    
    .  .	    .  инв: | в счетчике "высота" — высота пройденной 
    .  .              .          | части препятствия (клетка левее     
    .  .              .          | Путника пройденной не считается)        
    .  .              .  пока Путник.слева занято                                          
    .  .              .  выполнять 
    .  .              .      Путник, сделать шаг 
    .  .              .      БВ.высота увеличить на единицу 
    .  .              конец цикла 
    .  конец выбора 
    .  Путник.повернуться на запад 
    .  Путник.шагать до упора 
    конец программы 
    конец исполнителя |==============================

    Напомним, что минусы перед именами программ «разведка ряда южнее Путника» 
и «проход полосы препятствий c подсчетом ее высоты» в описателе исполнителя 
«Обработчик полос» означают, что эти программы являются локальными: они не 
входят в систему предписаний, появились как решения каких-то подзадач и не 
могуг быть использованы вне исполнителя «Обработчик полос», 


    ЗАДАЧИ И УПРАЖНЕНИЯ 

    Модифицируя решение задачи «подсчет площади всех препятствий», получите 
решение следующих задач.

    6. ОБЪЕКТЫ. ПАРАМЕТРЫ. ТИПЫ 77 

    1. Число (периметр) всех препятствий. 
    2. Число (периметр, площадь) препятствий не у восточного края. 
    3. Число (периметр, площадь) препятствий, не прилегающих к стенам квадранта. 
    4. Число (периметр, площадь) препятствий, прилегающих к стенам квадранта. 
    5. Число   (периметр,  площадь)   квадратных  препятствий. 
    6. Число (периметр, площадь) препятствий, у которых ширина больше высоты. 
    7. Число (периметр, площадь) препятствий размером в одну клетку (1*1). 
    8. Число  (периметр, площадь)   препятствий размером 2*2. 
    9—16. Решите задачи 1—8, но не для препятствий, а для проходов. 
    17. Известно, что в квадранте несколько прямоугольных препятствий, которые 
прилегают к южной стене квадранта и не прилегают к другим стенам и друг к 
другу. Напишите программу, которая находит максимальную высоту препятствий и 
число препятствий максимальной высоты.