Найти тему
Top Skill

Базовая алгоритмическая конструкция "Цикл"

Данная статья является дополнением ранее опубликованного видео четвёртого урока, поэтому перед прочтением рекомендуется его посмотреть.

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

С помощью циклов организуется итерационный процесс, то есть, то самое многократное выполнение заданного действия или действий, а одно отдельно взятое выполнение цикла называется тактом выполнения цикла или итерацией.

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

Схематичное представление распределения разных типов циклов по группам
Схематичное представление распределения разных типов циклов по группам

Цикл "с предусловием" начинает своё выполнение с проверки логического выражения, именно поэтому такую разновидность циклов называют циклы с предусловием. Переход к выполнению действия (тела цикла) осуществляется только в том случае, если логическое выражение истинно (true), в противном случае происходит выход из цикла. Можно сказать, что логическое выражение цикла "пока" - это условие управляющее итерационным процессом и условие входа в цикл.

В виде блок-схемы цикл с предусловием выглядит следующим образом

Блок-схема цикла с предусловием в общем виде
Блок-схема цикла с предусловием в общем виде

В виде псевдокода цикл с предусловием выглядит вот так

пока условие нц
действие
кц

Такой псевдокод читается следующим образом: пока (while) условие истинно (true) выполняй действие, стоящее в теле цикла.

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

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

Цикл "с постусловием", в отличии от цикла "с предусловием" всегда начинается с выполнения действия или действий, стоящих в теле цикла и только после первого выполнения тела цикла осуществляется проверка логического выражения, управляющего итерационным процессом. Именно поэтому такую разновидность циклов называют циклы с постусловием. Таким образом, условие, стоящее после тела цикла, является условием выхода из цикла. Для предотвращения зацикливания необходимо в теле цикла предусмотреть действия, приводящие к истинности условия. В видео четвёртого урока говорили о том, что в разных алгоритмических языках цикл с постусловием реализуется по-разному. Где-то логика работы такова, что выход из цикла происходит в случае, когда условие окончания цикла ложно (false), где-то наоборот истинно (true).

В виде блок-схемы цикл с постусловием выглядит следующим образом

Блок-схема цикла с постусловием в общем виде
Блок-схема цикла с постусловием в общем виде

В виде псевдокода цикл с предусловием выглядит вот так

выполнять
действие
пока условие

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

Цикл "N раз" или, как его ещё называют, цикл с параметром (параметризованный цикл) позволяет задать итерационный процесс, в котором количество итераций (повторений) заранее известно. Выполнение такого цикла начинается с определения и инициализации явно заданного параметра цикла и только потом проверяется условие окончания цикла (обратите внимание, в данном случае, условие проверяется перед тем как будет выполнено тело цикла, в этом цикл N раз похож на цикл с предусловием).

В виде блок-схемы цикл "N раз" выглядит следующим образом

Блок-схема цикла "N раз" в общем виде
Блок-схема цикла "N раз" в общем виде

На приведённом фрагменте блок-схемы в блоке модификации указывается закон изменения переменной параметра, где:

Xo - начальное значение параметра;
h – шаг;
Xn - последнее значение параметра.

По работе с параметризованными циклами есть следующие рекомендации:

- параметр цикла, его начальное и конечное значения и шаг должны быть одного типа (например, целые или вещественные);

- в теле цикла не рекомендуется изменять начальное, текущее и конечное значения для параметра;

- если начальное значение параметра больше конечного, то шаг - число отрицательное;

- если параметр цикла не инициализирован (не определён) перед циклом, то принимается, что после выхода из цикла значение параметра неопределенно и поэтому его нельзя использоваться в дальнейших вычислениях;

- из цикла можно выйти, не закончив его, тогда переменная параметр сохраняет свое последнее значение, при условии, что она была инициализирована перед циклом.

В виде псевдокода цикл с параметром выглядит следующим образом

для I от X0 до Xn нц
действие
кц

Такой псевдокод читается следующим образом: для параметра цикла (I), изменяемого от начального значения (X0) до конечного значения (Xn) выполнять действие, стоящее в теле цикла.

Для такого цикла условие окончания цикла явно не задаётся, но всё таки оно есть и выглядит вот так: I <= Xn

Ниже приводятся примеры, в которых используется алгоритмическая конструкция "Цикл".

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

Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием цикла с предусловием
Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием цикла с предусловием

Псевдокод, сформулированный, на основе приведённой блок-схемы будет выглядеть следующим образом

ввод(N)
SUM = 0
I = 1
пока I <= N нц
SUM = SUM + I
I = I + 1
кц
вывод(SUM)

Блок-схема для второй реализации, использующей цикл с постусловием, выглядит так

Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием цикла с постусловием
Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием цикла с постусловием

Псевдокод, сформулированный, на основе блок-схемы второй реализации будет выглядеть следующим образом

ввод(N)
SUM = 0
I = 1
выполнять
SUM = SUM + I
I = I + 1
пока I <=N
вывод(SUM)

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

Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием параметризованного цикла
Блок-схема алгоритма вычисления суммы первых N чисел, реализованного с использованием параметризованного цикла

Ниже приведён псевдокод, сформулированный, на основе блок-схемы третьей реализации.

ввод(N)
SUM = 0
для I от 1 до N
SUM = SUM + I
вывод(SUM)

Рассмотрев, каждый из приведённых вариантов решения задачи м сравнив их между собой, можно заметить, что наиболее лаконичным получился третий вариант, поскольку он содержит меньшее количество блоков на схеме алгоритма и меньше инструкций псевдокода. Однако, нужно отметить, что вместе с этим третий вариант получился и менее понятным, за счёт отсутствия явно выделенных действий, связанных с инициализацией и модификацией параметра цикла.

Далее приведен ещё один пример, в решении которого используется циклическая конструкция. В рамках примера решается следующая задача:

Ученик в первый день выучил 5 английских слов. В каждый следующий день он выучивал на 2 слова больше, чем в предыдущий. Сколько английских слов выучит ученик в 10-ый день занятий?

Блок-схема алгоритма решения данной задачи выглядит следующим образом

Блок-схема алгоритма подсчёта количества слов выученных за N дней
Блок-схема алгоритма подсчёта количества слов выученных за N дней

Псевдокод алгоритма для данной задачи будет следующим

day = 1
words = 5
пока day <= 10 нц
words = words + 2
day = day + 1
кц
вывод(words)

Приведённый вариант решения вычисляет количество слов, выученных в 10-й день занятий за один день. При этом приведённая выше постановка задачи является не однозначной и её можно понять несколько иначе, а точнее вычислять количество выученных слов в 10-й день занятий за все десять дней.

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

day = 1
words = 5
words_over_all_days = 5
пока day < 10 нц
words = words + 2
day = day + 1
words_over_all_days = words_over_all_days + words
кц
вывод(words)
вывод(words_over_all_days)

В этом псевдокоде появился дополнительный параметр words_over_all_days, в котором накапливается сумма количества слов, выученных за десять дней.

Далее рассмотрен ещё один пример, в котором вычисляется сумма чисел принадлежащих интервалу [n, m] и кратных некоторому числу a.

Блок-схема алгоритма для данной задачи будет следующей

Блок-схема алгоритма вычисления суммы кратных a чисел на интервале [n, m]
Блок-схема алгоритма вычисления суммы кратных a чисел на интервале [n, m]

Псевдокод для данного алгоритма будет выглядеть следующим образом

ввод(n, m, a)
sum = 0
i = n
выполнять
если i кратно a то
sum = sum + i
i = i + 1
пока i < m
вывод(sum)

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

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

Если Вы хотите выполнить индивидуальное задание по этой теме и получить по результатам его выполнения обратную связь - пишите на email olzo.curses@gmail.com