Тема: Операторы цикла.

Количество часов: 1.

 

Рассмотрим случай, когда действие нужно повторить некоторое количество раз. Например, число х необходимо возвести в целую степень n. Здесь требуется оператор цикла. Операторов цикла в Паскале три: цикл for (с известным числом повторений), цикл while (с предусловием) и цикл repeat (с постусловием). В данном случае нам необходим цикл с известным числом повторений. Синтаксическая диаграмма цикла for представлена на Рис. 8.

Рис. 8. Синтаксическая диаграмма оператора цикла for

 

Цикл for имеет счетчик цикла, идентификатор которого стоит после слова for а также начальное и конечное значения счетчика цикла, т.е. значения выражений, стоящих до и после слова to (downto). Счетчиком цикла может быть переменная любого порядкового типа. При переходе к следующей итерации цикла к счетчику автоматически применяется функция succ (или pred, если стоит слово downto). Например, если счетчик имеет тип integer, то его значение будет увеличено (уменьшено) на 1. В случае, когда начальное значение счетчика цикла превышает конечное (в случае downto конечное значение превышает начальное), тело цикла не выполнится ни разу.

Программа возведения числа х в целую степень n может выглядеть следующим образом:

program power;

{Программа вычисления целой степени (n) числа х}

var

р,х : real;

i,n : integer;

begin

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

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

for i:=l to abs(n) do

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

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

p:=l/p;

write(p);

end.

 

В данной программе мы пользуемся итеративной формулой х k = х k-1×х. Начальное значение переменной р равно 1, т.е. х в нулевой степени. Заметим, что если n равно 0, то цикл ни разу не выполнится, т.е. результатом будет 1.

Отметим некоторые особенности параметров цикла. Внутри цикла for ни в коем случае не следует изменять ни один из его параметров, так как различные версии Паскаля реагируют на такие изменения по-разному. Не следует также пытаться использовать значение счетчика цикла после выхода из него.

Рассмотрим еще одну задачу с применением цикла. Предположим, требуется подсчитать число цифр целого положительного десятичного числа. Число повторений нам заранее не известно. Здесь необходим уже не цикл for, а какой-нибудь другой, например while. Его синтаксическая диаграмма представлена на Рис. 9.

 

Рис. 9. Синтаксическая диаграмма оператора цикла while

 

Синтаксис форме Бэкуса-Наура:

<оператор с предусловием>::= while <условие> do <оператор>

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

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

program count;

{Программа подсчитывает число цифр целого положительного числа n}

var

n,m,k : integer;

begin

write('Введите n: ');

readln(n);

k:=l;

m:=n;

while m div 10>0 do

begin

k:=k+l;

m:=m div 10;

end;

write('Число цифр: ',k);

end.

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

write('Введите n: ');

readln(n);

while n<0 do

begin

write('Введите n: ');

readln(n);

end;

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

Рис. 10. Синтаксическая диаграмма оператора цикла repeat

Синтаксис форме Бэкуса-Наура:

<оператор с постусловием>::= repeat <оператор> {; <оператор>} until <условие>

Анализируя синтаксическую диаграмму, обратите внимание на то, что в случае наличия в теле цикла нескольких операторов цикл repeat не нуждается в операторных скобках begin и end. Repeat называется циклом с постусловием, так как логическое условие, проверяемое в нем, находится в конце цикла.

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

repeat

write('Введите n: ');

readln(n);

until n>=0;

Нетрудно заметить, что этот фрагмент проще ввода с циклом while.

Итак, мы познакомились с тремя операторами цикла. Очевидно, что цикл for применяется тогда, когда число повторений известно заранее. Как же определить, когда нужно пользоваться циклом while, а когда — repeat? Repeat — это цикл, который обязательно выполнится хотя бы один раз, поэтому его надо употреблять тогда, когда заведомо известно, что хотя бы один раз тело цикла должно выполниться, как, например, в случае ввода числа с "защитой от дурака" — для выполнения программы сначала необходимо ввести число, а потом решать, корректно оно или нет. В случае же, когда вполне возможно, что тело цикла ни разу не выполнится, необходимо пользоваться циклом while. В приведенной выше программе это случай, когда введено число из одной цифры.

 

Методические материалы для лабораторного занятия №14