В простых примерах, рассмотренных выше, вообще говоря, не требовалось привлечения ЭВМ и программирования. Все они достаточно быстро могли быть решены вручную или с помощью калькулятора. Сила ЭВМ заключается в возможности простыми средствами осуществлять многократное повторение заданных действий – циклов.
Итерационные циклы.В случае если количество циклов, необходимых для решения задачи, заранее неизвестно, такие циклы называются итерационными. Рассмотрим ряд примеров.
Задача 3. Пусть для некоторого множества чисел Х нужно вычислить и отпечатать функцию 2/Х. Ввод и вычисления следует прекратить после обнаружения первого Х, равного нулю (деление на ноль невозможно).
Программа
Проверка
к задаче 4
1 цикл
2 цикл
3 цикл
4 цикл
x=3
2 IF x>9 GOTO 4
y=(x–6)^2
? x,y
x=x+2
GOTO 2
4 END
x=3
x=3<9
y=9
3,9
x=3+2=5
5<9
y=1
5,1
x=7
7<9
y=1
7,1
x=9
9=9
y=9
9,9
x=11
11>9
конец
Очевидна следующая (рис. 8а) блок-схема. Блоков ввода, вычисления, печати и анализа столько, сколько чисел в последовательности до первого нуля. Чисел может быть очень много и подобный подход, конечно, неприемлем, не говоря уже о том, что и количество их заранее неизвестно. Такие программы строятся по-иному. Обрабатывающая часть программы записывается только раз, но охватывается петлей возврата (рис. 8б). Тогда одни и те же операторы будут выполняться многократно до тех пор, пока Х¹0.
Задача 4. Пусть для аргумента Х, находящегося в диапазоне от 3 до 9, требуется вычислить и напечатать значение функции Y=(X–6)2, где Х изменяется с шагом 2 (рис. 9а). Блок-схема алгоритма изображена на рис. 9б.
Справа от текста программы сделаны выкладки по проверке решения. В каждой строке вручную вычисляется и указывается значение соответствующей переменной. Выкладки по проверке выполняются сверху-вниз, слева-направо по ходу исполнения программы. Стрелки показывают связи между циклами. Видим, что заданная последовательность изменения Х (3, 5, 7, ...) наблюдается и последнее значение Y вычисляется для Х=9. При следующем приращении Х оно становится равным 11 и пятый цикл не выполняется, поскольку при Х>9 программа завершается.
Здесь следует отметить, что нет никакого технически простого способа предварительной проверки правильности написанных программ. Для этой цели программисту приходится вручную по тексту программы рассчитывать значения всех переменных и сличать их с желаемыми (известными из условия). Конечно, проверка выполняется не для всей задачи, а только для небольшого числа (например, трех) начальных циклов и при этом тщательно анализируется значение условия выхода из цикла (оператор IF).
@ Задачи для самостоятельного решения.Напишите программы:
1). Решите задачу 4 для Х, изменяющегося в обратном направлении (9¸3).
2). Вычислить и напечатать значения функции Y=10–2X для последовательных значений Х: 0, 0.5, 1, 1.5, 2, 2.5, ... и т.д. до тех пор, пока Y не станет отрицательным.
3). Решите задачу 3, где вычисления Y прекращаются после того, как будут встречены три числа Х<0. Указание. Здесь понадобится переменная – счетчик таких значений. Назовем ее К. Следует прекратить вычисления при К=3.
Арифметические циклы.Если число повторений известно заранее – такие циклы называются арифметическими.
Задача 5. Пусть в условиях предыдущей задачи 4 не известно предельное значение аргумента, но зато задано количество точек аргумента – 4. Поскольку в данном случае не задано последнее значение Х, признак окончания циклов придется формировать самим. Для этого вводится переменная, которая фиксирует число уже выполненных циклов, т.е. счетчик циклов (назовем ее I). В исходном состоянии (рис. 10) берем его равным 1.
Программа
Проверка
к задаче 5
1 цикл
2 цикл
3 цикл
4 цикл
x=3: i=1
8 IF i>4 GOTO 2
y=(x–6)^2
? x y
x=x+2
i=i+1
GO TO 8
2 END
x=3, i=1
i=1<4
y=9
3, 9
x=5
i=2
2<4
y=1
5, 1
x=7
3<4
y=1
7, 1
x=9
4=4
y=9
9, 9
x=11
5>4
конец
После выполнения очередного цикла счетчик получает приращение, увеличиваясь на единицу (I=I+1). В начале каждого цикла в операторе IF делается проверка на достижение счетчиком последнего разрешенного значения (у нас 4). Если I<=4 программа продолжает вычисление функции, если нет (I>4) – счет прекращается. Ниже приведена программа и выкладки по ее проверке. Как видим, результат проверки совпал с результатом, полученным ранее.
Программа
Проверка для N=3 X=2,4,3
к задаче 6
1 цикл
2 цикл
3 цикл
INPUT “N=”,n
i=1: s=0
3 IF i>n GOTO 8
INPUT “X=”,x
s=s+x
i=i+1
GOTO 3
8 PRINT s
n=3
i=1, s=0
1<3
x=2
s=2
i=2
2<3
3=3
4>3
s=9
Исходное значение счетчика циклов и его приращения могут выглядеть по-разному. Главное, чтобы было выполнено заданное число циклов. В нашем примере был использован счетчик на возрастание I=1,2,3, ... до N (N – число шагов). Можно начинать счетчик с нуля: I=0,1,2, ... до N-1. Возможен счетчик на убывание: I=N–1, ... 3,2,1 до 0 и т.д. Обычно, если нет оснований для другого, используется счетчик на возрастание с шагом единица от 1 до N.
@ Задачи для самостоятельного решения.
1). Решите задачу 5 для Х, изменяющегося в обратном направлении (Х начинается с 9).
2). Напечатайте цепочку из 10-ти чисел Х, изменяющихся по закону: 2, 6, 18, 54… .
Задачи на накопление.В практике очень распространены задачи на накопление, т.е. на нахождение сумм и произведений последовательности переменных. Такие задачи могут встречаться как в формулировке итерационных, так и арифметических циклов.
Задача 6. Пусть требуется найти сумму N произвольных чисел Х. Блок-схема алгоритма приведена на рис. 11, а программа ниже. Здесь сумма накапливается в переменной S с помощью оператора S=S+X. Начальное значение суммы берется равным нулю (S=0).
Числовые ряды.Типичной циклической задачей на накопление является вычисление числовых рядов.
Задача 7. Пусть требуется найти сумму S для N членов геометрической прогрессии вида
Программа
Проверка
для N=3
к задаче 7
1 цикл
2 цикл
3 цикл
4 цикл
INPUT n
n=3
a=3: i=1: s=0
a=3, i=1,s=0
3 IF i>n GOTO 9
i=1<3
2<3
3=3
4>3
s=s+a
s=0+3=3
3+6=9
9+12=21
a=2*a
a=2*3=6
i=i+1
i=1+1=2
GOTO 3
9 ? s
s=21
A1 A2 A3 A4 N
S = 3 + 6 + 12 + 24 + ... + = åАi
S1 S2 S3 S4
Здесь каждый следующий член прогрессии Аi равен предыдущему Ai+1, умноженному на два. Если учесть введенные обозначения, можно записать так называемые рекуррентные формулы
Si= Si–1+ Ai, где Sо = 0
Ai= 2Ai–1 A1= 3
Или, как принято в программировании
S=0, S=S+A
A=3, A=2A
Аналогично строятся программы для циклического произведения, однако исходное значение искомого произведения берется равным единице. Если действовать по аналогии с суммой и сделать его равным нулю, результат всегда будет также нулем, поскольку умножение на нуль дает только нуль.
@ Задачи для самостоятельного решения.
1). Найдите произведение N элементов ряда: Y=3×6×12×24×... .
2). Найдите сумму N элементов ряда: Y=–3+6–12+24–… .
3). Найдите сумму N элементов ряда: Y=–2+4–6+12–… .
Указание. В задаче 2) каждый новый элемент может быть получен умножением предыдущего на минус два (–2) поскольку здесь наблюдается геометрическая прогрессия. Для формирования изменяющегося знака в задаче 3) с арифметической прогрессией такой подход не сработает. Придется формировать знак отдельно. Здесь удобно ввести специальную переменную Z, равную то +1, то –1 на которую будет умножаться очередной элемент ряда. Первоначальное значение Z определяется знаком при первом элементе ряда. У нас будет Z=–1. Далее эта переменная должна меняться по закону Z=–Z. Таким образом, Z будет то –1 то +1, что при перемножении на элемент ряда будет каждый раз менять его знак на противоположный.
Оператор арифметического цикла.Принципы построения программ с арифметическими циклами можно проиллюстрировать обобщенной блок-схемой на рисунке 12.
Группа операторов внутри цикла называется телом цикла. Только обрабатывающая часть цикла полезна. Остальные операторы являются обслуживающими, необходимыми для организации цикла. Этот механизм в алгоритмических языках обычно реализует специальный оператор цикла, который мы сейчас рассмотрим. Его применение упрощает программирование и снижает возможность совершения ошибок.