Данная статья является дополнением ранее опубликованного видео четвёртого урока, поэтому перед прочтением рекомендуется его посмотреть.
Цикл - управляющая структура, организующая многократное выполнение указанного действия или нескольких действий.
С помощью циклов организуется итерационный процесс, то есть, то самое многократное выполнение заданного действия или действий, а одно отдельно взятое выполнение цикла называется тактом выполнения цикла или итерацией.
На сегодняшний день циклы можно разделить на 2-е категории - циклы с неизвестным числом повторов и циклы с заранее заданным количеством повторений. К первой категории относятся циклы с пред- и пост- условием, а ко второй циклы "N раз" и "Для каждого". Такое разделение циклов по категориям можно показать схематично, например, как на рисунке ниже.
Цикл "с предусловием" начинает своё выполнение с проверки логического выражения, именно поэтому такую разновидность циклов называют циклы с предусловием. Переход к выполнению действия (тела цикла) осуществляется только в том случае, если логическое выражение истинно (true), в противном случае происходит выход из цикла. Можно сказать, что логическое выражение цикла "пока" - это условие управляющее итерационным процессом и условие входа в цикл.
В виде блок-схемы цикл с предусловием выглядит следующим образом
В виде псевдокода цикл с предусловием выглядит вот так
пока условие нц
действие
кц
Такой псевдокод читается следующим образом: пока (while) условие истинно (true) выполняй действие, стоящее в теле цикла.
В частном случае, когда условие окончания цикла исходно ложно (false), может оказаться, что тело цикла не выполнится ни разу. Условие цикла необходимо подобрать так, чтобы действия, выполняемые в цикле, привели к нарушению его истинности, иначе произойдет зацикливание.
Зацикливание - бесконечное повторение выполняемых действий, в результате которого программа "зависает" и в результате завершается принудительно операционной системой или пользователем. При этом данные, которые принадлежат программе на момент её принудительного завершения, теряются (поскольку хранятся в оперативной памяти, а она доступна программе только в момент её исполнения), если не предусмотрен механизм, позволяющий сохранять данные программы на случай её аварийного завершения.
Цикл "с постусловием", в отличии от цикла "с предусловием" всегда начинается с выполнения действия или действий, стоящих в теле цикла и только после первого выполнения тела цикла осуществляется проверка логического выражения, управляющего итерационным процессом. Именно поэтому такую разновидность циклов называют циклы с постусловием. Таким образом, условие, стоящее после тела цикла, является условием выхода из цикла. Для предотвращения зацикливания необходимо в теле цикла предусмотреть действия, приводящие к истинности условия. В видео четвёртого урока говорили о том, что в разных алгоритмических языках цикл с постусловием реализуется по-разному. Где-то логика работы такова, что выход из цикла происходит в случае, когда условие окончания цикла ложно (false), где-то наоборот истинно (true).
В виде блок-схемы цикл с постусловием выглядит следующим образом
В виде псевдокода цикл с предусловием выглядит вот так
выполнять
действие
пока условие
Такой псевдокод читается следующим образом: выполнять действие, пока условие ложно или наоборот истинно (в зависимости от языка программирования).
Цикл "N раз" или, как его ещё называют, цикл с параметром (параметризованный цикл) позволяет задать итерационный процесс, в котором количество итераций (повторений) заранее известно. Выполнение такого цикла начинается с определения и инициализации явно заданного параметра цикла и только потом проверяется условие окончания цикла (обратите внимание, в данном случае, условие проверяется перед тем как будет выполнено тело цикла, в этом цикл N раз похож на цикл с предусловием).
В виде блок-схемы цикл "N раз" выглядит следующим образом
На приведённом фрагменте блок-схемы в блоке модификации указывается закон изменения переменной параметра, где:
Xo - начальное значение параметра;
h – шаг;
Xn - последнее значение параметра.
По работе с параметризованными циклами есть следующие рекомендации:
- параметр цикла, его начальное и конечное значения и шаг должны быть одного типа (например, целые или вещественные);
- в теле цикла не рекомендуется изменять начальное, текущее и конечное значения для параметра;
- если начальное значение параметра больше конечного, то шаг - число отрицательное;
- если параметр цикла не инициализирован (не определён) перед циклом, то принимается, что после выхода из цикла значение параметра неопределенно и поэтому его нельзя использоваться в дальнейших вычислениях;
- из цикла можно выйти, не закончив его, тогда переменная параметр сохраняет свое последнее значение, при условии, что она была инициализирована перед циклом.
В виде псевдокода цикл с параметром выглядит следующим образом
для I от X0 до Xn нц
действие
кц
Такой псевдокод читается следующим образом: для параметра цикла (I), изменяемого от начального значения (X0) до конечного значения (Xn) выполнять действие, стоящее в теле цикла.
Для такого цикла условие окончания цикла явно не задаётся, но всё таки оно есть и выглядит вот так: I <= Xn
Ниже приводятся примеры, в которых используется алгоритмическая конструкция "Цикл".
Далее рассматривается задача вычисления суммы первых N чисел, при реализации которой использовались все три типа циклов.
Первая реализация, использующая цикл с предусловием, представлена ниже в виде блок-схемы алгоритма и псевдокода.
Псевдокод, сформулированный, на основе приведённой блок-схемы будет выглядеть следующим образом
ввод(N)
SUM = 0
I = 1
пока I <= N нц
SUM = SUM + I
I = I + 1
кц
вывод(SUM)
Блок-схема для второй реализации, использующей цикл с постусловием, выглядит так
Псевдокод, сформулированный, на основе блок-схемы второй реализации будет выглядеть следующим образом
ввод(N)
SUM = 0
I = 1
выполнять
SUM = SUM + I
I = I + 1
пока I <=N
вывод(SUM)
Блок-схема для третьей реализации, использующей параметризованный цикл, выглядит так
Ниже приведён псевдокод, сформулированный, на основе блок-схемы третьей реализации.
ввод(N)
SUM = 0
для I от 1 до N
SUM = SUM + I
вывод(SUM)
Рассмотрев, каждый из приведённых вариантов решения задачи м сравнив их между собой, можно заметить, что наиболее лаконичным получился третий вариант, поскольку он содержит меньшее количество блоков на схеме алгоритма и меньше инструкций псевдокода. Однако, нужно отметить, что вместе с этим третий вариант получился и менее понятным, за счёт отсутствия явно выделенных действий, связанных с инициализацией и модификацией параметра цикла.
Далее приведен ещё один пример, в решении которого используется циклическая конструкция. В рамках примера решается следующая задача:
Ученик в первый день выучил 5 английских слов. В каждый следующий день он выучивал на 2 слова больше, чем в предыдущий. Сколько английских слов выучит ученик в 10-ый день занятий?
Блок-схема алгоритма решения данной задачи выглядит следующим образом
Псевдокод алгоритма для данной задачи будет следующим
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.
Блок-схема алгоритма для данной задачи будет следующей
Псевдокод для данного алгоритма будет выглядеть следующим образом
ввод(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