Цикл — многократное повторение последовательности действий по некоторому условию. Известны три типа циклических алгоритмических структур: цикл с предусловием, цикл с постусловием и цикл с параметром. В Паскале существуют операторы, реализующие все три типа циклов.
Цикл с предусловием (цикл-пока) — наиболее универсальная циклическая структура. Реализуется оператором While. Формат оператора:
while <логическое выражение> do <тело цикла>
Пока значение логического выражения — true, выполняется тело цикла. Тело цикла может быть простым или составным оператором.
Цикл с постусловием (цикл-до) имеет формат:
repeat <тело цикла>
until <логическое выражение>
Повторяется выполнение тела цикла. Цикл заканчивается, когда логическое выражение принимает значение true. Тело цикла с постусловием выполняется хотя бы один раз. Использования begin и end для ограничения составного тела цикла не требуется.
Цикл с параметром имеет два варианта записи:
1) f or I: = In to Ik do <тело цикла>;
2) for I: = In downto I k do <тело цикла>.
Здесь I— параметр цикла - простая переменная порядкового типа;
In — выражение того же типа, определяющее начальное значение параметра;
Ik — выражение того же типа, определяющее конечное значение параметра;
<тело цикла> может быть простым или составным оператором.
Цикл повторяется, пока значение параметра лежит в интервале между In и Ik. Причем эти выражения вычисляются, только один раз в начале выполнения цикла.
В первом варианте при каждом повторении цикла значение параметра изменяется на следующее значение в данном типе (для целого типа - увеличивается на 1).
Во втором варианте при каждом повторении цикла значение параметра изменяется на предыдущее значение в данном типе (для целого типа — уменьшается на 1).
Пример 1. Вычислить сумму натурального ряда чисел от 1 до N.
Решение. Программа будет состоять из трех частей, в которых повторяется решение этой задачи с использованием операторов цикла while, repeat и for .
Program Natur;
Uses Crt;
Var a, Summa, n: integer;
Begin
Clrscr;
write('N=');
readln(N);
{Цикл с предусловием}
a:=l;
Summa:=0;
while a<=N do
begin
Summa:= Summa + a;
a:= a + 1
end;
Writeln (' Результат первого суммирования:', Summa);
{Цикл с постусловием}
а:=1;
Summa:=0;
repeat
Summa:=Summa+ а;
а:=а+1
until a>N;
Writeln (' Результат второго суммирования:', Summa);
{Цикл с параметром}
Summa:=0;
for а:= 1 to N do
Summa: =Summa + a;
Writeln (' Результат третьего суммирования:', Summa);
end.
Очевидно, что все три результата будут одинаковыми.
Пример 2. Функцию можно вычислить как предельное значение последовательности, определяемой рекуррентной формулой:
Уk = (Уk-1 + x/yk-1)/2 для k= 1,2...
Начальное значение у0 задается произвольно. За приближенное с точностью ɛ значение корня берется первое уk, для которого выполняется условие: |yk - yk-1|< ɛ
Решение. Для вычисления значений числовой последовательности достаточно двух простых переменных, в которых на каждом шаге будут храниться последнее и предпоследнее значения: уk и уk-1. Обозначим эти переменные Anew и Aold. При программировании этой задачи нельзя использовать цикл с параметром, т.к. неизвестно заранее число повторений цикла. Воспользуемся циклом с предусловием.
Program Posled;
Uses Crt;
Var X, eps, Aold, Anew: Real;
k: integer;
begin
Clrscr;
Write (' Введите число Epsilon ');
ReadLn (eps);
Write('Введите значение X ');
ReadLn(X);
Aold:=X;
Anew:=(Aold +X / Aold)/2;
while abs(Anew - Aold)>= eps do
begin
Aold: = Anew;
Anew: = (Aold + X/Aold)/2;
end;
WriteLn('Корень квадратный(', X,’)=', Anew);
end.
Пример 3. На интервале [2; n]найти натуральное число c максимальной суммой делителей.
Решение. Идея алгоритма состоит в том, что все делители числа X, меньшие X, лежат в интервале от 1 до X div 2 + 1. Наибольшим делителем является само число X. Следовательно, для каждого из чисел [ 2...n ] нужно отобрать и просуммировать все делители из указанного множества. По ходу вычислений производить отбор наибольшего значения.
Алгоритм будет содержать два вложенных цикла. Исполнение вложенных циклов происходит так: для каждого значения параметра внешнего цикла происходит полная «прокрутка» внутреннего цикла.
Program Sum_Del;
Var N, I, Sum_Max, Sum, K, Ch: Integer;
begin
Write (' Введите число N: ');
ReadLn(N);
Sum_Max:= l; Ch:= l; { Начальные значения величин}
for I: =2 to N do {Внешний цикл: перебор чисел}
begin
Sum:=0;
{Внутренний цикл: поиск делителей}
for К: =1 to I div 2 + 1 do
if I mod К = 0
then Sum: = Sum + К; {Суммирование делителей}
Sum:= Sum + I; {Включение в сумму максимального делителя}
{Выбор максимальной суммы делителей} if Sum >Sum_Max then
begin
Sum_Max: = Sum;
Ch: = I
end;
end;
WriteLn('Максимальную сумму делителей ', Sum_Max, ' имеет число ',Ch);
end.