Лого Миры 2. 0. Разветвление. Циклы. Процессы

Кузнецова Ирина Николаевна

ЛОГО МИРЫ 2.0. РАЗВЕТВЛЕНИЕ. ЦИКЛЫ. ПРОЦЕССЫ

О СТРУКТУРНОМ ПРОГРАММИРОВАНИИ

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

Среда Лого ориентирована на объектный подход в программировании. Однако такой подход не исключает просто обработку данных. Следовательно, разработчик сталкивается с необходимостью организовать в алгоритме выбор действия, повторение действий, в зависимости от условий.

Еще в 1973 году появилась книга Х.Д. Милса (H.D.Mills) «Новая дисциплина программирования» («New Discipline Wins Programmer Approval»), в которой излагался общий подход к программированию, выражены идеи и эффективные методы, систематическое применение которых должно было сделать программирование похожим на науку. Так и произошло. Профессор Э.В.Дейкстра (E.W. Dijkstra) доказал, что любую задачу обработки данных можно решить с использованием только линейной, циклической и разветвляющей алгоритмической конструкции. Теория алгоритмов и программирование стали областями математики.

Программирование вообще включает проектирование, кодирование (запись на формальном языке) и тестирование алгоритма достижения поставленной цели. «Подобно поэту, который сочиняет поэму, так или иначе соблюдая размер и форму, программист создает программу из базовых логических структур [1]».

Сегодня достаточно литературы, в которой описываются элементарные алго-

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

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

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

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

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

Сегодня мы покажем, как на языке Лого описываются элементарные алгоритмические конструкции.

ПРОЦЕДУРА - ВСПОМОГАТЕЛЬНЫЙ АЛГОРИТМ

Вообще говоря, любая программа на Logo - процедура, так как может быть вызвана другой программой.

to proc <действия > end

proc - новое слово языка - команда или датчик (функция). РАЗВЕТВЛЕНИЕ

Эта алгоритмическая конструкция обеспечивает выбор одного из двух возможных списков действий, в зависимости от значения условия. Условие задается логическим выражением и может быть истинным (значение «да») или ложным (значение «нет»).

Полное разветвление ifelse <условие> [<список действий 1>] [<список действий 2>]

Неполное разветвление

Отсутствует список действий для ложного значения условия. if <условие> [<список действий 1>]

Выбор из нескольких вариантов

Команду if можно использовать для организации выбора одного списка действий из нескольких возможных - так называемой конструкции case. Если все условия ложны, выполнение процедуры может заканчиваться, даже если этот выбор включен в цикл. Останов текущей процедуры - команда stop.

if <условие> [<список действий 1>] if <условие> [<список действий 2>] if <условие> [<список действий 3>]

if <условие> [stop]

В качестве примера позвольте привести любимую всеми моими учениками идею управления объектом с помощью клавиатуры. Допустим, на Рабочем поле находится объект - черепашка под именем t1, движением которой управляет пользователь через клавиши управления курсором. Код нажатой клавиши считывается и вычисляется датчиками readchar и ascii:

make "cur ascii readchar

Выбор действия, соответствующего нажатой клавише, осуществляется по следующему алгоритму:

to actcase

make "cur ascii readchar t1,

if :cur = 38 [seth 0 fd 10] ;нажата клавиша «вверх» if :cur = 40 [seth 180 fd 10] ;нажата клавиша «вниз» if :cur = 39 [seth 90 fd 10 ] ;нажата клавиша «вправо» if :cur = 37 [seth 270 fd 10 ] ;нажата клавиша «влево» if :cur = 27 [stop ] ;нажата клавиша «ESC» end

Заметим, что датчик readchar начинает работать после щелчка мышью в любом месте Рабочего поля.

ЦИКЛ

Известны три вида циклов - перечисляемый (с заранее известным числом повторений), с предусловием, с постусловием.

Перечисляемый цикл

В Logo такой цикл можно организовать разными способами:

1. Команда repeat обеспечивает повторение указанное число раз указанный список команд.

repeat <число повторений> [<повторяемые действия>]

2. Команда dolist организует повторение указанных действий для каждого указанного значения заданной переменной.

dolist [<имя переменной> [<список значений этой переменной>]] [<список повторяемых действий>]

Предположим, надо нарисовать 5 квадратов, каждый из которых имеет определенный цвет. Цвета квадратов не связаны никакой зависимостью. Команда dolist будет содержать список значений этих цветов.

Вспомогательный алгоритм - цветной квадрат:

to sqc a c pd setc :c

repeat 4[fd :a rt 90]

rt 45 pu fd :a / 2 pd fill bk :a / 2 lt 45 end

Ряд из квадратов: to row a

dolist [col [15 45 65 75 95]][sqc :a :col fd :a] end

3. Команда dotimes обеспечивает повторение указанных действий для каждого значения из диапазона указанной числовой переменной (минимальное значение этой переменной - 0).

dotimes [<имя переменной > <верхнее значение диапазона>] [<список повторяемых действий >]

Если запустить программу clock, вы увидите на Рабочем поле секунд ную стрелку:

to clock seth 0

dotimes [k 360] [setc 9 arrow wait 1 setc 0 arrow seth :k]

setc 9 arrow st

end

Вспомогательный алгоритм рисования стрелки:

to arrow ht fd 100

lt 45 bk 20 fd 20 rt 45 rt 45 bk 20 fd 20 lt 45 bk 100 end

Цикл с постусловием repeat <max число повторений> [dddl if <условие окончания цикла> [stop]] to ddd1

<повторяемые действия> end

Рассмотрим пример.

Как установить защиту своего проекта? Можно защитить его паролем. Напишем программу, которая вызывается сразу после загрузки проекта и запрашивает пароль. Дается три попытки для ввода пароля. Если все-таки он оказался неверным, программа запрещает работу с проектом.

to startup

make "parol "1234567 /устанавливаем значение пароля repeat 3 [question [Введи пароль]

make "ans answer /запрашиваем и вводим пароль if :parol = :ans [announce [Привет, хозяин!] stop]

]

;если пароль неверный, экран чернеет, появляется сообщение о взломе и звучит колокол if not :parol = :ans

[presentationmode setbg 9

announce [Это взломщик!!! Проект отключен] forever [note 60 3]]

end

Цикл с предусловием repeat <max число повторений> [ifelse <условие> to ddd

<повторяемые действия> end

Рассмотрим в качестве примера классическую задачку поиска чисел с заданным признаком в заданном интервале.

[ddd][stop]]

Нужно вывести в текстовое окно N чисел натурального ряда, которые делятся на 3.

to startnum

/подготовка данных в переменных

carefully[txt1, ct]

[newtext "txtl [-100 100]

[50 100]]

local [N k i]

make "k 1 /текущее число

make "i 0 /счетчик чисел

question [введи число N]

make "N answer /количество чисел

repeat 1000 [ifelse :i < :N

[if (remainder :k 3) = 0 [pr :k make make "k :k + 1] [stop]

]

end

'i : i + 1]

ОБЪЕКТЫ И ПРОЦЕССЫ

Мы рассмотрели задачи обработки конечных

данных. Однако, как было упомянуто ранее, в среде Logo существуют встроенные классы объектов, и есть возможность создавать новые классы. Дея-J тельность объектов часто представляет собой процесс - последовательность сменяющихся состояний. Для управления процессами предназначены команды forever, launch, when, stopme, cancel, waituntil.

В качестве первого примера организации процессов и взаимодействия объектов предложим задачу олимпиады по программированию ДООИ 2001 [2].

Задача. Проявление фотографии.

Кто занимался фотографией, видел, как проявляется фото. Постепенно и как бы сразу везде. Обратите внимание, что

а) Процесс прорисовки точек случайный. Нет такого момента времени, когда можно было бы увидеть выделенное направление прорисовки точек.

б) Процесс идет равномерно, в том смысле, что плотность точек примерно одинакова на любом участке в любой момент времени.

в) Темп прорисовки всегда один. Вы можете поставить большую задержку и увидеть, что скорость появления новых точек в начале проявления такая же, как и в конце.

Описание данных.

Два графических объекта - черепашки t1 и t2 работают в равных геометрически прямоугольниках, которые расположены с известным смещением относительно друг друга.

x1, y1 - координаты левой нижней вершины прямоугольника P1 с проявляемой фотографией.

w - ширина прямоугольника, h - высота прямоугольника, dx - смещение по оси X, dy - смещение по оси У для прямоугольника P2 с данной фотографией. post1 - координаты положения черепашки в прямоугольнике. cundert2 - цвет пикселя сканируемой фотографии.

Описание процессов.

Процесс scanphoto - объект t2 перемещается в точку P2, соответствующую значению переменной post1 (текущему положению черепашки t1 в прямоугольнике P1), измеряет цвет этого пикселя и записывает его значение в переменную cundert2.

Процесс showphoto - объект t1 закрашивает пиксель, на котором стоит, цветом, который содержится в переменной cundert2 (то есть цветом того пикселя, на котором стоит черепашка t2). Затем объект t1 случайным образом перемещается внутри прямоугольника P1 и записывает свои координаты в переменную post1.

Процедура рисования прямоугольника to rectangl w h

repeat 2[fd :h rt 90 fd :w rt 90] end

Процедура описания деятельности каждого объекта to process

t2, scanphoto tl, showphoto end

Проявление фотографии в прямоугольнике P1 to showphoto

setc :cundert2 pd fd 1 bk 1 pu ; случайное смещение по X и по У make "dxt random :w make "dyt random :h ;Новое положение для t1 в P1 make "xt :x1 + :dxt make "yt :y1 + :dyt make "post1 list :xt :yt setpos :post1 end

Сканирование фотографии в прямоугольнике P2 to scanphoto

make "xt2 :x2 + :dxt make "yt2 :y2 + :dyt setpos list :xt2 :yt2 make "cundert2 colorunder end

Запускающая процедура to startup

make "w 70 make "h 95 make "dx 0 make "dy :h + 20

make "x1 -100 make "y1 -50 make "x2 :x1 + :dx make

; создадим объекты - черепашек t1 и t2 , нарисуем прямоугольники и поместим в P2 исходный рисунок cg

carefully [t1, pu] [newturtle "t1] setpos list :x1 :y1 pd rectangl :w :h pu

carefully [t2, pu][newturtle "t2] setpos list :x2 :y2 pd rectangl :w :h pu

setpos list :x2 + 2 + :w / 2 :y2 + :h / 2 setsh 27 setsize 40 pd stamp pu setsh 0 ht t1, ht

;начальное смещение для позиции объекта t1: make "dxt 0 make "dyt 0 ;начальный цвет под объектом t2: make "cundert2 0

;Для окончания процесса - нажать на кнопку на рабочем поле

carefully[let [temp get "cancel.]][newbutton "cancel. [-50 -100] [cancel.]]

make "finish 0

forever [process] ;запуск процессов waituntil [finish = 1] cancel [process] ;ожидание признака завершения процессов end

Процедура завершения процесса to cancel. make "finish 1 end

Описание новых слов LOGO

question <текст> - открывает диалоговое окно, в котором написан <текст>, и предлагает ввести ответ. Можно устанавливать положение окна на Рабочем поле. answer - датчик, который сообщает введенный с клавиатуры ответ

на вопрос, заданный командой question, announce <текст> - выводит <текст> в сигнальном окне. local <имена переменных> - переменные или одна переменная становятся локальными для процедуры, в которой они объявлены. При завершении этой процедуры указанные в <имена переменных> переменные удаляются. let <имена и значения переменных> - создает в процедуре локальные переменные и задает им значения. note <нота> <длительность> - озвучивает указанную ноту в течение указанного времени на выбранном ранее музыкальном инструменте.

newtext <имя> <координаты> <длина и ширина> - создает текстовое окно с именем <имя>, левая верхняя вершина которого в точке с указанными координатами, а размеры указаны в <длина и ширина>.

newbutton <имя> <координаты> <команды> - создает в указанном месте Рабочего поля кнопку с указанным именем. При нажатии кнопки будут однократно выполняться <команды>. get <имя> <параметр> - датчик, который сообщает значение указанного параметра указанного объекта.

В следующем выпуске более подробно рассмотрим задачи, связанные с созданием объектов и управлением ими.

Плейер среды Лого Миры 2.01 можно найти на сервере www.school.edu.ru/int/logo или на сервере Петербургской Интернет-школы www.ipo.spb.ru/internet-school/ch5.htm.

Запустите на выполнение файл mw2player.exe, и вы получите инструмент для просмотра проектов.

Уже 7 лет группа энтузиастов Лого организует командные олимпиады в среде Лого. Некоторые задачи олимпиад были представлены в прошлом номере журнала.

На сервере Петербургской Интернет-школы вы сможете найти также файл olimpol.mw2. Он содержит задачи командной олимпиады в среде ЛОГО, которая проводилась в 2001 году. В проекте семь листов, на каждом - одна задача. Установочные программы и по одному варианту решения каждой задачи расположены на листе программ.

Более двух лет автор использует систему Лого Миры 2.01 в обучении информатике с 3 по 11 класс в 640 школе Санкт-Петербурга. Среда Лого применяется как иллюстрация понятий объектов, а также как среда программирования.В этом году команда из школы 640 приняла участие в дистанционной олимпиаде по программированию ДООИ. Опыт показал, что среда Лого ничем не хуже любой другой и позволяет решать все задачи.

Литература.

1. Дж. Хьюз, Дж. Мичтом, Структурный подход к программированию. М.: «Мир», 1980.

2. Материалы олимпиады по программированию ДООИ 2001 (http://dooi2001.narod.ru и http://attend.to/dooi, координатор -Потопахин Виталий Валерьевич).

Кузнецова Ирина Николаевна, учитель высшей категории, директор НОУ ДО «Папертовский центр», Санкт-Петербург.

© Наши авторы, 2001. Our authors, 2001.