- •Тема 1. Организация ветвлений на языке Ассемблера
- •Тема 2. Организация циклов на языке Ассемблера Условное и безусловное ветвление (переходы)
- •Оператор goto
- •Блок-схемы
- •7.8. Исключение goto и структурное программирование
- •Goto вредны?
- •Жизнь без goto
- •Цикл как аппроксимация
- •Инвариант цикла стратегии "максимум" на шаге I
- •Стратегия цикла
- •Оператор цикла: базисный синтаксис
- •Включение инварианта
- •Оператор цикла: корректность
- •Корректность
- •Корректность
- •Завершение цикла и проблема остановки
- •Определение: Вариант цикл
Жизнь без goto
Задача исключения, рассматриваемая в приложении, — это не та задача, которую придется решать в повседневной жизни. Нет необходимости писать программу с goto, а потом последовательно исключать этот оператор из программы. Следует ясным способом строить нашу программу, непосредственно применяя высокоуровневые структуры управления, которые доказали свою адекватность при построении алгоритмов, простых и сложных.
Наша вторая структура управления — цикл — отражает одно из самых замечательных свойств компьютеров: их способность повторять операцию или варианты этой операции много раз, по человеческим меркам —очень много раз.
Типичным примером цикла является схема анимации, подсвечивающая линию метро и отображающая красную точку на каждой станции поочередно через каждые полсекунды. Система Show_line в поставке Trafficреализует этот сценарий. Вы можете выполнить ее, если желаете. Эффект выполнения одного из промежуточных шагов показан на рисунке:
увеличить изображение Рис. 7.4. Подсветка станции
Этот эффект достигается благодаря циклу. Он использует show_spot (p) для отображения красной точки в точке p на экране через каждые полсекунды (значение, предопределенное для Spot_time). Для понимания деталей нам необходимы концепции, которые предстоит еще ввести по ходу обсуждения, так что пока просто посмотрите, как выглядит цикл.
Рис. 7.5. Тело цикла
Цикл передвигает курсор (виртуальный маркер) к началу линии (start); затем, пока курсор не достиг последней позиции (is_after), он выполняет для каждой станции (item) следующие действия: отображает красное пятно в точке расположения станции — location, и передвигает курсор командой forth к следующей станции.
Каждое такое выполнение тела цикла называется итерацией цикла.
Рассмотрим ключевые составляющие цикла: инициализация (from), условие выхода (until) и повторно выполняемые действия (loop). Для получения полного понимания работы цикла следует предварительно проанализировать лежащие в его основе концепции.
Анимация
Поместите приведенный цикл в метод класса (пример класса для этой лекции). Для этого примера и последующих вариаций обновите класс и запустите систему, чтобы увидеть результаты выполнения.
Цикл как аппроксимация
Как прием решения задач цикл является методом аппроксимации результата на последовательных, все расширяющихся подмножествах пространства задачи.
В примере с анимацией линии метро вся задача состоит в том, чтобы отобразить красную точку последовательно на каждой станции линии. Последовательными аппроксимациями являются: вначале точка не отображается ни на одной станции, затем отображается на первой станции, затем на второй, и так далее.
Вот
еще один пример. Предположим, требуется
узнать максимум множества из
одного или нескольких значений
.
Следующая стратегия неформально
описывает эту работу.
Положить max равным
.
После этого справедливо,
что max является максимумом множества,
состоящего ровно из одного значения,
.Затем для каждого последовательного i = 2, 3,..., n выполнять следующее: если
больше
чем текущее значении max,
переопределить max,
сделав его равным
.
Из этого следует, что на i-м шаге (где первый шаг соответствует случаю I1, а последующие шаги — случаю I2 для i = 2, i = 3 и т.д.) действует следующее свойство, называемое инвариантом цикла.
