Теоретические сведения. Очень часто при составлении программ встречается ситуация, когда действие необходимо выполнить некоторое количество раз

Очень часто при составлении программ встречается ситуация, когда действие необходимо выполнить некоторое количество раз. Здесь требуется оператор цикла.

В языке Pascal три оператора цикла:

· с параметром for;

· с предусловием while;

· с постусловием repeat.

Рассмотрим работу операторов цикла подробно.

Оператор цикла с параметром имеет следующую синтаксическую форму:

for идентификатор := < выражение1 > to [ downto ] < выражение2 > do оператор;

Такие операторы обычно используются, когда количество повторений цикла может быть определено перед его началом. Кроме того циклы с параметром позволяют задать автоматическое изменение значения некоторой переменной и использование этого значения в последовательных итерациях. Более конкретно данный вариант оператора цикла определяет:

а) диапазон (выражение1.. выражение2)изменения значений управляющей переменной (идентификатор) и одновременно количество повторений оператора, содержащегося в теле цикла (оператор);

б) направление изменения значения переменной (возрастание – to или убывание – downto);

в) собственно действия (оператор), выполняемые на каждой итерации.

На использование управляющей переменной налагаются следующие ограничения:

1. В качестве управляющей переменной должна использоваться простая переменная.

2. Управляющая переменная должна иметь дискретный тип.

3. Начальные и конечные значения диапазона должны иметь тип, совместимый с типом управляющей переменной.

4. В теле цикла запрещается явное изменение значения управляющей переменной.

5. После завершения оператора значение управляющей переменной становится неопределенным.

Оператор, который находится в теле цикла for, выполняется один раз для каждого значения управляющей переменной в диапазоне между начальным и конечным значениями. Если в операторе цикла используется служебное слово to, а начальное значение управляющей переменной меньше его конечного значения, то оператор, содержащийся в теле цикла, не выполнится ни разу. Аналогичная ситуация имеет место в случае использования в операторе цикла служебного слова downto.

Рассмотрим пример программы, которая возводит произвольное число в целую степень.

Program power;

Var

p,x: real;

i,n: integer;

Begin

read(x,n);{ввод x,n}

p:=1;{присвоение степени начального значения}

for i:=1 to abs(n) do

p:=p*x;{вычисление степени}

if n<0 then {если степень отрицательна}

p:=p/x;

write(p);

End.

Оператор цикла с предусловием используется в тех случаях, когда количество повторений цикла заранее не известно. Он имеет следующую синтаксическую форму:

while < условие > do < оператор >;

Этот оператор задает повторяющееся выполнение оператора, содержащегося в нем. Перед каждым выполнением внутреннего оператора производится проверка значения булевского выражения (условие), которое служит критерием повторения: если это выражение имеет значение true, то выполняется очередная итерация; в противном случае выполнение оператора цикла заканчивается. Если выражение с самого начала имеет значение false, то цикл не выполнится ни разу.

Предположим, нужно подсчитать количество цифр целого положительного десятичного числа. Программа решения этой задачи может выглядеть следующим образом:

Program digits;

Var

n,k: integer;

Begin

write(‘введите n’);

readln(n);

k:=1;

while n div 10>0 do

Begin

k:=k+1;

n:=n div 10;

end;

write(‘Количество цифр:’,k);

End.

У этой программы есть один недостаток: она не обрабатывает отрицательные числа. По условию от нее этого и не требуется. Однако пользователь может ввести и отрицательное число. Перепишем программу так, чтобы пользователь вводил число до тех пор, пока оно не будет положительным. Фрагмент ввода будет теперь выглядеть следующим образом:

write(‘введите положительное n’);

readln(n);

while n < 0 do

Begin

write(‘введите n’);

readln(n);

end;

Это простой пример так называемой защиты от дурака. Теперь пользователь не получит результат, пока не введет положительное число. Однако нам пришлось написать один и тот же фрагмент ввода числа дважды: перед циклом и в теле цикла. Поэтому здесь лучше воспользоваться другим оператором цикла, а именно оператором цикла с постусловием.

Оператор цикла с постусловием имеет следующую синтаксическую форму:

Repeat

оператор1;

оператор2;

......

операторN;

until <условие>;

Этот оператор аналогичен предыдущему. Отличие заключается в том, что условие окончания цикла проверяется после выполнения очередной итерации (таким образом гарантируется хотя бы однократное выполнение цикла). Кроме того, критерием окончания цикла является равенство выражения, описывающего <условие>, константе true. Если выражение имеет значение false, то цикл выполняется.

Перепишем теперь фрагмент ввода, используя цикл repeat.

Repeat

write(‘введите положительное n’);

readln(n);

until n>=0;

Классическим примером задачи на применение цикла с условием является вычисление суммы членов степенного ряда. Пусть необходимо вычислить

.

Для любого k было бы нерационально считать входящие в выражения для общего члена степень и факториал с самого начала, имея их значения при предыдущем k. Как степень, так и факториал будут возрастать с ростом k, что может привести к потере точности и/или переполнению разрядной сетки при раздельном их вычислении. Удобнее найти так называемое рекуррентное соотношение, которое устанавливает зависимость между двумя соседними членами ряда в виде коэффициента рекуррентности (q) и в дальнейшем вычислять рекуррентно bk = bk–1q для k = 1, 2,... при очевидном начальном условии b0 = x. Для нашего случая

.

Пример выполнения задания

;

1) n = 9, x = 0.6;

2) x = 0.1…1.0,


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



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