Pascal_лекция5
.docОператоры цикла
Для многократного повторения одних и тех же действий в ТР предусмотрены три оператора цикла:
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
3
p=59049
введите x
5
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
6
y= 2.45
введите N
2
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
6
y= 2.45
введите N
2
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
6
2
8
48
---------------------------------------------------------------------------------
Два других оператора цикла (с предусловием и постусловием) проверяют условия повторения или окончания цикла, но не изменяют значения параметра цикла. Они организуют выполнение цикла с неизвестным заранее числом повторений.
Оператор цикла с предусловием используется в случае, когда число повторений цикла заранее не известно и действия в цикле по условию могут ни разу не выполниться. Структура этого оператора имеет вид:
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
7
y= 2.59
-----------------------------------------------------------------------
Пример:
Для значения a=0.5 протабулировать функцию при изменении аргумента x на интервале [0,2] с шагом равным dx=a/2.
------------------------------------------------------------------------
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
2
введите 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.
--------------------------------------------------------------------------
Ответ: тот же