ТЕМА. Программирование циклических алгоритмов

Цикл — многократное повторение последовательности действий по некоторому условию. Известны три типа циклических алгоритмических структур: цикл с предусловием, цикл с постусловием и цикл с параметром. В Паскале существуют операторы, реализующие все три типа циклов.

Цикл с предусловием (цикл-пока) — наиболее универсальная циклическая структура. Реализуется оператором 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.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: