● Подготовка к очередному выполнению рабочей части цикла (продвижение цикла).
Основу цикла составляют действия, многократное выполнение которых должно привести к решению поставленной задачи. Функциональный компонент цикла, реализующий такие действия, будем называть рабочей частью цикла. Например, рабочая часть цикла может содержать инструкции, обеспечивающие обработку текущей порции данных. Рабочая часть цикла является его первым функциональным компонентом.
Проверка условия нахождения в цикле предназначена для определения момента, когда работа цикла должна быть закончена. Это второй функциональный компонент, который должен присутствовать в любом цикле.
Назначением инициализации является создание корректных начальных условий для работы цикла. Например, здесь может выполняться инициализация счетчика – переменной целого типа, которая используется для управления работой цикла. Это третий обязательный функциональный компонент цикла.
Наконец, последний из функциональных компонентов цикла предназначен для продвижения цикла. Здесь, например, могут располагаться инструкции, обеспечивающие получение новой порции обрабатываемых данных. Кроме того, здесь может изменяться значение счетчика, управляющего работой цикла.
Все компоненты, кроме инициализации могут выполняться неоднократно, образуя так называемый контур цикла. Однократный “проход” цикла будем называть шагом. В качестве синонимов используются следующий понятия: итерация и виток цикла.
Разработку цикла следует начинать с его рабочей части. Необходимо выяснить, что же должен делать цикл? Ответ на этот вопрос должен носить общий характер. Он должен быть пригоден для произвольного шага цикла.
Остальные компоненты цикла выполняют служебные функции. К их разработке следует переходить только после того, как станет ясным, какие действия необходимо выполнять в рабочей части цикла.
В конкретной реализации цикла взаимное расположение частей цикла, составляющих его контур, может быть различным. Для иллюстрации назначения отдельных функциональных частей цикла рассмотрим один из вариантов организации циклического алгоритма, который приведен на рисунке, представленном ниже. Особенностью этого варианта организации цикла является то обстоятельство, что выполнение первого шага цикла начинается с проверки нахождения в цикле. Такие циклы называются циклами с предусловием.
51
1
Инициализация цикла
2 |
|
|
|
Нет |
|
Продолжать цикл? |
|
||
|
|
|||
|
|
Да |
||
|
|
|||
|
|
|
|
|
3 |
|
|
|
|
|
Рабочая часть цикла |
|
|
|
|
|
|
|
|
4 Подготовка к очередному выполнению цикла
5
Продолжение алгоритма
Рассмотрим пример организации циклического алгоритма. Пусть необходимо вычислить сумму квадратов первых “n” натуральных чисел. Введем следующие обозначения: i – очередное натуральное число, s – искомая сумма. Для нахождения суммы s необходимо выполнить “n” сложений. Действительно, s = 12 + 22 + .. + i2 +.. + n2 . Указанные действия можно осуществить за “n” шагов цикла, используя принцип накопления суммы. Для этого под s следует понимать текущее значение суммы, которое только после завершения работы цикла оказывается равным искомому значению суммы квадратов. Используя такой подход, в рабочей части цикла (символ 3) следует поместить инструкцию – присваивание языка Си следующего вида:
s += i * i; /* s = s + i * i ; */
Для правильной работы цикла переменные i и s необходимо
инициализировать следующим образом (символ 1): i = 1;
s = 0;
52
В символе 4 для правильного продвижения цикла следует поместить
инструкцию инкремента переменной i: i++;
Для обеспечения n кратного выполнения цикла в символе 2 следует проверять отношение: i <= n .
1
i = 1; s = 0;
2 |
Нет |
i <= n
Да
3
s += i * i;
4
i++;
5
Продолжение алгоритма
Циклические алгоритмы можно разделить на две категории:
1.Арифметические циклы.
2.Итерационные циклы.
Карифметическим циклам относятся циклы, количество повторений которых заранее известно. Более точно, количество повторений таких циклов либо содержится в условии задачи, либо может быть вычислено до начала выполнения цикла.
Итерационные циклы – это циклы с неизвестным количеством повторений тела цикла. Более точно, количество повторений тела итерационного цикла становится известным только после завершения работы цикла.
Приведем примеры задач, решения которых требует организации соответственно арифметических и итерационных циклов.
53
Задача 1. Табулировать функцию y = x2 в n равноотстоящих точках, начиная от x = xn вплоть до x = xk.
Количество повторений цикла в этой задаче содержится в условии задачи. Оно должно быть равно значению величины.n. Дело в том, что при решении данной задачи следует n раз выполнить однотипные вычисления, для которых придется организовать цикл. Незнание того, как это выполнить не мешает интуитивно предполагать, что для решения потребуется именно арифметический цикл.
Задача 2. Табулировать функцию y = x2 в равноотстоящих точках, начиная от x = xn вплоть до x = xk с шагом dx.
Эту задачу можно рассматривать как разновидность предыдущей задачи. Это обусловлено тем обстоятельством, что количество повторений цикла n может быть определено до начала работы цикла, если округлить значение, полученное в результате вычисления следующего выражения:
(xk – xn) / dx + 1.
Задача 1. Обработка последовательности произвольной длины.
Это значительный класс задач. Примером такой задачи может быть задача о вычислении суммы произвольного количества чисел, вводимых с клавиатуры. Для прекращения обработки могут использоваться следующие способы:
●Ввод так называемого стоп-кода.
●Ввод признака конца файла.
Важным элементом здесь является то обстоятельство, что решение о прекращении обработки (вычисление суммы) оперативно принимает пользователь программы во время ее выполнения.
Задача 2. Вычисление значения корня квадратного по формуле Герона. Эта задача относится к обширному классу задач вычислительной
математики, в котором используются приближенные вычисления.
Вязыке Си имеются три циклические управляющие инструкции:
●for
●while
●do while
Остановимся вначале на общих вопросах организации циклов, управляемых рассматриваемыми инструкциями.
В общем случае каждый из таких циклов состоит из трех структурных частей:
●инструкций инициализации,
●собственно управляющей инструкции (for, while или do while),
54
● тела цикла – единственной инструкции, которая находится под управлением циклической инструкции.
Ограничение на количество управляемых инструкций является несущественным. Дело в том, что при необходимости размещения в теле цикла несколько инструкции, эти инструкции всегда могут быть объединены в составную инструкцию.
Инструкции инициализации, если они необходимы, должны всегда располагаться до циклической инструкции. Инструкция, составляющая тело цикла, при использовании циклических инструкций for и while должна располагаться непосредственно за циклической инструкцией, а при использовании циклической инструкции do while - должна находиться внутри циклической инструкции.
Каждая из циклических инструкций содержит управляющее условие, определяющее момент прекращения управления телом цикла. Прекращение управления при использовании каждой из трех циклических инструкций соответствует получению булевского значения false при оценке управляющего условия.
Циклы, управляемые инструкциями for и while, являются циклами с предусловием, а цикл, управляемый инструкцией do while – циклом с постусловием. В циклах с предусловием управляющее условие оценивается до выполнения тела цикла, а в циклах с постусловием – после выполнения тела цикла. Это означает, что при использовании первых двух разновидностей циклов возможна ситуация, когда тело цикла не выполнится ни разу. При использовании цикла, управляемого инструкцией do while, тело цикла должно выполниться хотя бы один раз.
Наиболее простую структуру имеют циклические инструкции while и do while. Их содержательная часть содержит управляющее условие, которое заключается в круглые скобки. Логика работы таких циклов чрезвычайно проста. Необходимо на каждом шаге цикла оценивать значение управляющего условия, а затем выполнять тело цикла или завершать его выполнение.
Циклическая инструкция for имеет более сложную структуру. Содержательная часть этой инструкции состоит из трёх выражений, заключенных в круглые скобки. Первое из этих выражений предназначено для записи элементов инициализации, второе выражение выполняет те функции, что и управляющее выражение в инструкциях while и do while. Последнее выражение предназначено для записи действий по “продвижению” цикла. Указанная особенность цикла for делает целесообразным использование этого вида циклов, когда все элементы управления циклом могут быть реализованы с помощью инструкции for. Отметим, что часто такая возможность имеется при организации арифметических циклов. В связи с этим цикл, управляемый инструкцией for, нашел наибольшее применение при программировании арифметических циклов. Это обусловило то положение, что работа цикла, управляемого инструкцией for, поясняется на примере программирования арифметического
55