Программирование циклических алгоритмов
План:
1. Оператор цикла с предусловием While..do
2. Оператор цикла с постусловием Repeat..Until
3. Оператор цикла с параметром For..do
Оператор цикла с предусловием While..do
Многократно повторяемые действия могут быть заданы с помощью оператора цикла. Рассмотрим синтаксическую диаграмму одного из таких операторов - оператора цикла с предусловием:
While <выражение булевского типа> do
<оператор>;
Выполняется данный оператор цикла так: сначала вычисляется значение булевского выражения (т.е. условие, стоящее после слова while, проверяется на истинность). Если оно имеет значение true, то выполняется оператор, стоящий после слова do, затем условие проверяется вновь и т.д. Как только на очередном шаге условие не выполняется (значение булевского выражения становится равным false), то выполнение оператора цикла прекращается. Если выполняемый оператор не изменяет значения переменных, входящих в условие, то условие будет истинным всегда и цикл будет выполняться вечно, при этом говорят, что программа зацикливается. Если же при первой проверке условия оно сразу оказывается ложным, то оператор цикла не выполняется вообще.
Если в цикле нам необходимо выполнять больше, чем один оператор, то, как и в случае с условным оператором, применяется составной оператор, то есть несколько операторов заключаются в операторные скобки begin... end.
Пример оператора цикла с предусловием:
while х <= 0 do
х:= х + 1
Если до оператора цикла значение х положительно, то цикл не будет выполняться вообще.
Если х было равно 0 то цикл будет выполняться ровно один раз, а если х было меньше 0, то цикл выполнится несколько раз и закончится, когда х станет равным 1.
Важно заметить, что операторы стоящие внутри цикла repeat (иначе – в теле цикла) выполняются хотя бы один раз (только после этого проверяется условие выхода).
1. Найти сумму натуральных чисел от 1 до 100:
var i,sum: integer;
Begin
sum:=0; i:=0;
while i<100 do begin
i:=i+1;
sum:=sum+i;
end;
writeln('Сумма равна: ',sum);
readln;
end.
2. По заданному целому неотрицательному значению п, не применяя формулы, вычислить:
s = 1 + 2 + 3 + 4 +... + п:
readln(n);
s:= 0;
i:= 0;
while x < n do
Begin
i: = i + 1;
s: = s+I;
End.
В таких задачах очень важно правильно задать до цикла значения изменяемых в цикле переменных и проконтролировать, нужное ли количество раз выполнится цикл. Так, если в рассмотренной задаче заменить условие х < n на х <= n, то на последнем шаге цикла к s прибавится значение n + 1, что неверно. Заметим, что приведенная в качестве решения задачи программа автоматически работает верно, и для случая n = 0. Цикл при этом просто не будет выполняться. При других же вариантах решения данный случай, скорее всего, придется рассматривать отдельно.
3. С клавиатуры вводятся натуральные числа. Последовательность этих чисел заканчивается 0 (в данном случае 0 - признак окончания ввода). Найти их сумму:
read(а);
s:= 0;
while а <> 0 do
begin
s:= s + а;
read(a)
end.
Оператор цикла с постусловием Repeat..Until
В языке Pascal существует еще один оператор цикла с условием, которое проверяется уже после выполнения оператора. Приведем его синтаксическую диаграмму:
Repeat
<оператор>;
until <условие>;
В данном операторе слова repeat и until служат операторными скобками begin end использовать не требуется. На первом шаге цикла операторы, заключенные между repeat и until, выполняются в любом случае, дальше же цикл будет повторяться, пока значение булевского выражения ложно. То есть цикл закончится, когда оно станет истинным.
1. Найти сумму натуральных чисел от 1 до 100.
var i,sum: integer;
Begin
sum:=0; i:=0;
Repeat
i:=i+1;
sum:=sum+i;
until i=100;
writeln('Сумма равна: ',sum);
readln;
end.
2. По заданному целому неотрицательному значению п вычислите п! = 1*2*3*.,.*п. Учтите, что по определению 0! = 1.
3. По заданному целому неотрицательному значению п и вещественному значению х вычислите хn. Для решения задачи используйте оператор цикла (операция возведения в степень в языке Pascal отсутствует).
Оператор цикла с параметром For..do (цикл с параметром)
Синтаксическую диаграмму для данного оператора необходимо дополнить следующими правилами.
1. Идентификатор (счетчик) и оба выражения должны быть одного и того же порядкового типа. (Из изученных ранее порядковыми являются все целые типы, а также тип boolean, далее будут рассмотрены символьный и перечислимый порядковые типы.)
2. Оба выражения вычисляются перед выполнением оператора цикла и впоследствии не перевычисляются!!!
3. Идентификатор является параметром цикла и по стандарту не должен изменяться внутри оператора цикла (данное требование стандарта поддерживается в языке Delphi), однако это не противоречит синтаксису Borland Pascal, но может приводить к непредсказуемым последствиям, например, зацикливанию.
For <cсчетчик>:= <выражение> to <выражение> do
<оператор>;
For <cсчетчик>:= <выражение> downto <выражение> do
<оператор>;
4. После окончания цикла значение параметра цикла не определено, то есть нельзя считать, что значение параметра равно значению второго выражения.
Оператор цикла выполняется так: сначала вычисляются значения выражений, обозначим их А и В. Они являются начальным и конечным значениями параметра цикла. Если для цикла с to А < В, то параметр цикла последовательно будет принимать значения, равные А, А + 1, А + 2,..., В. То есть цикл будет выполняться ровно В - А + 1 раз.
Если А > В, то цикл не будет выполняться совсем.
Если для цикла с downto А > В, то параметр цикла последовательно будет принимать значения, равные А, А - 1, А - 2,..., В. То есть цикл будет выполняться ровно А - В + 1 раз.
Если А < В, то цикл не будет выполняться совсем.
Оператор цикла с параметром следует применять, если заранее известно, сколько раз нужно выполнить некоторый оператор. Параметр цикла может являться просто счетчиком, контролирующим количество повторений оператора, а может и использоваться в самом операторе (с учетом того факта, что на каждом шаге цикла параметр цикла на 1 отличается от предыдущего своего значения).
Использовать цикл for при заранее известном количестве повторений. Не изменять параметр в теле цикла. При использовании кратных (вложенных) циклов применять разные переменные в качестве параметров. Определять до цикла значения всех используемых в нем переменных. Не ставить точку с запятой после do.
1. По заданному целому неотрицательному значению п и вещественному х вычислить хn:
p: =1
for i: =1 to n do
p: = p*x;
2. По заданному целому неотрицательному значению n вычислить n!
f:=1
for i:= 2 to n do
f:= f*I;
Если в качестве оператора цикла необходимо использовать несколько операторов, то применяется составной оператор.
3. По заданному натуральному значению n вычислить 1 -1/2 + 1/3-1/4+…1/ n:
k:=1;
s:=1;
for i: = 2 to n do
Begin
(в переменной k имеем знак очередного слагаемого)
k: =-k;
s: = s +k/I;
end;
4. По заданному натуральному значению п и вещественному значению х вычислить х + х2 + Xs +... + хп
s:= 0;
z:= 1;
for i: = 1 to n do
Begin
{в переменной z - очередное слагаемое}
z:= z * x;
s:= s + z
end;
5. По заданному натуральному значению n вычислить 1 - 1/3 + 1/5 - 1/7 +... 1/(2n + 1).
6. В последовательности а1, а2,..., аn найти номер самого большого числа.