Операторы цикла
Операторы цикла Для многократного повторения одних и тех же действий в ТР предусмотрены три оператора цикла:
1) счетный оператор цикла (оператор цикла с параметром) - FOR 2) оператор цикла с предусловием - WHILE 3) оператор цикла с постусловием – REPEAT Если число повторений цикла (или итераций) заранее неизвестно, однако известно условие завершения цикла, в таких случаях примеряются операторы WHILE и REPEAT. Если число повторений известно, то применяется оператор FOR.
Для любого оператора цикла вход в цикл возможен только через его начало, выход осуществляется как вследствие естественного окончания цикла, так и путем выполнения оператора перехода GOTO или процедур выхода, содержащихся внутри цикла. Счетный оператор цикла FOR реализует циклический процесс с известным числом повторений, и имеет две формы записи: Первая форма позволяет наращивать параметр цикла на единицу:
FOR <параметр цикла>:= <min.значение> ТО <mаx.значение> DO <оператор>; <параметр цикла> - это переменная целого либо любого порядкового типа, <min> и <max> значения - это выражения, определяющие соответственно начальное и конечное значения параметра цикла. Их типы должны быть совместимыми для присваивания с параметром цикла.
Вторая форма позволяет уменьшать на единицу значение параметра цикла:
FOR<параметр цикла>:=<max.значение> DОWNTO<min.значение> DO <оператор>; Если начальное значение превышает (или не превышает во второй форме) или равно конечному значению с самого начала, <оператор> (стоящий после DO) не выполнится ни разу. Вот примеры оператора цикла с параметром: ----------------------------------------------------------- Program L_1; var p, x, i: integer; begin writeln('введите x'); read(x); p:=1; for i:=1 to 5 do p:=p*sqr(x); writeln('p=',p); end. ------------------------------------------------------------- F9 – ctrl+F9 – alt+F5 – получим результат
введите x p=59049
введите x p=9765625
В этом примере значение переменной x возводится в квадрат, затем полученная величина присваивается переменной p и так пять раз. ---------------------------------------
Program L; var i: char; begin for i:='z' downto 'a' do write(i,’ ‘); end. --------- ответ: z y x w v u t s r q p o n m l k j i h g f e d c b a
В этом примере оператор цикла с параметром использован для вывода букв латинского алфавита в обратном порядке (с z до a). Дело в том, что тип Char является порядковым, причём буквы начала алфавита (как значения типа Char), считаются меньше букв, взятых в конце алфавита. Не будет, например, ошибочным неравенство A<B; d<f -------------------------------------------------------------
Program L; var i:integer; begin writeln; for i:=170 downto 100 do write(chr(i),’ ‘); end. --------- ответ: к й и з ж е д г в б а Я Ю Э Ь Ы Ъ Щ Ш Ч Ц Х Ф У Т С Р П О Н М Л К Й И З Ж Е Д Г В Б А ⌂ ~ } | { z y x w v u t s r q p o n m l k j i h g f e d -------------------------------------------------------------------------------------------------
Program L; var i:char; begin writeln; for i:='z' downto 'a' do write(ord(i),' '); end. ---------- Ответ: 122 121 120 119 118 117 116 115 114 113 112 111 110 109 108 107 106 105 104 103 102 101 100 99 98 97 ---------------------------------------------------------------------------------------------------
Пример: Вычислить Y=1+1/2+1/3+…+1/N;
Для реализации программы необходимо многократно произвести вычисления по формуле Y=1+1/i при изменении параметра i от 1 до N ------------------------------------------------------------------------------------------------ Реализация 1: Program L_2; var i, N: integer; y: real; begin writeln('введите N'); read(N); y:=0; for i:=1 to N do y:=y+1/i; writeln('y=',y:5:2); end. --------------------------------------------------------------------- Ответ: введите N y= 2.45 введите N y= 1.50 --------------------------------------------------------------------- Реализация 2: Program L_2; var i, N: integer; y: real; begin writeln('введите N'); read(N); y:=0; for i:=N downto 1 do y:=y+1/i; writeln('y=',y:5:2); end. --------------------------------------------------------------------- Ответ: введите N y= 2.45 введите N y= 1.50 ---------------------------------------------------------------------------------
Значение параметра цикла в теле цикла может не использоваться, а лишь выполнять функцию счетчика. Например, пусть необходимо вычислить Y=Xn. Тогда фрагмент тела программы запишется в следующем виде: . . Y:=1; FOR i:=1 ТО N DO Y=Y*X; . .
Пример вложенности операторов с применением оператора IF: ------------------------------------------------------------------------------------ Program L5; var i, n: integer; p:longint; begin writeln('введите n'); read(n); p:=1; for i:=1 to n do begin if i mod 2=0 then begin p:=p*i; writeln(p:8); end; end; end. --------------------------------------------------------------------------------- Ответ: введите n ---------------------------------------------------------------------------------
Два других оператора цикла (с предусловием и постусловием) проверяют условия повторения или окончания цикла, но не изменяют значения параметра цикла. Они организуют выполнение цикла с неизвестным заранее числом повторений.
Оператор цикла с предусловием используется в случае, когда число повторений цикла заранее не известно и действия в цикле по условию могут ни разу не выполниться. Структура этого оператора имеет вид:
WHILE <условие> DO <оператор>; WHILE – «пока»; DO – «выполнить».
где < условие> - это любое логическое выражение, истинность которого проверяется в начале каждой итерации (условие выполнения тела цикла), <оператор> - произвольный оператор языка, в том числе и составной.
Если условие истинно, то выполняется оператор, стоящий за ключевым словом DO. Если условие ложно, то производится выход из цикла.
После выполнения <оператора>, вновь вычисляется и анализируется <условие> и вновь в случае его истинности выполняется <оператор>. Эти действия повторяются до тех пор, пока <условие> не станет ложным.
Пример. Вычислить Y=1+1/2+1/3+...+1/N. ------------------------------------------------------------------------------------- Программа с применением оператора WHILE может быть составлена в следующем виде:
Program L15_2; var i, n: integer; y: real; begin writeln(‘введите N’); read(N); Y:=0; i:=1; while i<= N do begin Y:=Y+1/i; i:=i+1 end; writeln(‘y=’,y:5:2); end. --------------------------------------------------------------------- ответ: введите n y= 2.59 ----------------------------------------------------------------------- Пример: Для значения a=0.5 протабулировать функцию ------------------------------------------------------------------------ Program L5_3; const a=0.5; var x, p: real; begin x:=0; while x<=2 do begin p:=sqr(x)*exp(((-x)*x)/a); x:=x+a/2; writeln(p:5:5); end; end. ------------------------------------------------------------------------ Ответ: 0.00000 0.05516 0.15163 0.18262 0.13534 0.06865 0.02500 0.00670 0.00134 ----------------------------------------------------------------------- Эта же задача, но результат требуется записать в виде таблицы
Program L5_3; const a=0.5; var x, p: real; n: integer; begin writeln('---------------------'); writeln(' n | x | p '); writeln('---------------------'); x:=0; n:=0; while x<=2 do begin p:=sqr(x)*exp(((-x)*x)/a); x:=x+a/2; n:=n+1; writeln(n:3,' ',x:5:2,' ',p:5:5); end; writeln('----------------------'); end. _____________________________________________________ Ответ: -------------------------- n | x | p -------------------------- 1 0.25 0.00000 2 0.50 0.05516 3 0.75 0.15163 4 1.00 0.18262 5 1.25 0.13534 6 1.50 0.06865 7 1.75 0.02500 8 2.00 0.00670 9 2.25 0.00134 --------------------------- _____________________________________________________
Оператор цикла с постусловием производит проверку условия после выполнения операторов тела цикла, которые должны выполниться хотя бы один раз. Его структура следующая:
REPEAT <оператор1>; ... <операторN> UNTIL <условие_выхода>; REPEAT – «повторять до тех пор»; UNTIL – «пока не будет выполнено условие». (PEREAT и UNTIL – зарезервированные слова).
<оператор1>...<операторN> - любой оператор ТР <условие выхода> - выражение логического типа.
При истинности значения логического выражения <условие_выхода> выполняется выход из цикла. В данном операторе ключевые слова REPEAT и UNTIL выполняют роль операторных скобок, поэтому точку с запятой перед словом UNTIL не ставят. Оператор цикла REPEAT отличается от WHILE во-первых: здесь условие проверяется после выполнения тела цикла. Иными словами, гарантируется хотя бы однократное его выполнение; во-вторых: оператор REPEAT выполняется до тех пор, пока условие равно false, и управление передаётся следующему (за repeat ) оператору, когда условие становится равным true (для оператора while имеет место обратная зависимость).
Пример фрагмента программной реализации вычисления значения Y=1+1/2+1/3..+1/N при использовании оператора цикла с постусловием. . . begin Y:=0; i:=1; Repeat Y:=Y+1/i; i:=i+1 until i>N; end.
Пример: Вычислить сумму с точностью E=0.00001 Y=1+x/3+x2/5+x3/7+…+xn/(2n+1)+… где |x|<1, т.е. когда очередное слагаемое будет меньше E, мы заканчиваем вычисление. ------------------------------------------------------------------- Program l5_4; const e=0.00001; label M; var i, n: byte; x, y, r: real; begin M: writeln('введите x'); read(x); if abs(x)>=1 then goto M; y:=1; n:=1; repeat r:=1; {расчёт x в степени n} for i:=1 to n do { ---\\--- } r:=r*x; { ---\\--- } y:=y+r/(2*n+1); {расчёт суммы, к итогу добавляется новое слагаемое} n:=n+1 {переход к следующему слагаемому} until(r/(2*n+1))<e; writeln('y=',y:7:5); end. ------------------------------------------------------------------- Ответ: введите x 0.5 y=1.24644 введите x введите x 0.9 y=1.91674 -------------------------------------------------------------------- Или эта же задача, но без r
Program l5_4; const e=0.00001; label M; var i, n: byte; x, y: real; begin M: writeln('введите x'); read(x); if abs(x)>=1 then goto M; y:=1; n:=1; repeat y:=y+exp(n*ln(x))/(2*n+1); {расчёт суммы, к итогу добавляется новое слагаемое} n:=n+1 {переход к следующему слагаемому} until(exp(n*ln(x))/(2*n+1))<e; writeln('y=',y:7:5); end. -------------------------------------------------------------------------- Ответ: тот же
|