Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Pascal_лекция5

.doc
Скачиваний:
21
Добавлен:
30.03.2015
Размер:
78.85 Кб
Скачать

Операторы цикла

Для многократного повторения одних и тех же действий в ТР предусмотрены три оператора цикла:

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.

--------------------------------------------------------------------------

Ответ: тот же

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]