Организация циклов

В простых примерах, рассмотренных выше, вообще говоря, не требо­валось привлечения ЭВМ и программирования. Все они достаточно быстро могли быть решены вручную или с помощью калькулятора. Сила ЭВМ заключается в возможности простыми средствами осуществлять многократное повторение заданных действий – циклов.

Итерационные циклы.В случае если количество циклов, необходимых для решения задачи, заранее неизвестно, такие циклы называются итерационными. Рассмотрим ряд примеров.

Задача 4.1. Пусть для некоторого множества чисел X нужно вычислить функцию 2/X. Ввод и вычисления следует прекратить после обнаружения первого X, равного нулю (деление на ноль невозможно).

Очевидна следующая (рис. 4.1а) блок-схема. Блоков ввода, вычисления и анализа столько, сколько чисел в последовательности до первого нуля. На рисунке показаны только два первых блока. Чисел может быть очень много и подобный подход, конечно, неприемлем, не говоря уже о том, что и количество их заранее неизвестно. Такие программы строятся по-иному. Обрабатывающая часть программы записывается только раз, но охватывается петлей возврата (рис. 4.1б). Тогда одни и те же операторы будут выполняться многократно до тех пор, пока X¹0.

Задача 4.2. Пусть для аргумента X, находящегося в диапазоне от 3 до 9, требуется вычислить и напечатать значение функции Y=(X–6)2, где X изменяется с шагом 2 (рис. 4.2а). Блок-схема алгоритма показана на рис. 4.2б.

Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется и указывается значение соответствующей переменной. Выкладки по проверке выполняются сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами. Видим, что заданная последовательность изменения X (3, 5, 7, ...) наблюдается и последнее значение Y вычисляется для X=9. При следующем приращении X оно становится равным 11 и пятый цикл не выполняется, поскольку при X>9 программа завершается.

 
 

 

 


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

@ Задачи для самостоятельного решения.Напишите программы:

1). Решите задачу 4.2 для X, изменяющегося в обратном направлении (9¸3).

2). Вычислить и напечатать значения функции Y=10–2X для последовательных значений X: 0, 0.5, 1, 1.5, 2, 2.5, ... и т.д. до тех пор, пока Y не станет отрицательным.

3). Решите задачу 4.1, где вычисления Y прекращаются после того, как будут встречены три числа X<0. Указание. Здесь понадобится переменная – счетчик таких значений. Назовем ее К. В каждом цикле следует увеличивать ее значение на единицу и прекратить вычисления при К>=3.

Арифметические циклы.Если число повторений известно заранее – такие циклы называются арифметическими.

Задача 4.3. Пусть в условиях предыдущей задачи 4.2 не известно предельное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку не известно последнее X, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов, т.е. счетчик циклов (назовем ее I). В исходном состоянии (рис. 4.3) берем его равным 1.

После выполнения очередного цикла счетчик получает приращение, увеличиваясь на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекращается. Ниже приведена программа и выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее.

Исходное значение счетчика циклов и его приращения могут выглядеть по-разному. Главное, чтобы было выполнено заданное число циклов. В нашем примере был использован счетчик на возрастание I=1,2,3, ... до N (N – число шагов). Можно начинать счетчик с нуля: I=0,1,2, ... до N-1. Возможен счетчик на убывание: I=N–1, ... 3,2,1 до 0 и т.д. Обычно, если нет оснований для другого, используется счетчик на возрастание с шагом единица от 1 до N.

@ Задачи для самостоятельного решения.

1). Решите задачу 5 для X, изменяющегося в обратном направлении (X начинается с 9).

2). Напечатайте цепочку из 10-ти чисел X, изменяющихся по закону 2, 6, 18, … .

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

Задача 4.4. Пусть требуется найти сумму N произвольных чисел X. Блок-схема алгоритма на рис. 4.4. В программе сумма накапливается в переменной S оператором S=S+X. Начальное значение суммы берется равным нулю (S=0).

Числовые ряды.Типичной циклической задачей на накопление является вычисление числовых рядов.

Задача 4.5. Пусть требуется найти сумму S для N членов бесконечной геометрической прогрессии вида

A1 A2 A3 A4 N

S = 3 + 6 + 12 + 24 + ... + = åAi

 
 


S1 S2 S3 S4

Здесь каждый следующий член прогрессии Aiравен предыдущему Ai+1, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы

Si= Si–1+ Ai, где Sо = 0 Или, как принято в программировании S=0, S=S+A

Ai= 2Ai–1 A1= 3 A=3, A=2A

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

 
 


@ Задачи для самостоятельного решения.

1). Найдите произведение N элементов ряда: Y=3×6×12×24×... .

2). Найдите сумму N элементов ряда: Y=–3+6–12+24–… .

Указание. Поскольку члены ряда образуют геометрическую прогрессию, для вычисления очередного его члена нужно умножить предыдущий на –2.

3). Найдите сумму N элементов ряда: Y=–2+4–6+12–… .

Указание. Здесь прогрессия арифметическая и подход, примененный в предыдущем случае (умножение на отрицательное число), не применим. Для фор­мирования изменяющегося знака в задаче 3 можно ввести специальную переменную Z, равную то +1, то –1 на которую будет умножаться очередной элемент ряда. Первоначальное значение Z определяется знаком при первом элементе ряда. У нас будет Z=–1. Далее эта переменная должна меняться по закону Z=–Z. Таким образом, Z будет то –1 то +1, что при перемножении на элемент ряда будет каждый раз менять его знак на противоположный.