Опубликован: 03.09.2010 | Уровень: для всех | Доступ: свободно
Лекция 2:

Управляющие операторы языка

< Лекция 1 || Лекция 2: 123 || Лекция 3 >

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

Операторы цикла используются для вычислений, повторяющихся многократно. В Паскале имеется три вида циклов: цикл с предусловием while, цикл с постусловием repeat и цикл с параметром for. Каждый из них состоит из определенной последовательности операторов.

Блок, ради выполнения которого и организуется цикл, называется телом цикла. Остальные операторы служат для управления процессом повторения вычислений: это начальные установки, проверка условия продолжения цикла и модификация параметра цикла ( рис. 2.5). Один проход цикла называется итерацией.

 Структурные схемы операторов цикла

Рис. 2.5. Структурные схемы операторов цикла

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

Проверка условия продолжения цикла выполняется на каждой итерации либо до тела цикла (тогда говорят о цикле с предусловием, см. рис. 2.5, а ), либо после тела цикла (цикл с постусловием, см. рис. 2.5, б ). Разница между ними состоит в том, что тело цикла с постусловием всегда выполняется хотя бы один раз, после чего проверяется, надо ли его выполнять еще раз. Проверка необходимости выполнения цикла с предусловием делается до тела цикла, поэтому возможно, что он не выполнится ни разу.

Параметром цикла называется переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла. Количество повторений такого цикла можно определить заранее. Параметр есть не у всякого цикла. В так называемом итеративном цикле условие продолжения содержит переменные, значения которых изменяются в цикле по рекуррентным формулам 1Рекуррентной называется формула, в которой новое значение переменной вычисляется с использованием ее предыдущего значения. .

Цикл завершается, если условие его продолжения не выполняется. Возможно принудительное завершение как текущей итерации, так и цикла в целом. Для этого служат операторы break, continue и goto. Передавать управление извне внутрь цикла не рекомендуется, потому что при этом могут не выполниться начальные установки.

Цикл с предусловием while

Формат оператора прост:

while выражение do оператор

Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор (напомню, что составной оператор заключается между begin и end ). Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается на следующий за ним оператор.

ВНИМАНИЕ Если в теле цикла необходимо выполнить более одного оператора, необходимо заключить их в блок с помощью ключевых слов begin и end.

Пример. Программа, печатающая таблицу значений функции

\mathbf{Y} = 
\left( \begin{array}{ccc} 
t, ' x < 0 \\ 
tx, ' 0 <= x < 10 \\ 
2t, '  x => 10 \\
\end{array} \right)

для аргумента, изменяющегося в заданных пределах с заданным шагом.

Опишем алгоритм в словесной форме.

  1. Ввести исходные данные.
  2. Взять первое значение аргумента.
  3. Определить, какому из интервалов оно принадлежит.
  4. Вычислить значение функции по соответствующей формуле.
  5. Вывести строку таблицы.
  6. Перейти к следующему значению аргумента.
  7. Если оно не превышает конечное значение, повторить шаги 3–6, иначе закончить.

Шаги 3–6 повторяются многократно, поэтому для их выполнения надо организовать цикл. Назовем необходимые нам переменные так: начальное значение аргумента — Xn, конечное значение аргумента — Xk, шаг изменения аргумента — dX, параметр — t. Все величины вещественные. Программа выводит таблицу, состоящую из двух столбцов — значений аргумента и соответствующих им значений функции ( пример 2.2).

program tabl_fun;
var 
   Xn, Xk : real;   { начальное и конечное значение аргумента }
   dX     : real;   { шаг изменения аргумента } 
   x, y   : real;   { текущие значения аргумента и функции }
   t      : real;   { параметр }
begin
    writeln('Введите Xn, Xk, dX, t');             { приглашение ко вводу данных }
    readln(Xn, Xk, dX, t);                       { ввод исходных данных – шаг 1 }
    writeln(' --------------------------- ');               { заголовок таблицы }
    writeln('|      X      |      Y      |');
    writeln(' --------------------------- ');
    x := Xn;                           { первое значение аргумента = Xn – шаг 2 }
    while x <= Xk do begin                            { заголовок цикла – шаг 7 }
        if x < 0 then y := t;             { вычисление значения функции - шаг 4 }
        if (x >= 0) and (x < 10) then y := t * x;                       { шаг 4 }
        if x >= 10  then y := 2 * t;                                    { шаг 4 }
        writeln('|', x:9:2,'    |', y:9:2,'    |');{ вывод строки табл. – шаг 5 }
        x := x + dX;          { переход к следующему значению аргумента - шаг 6 }
    end;
    writeln(' --------------------------- ');
end.
Листинг 2.2. Таблица значений функции (оператор while)

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

Цикл с постусловием repeat

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

repeat
    тело цикла
until выражение

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

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

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

y(n)=\frac 1 2 \left( y(n-1) + \frac {x} {y(n-1)} \right),

где y ( n –1) — предыдущее приближение к корню (в начале вычислений выбирается произвольно), y ( n ) — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на eps — величину заданной точности ( пример 2.3)..

program square_root;
var X, eps,                            { аргумент и точность }
    Yp, Y : real;                      { предыдущее и последующее приближение }
begin
    repeat
        writeln('Введите аргумент и точность (больше нуля): ');
        readln(X, eps);
    until (X > 0) and (eps > 0);
    Y := 1;
    repeat
        Yp := Y;
        Y := (Yp + X / Yp) / 2;
    until abs(Y - Yp) < eps;
    writeln('Корень из ', X:6:3, ' с точноcтью ', eps:7:5,
             'равен ', Y:9:5);
end.
Листинг 2.3. Вычисление квадратного корня
< Лекция 1 || Лекция 2: 123 || Лекция 3 >
София Шишова
София Шишова

Я завершила экзамен 90 баллов на 5. Сертификат не заказала. Сейчас пытаюсь найти как его заказать. у меня указано экзамен пройден баллы оценка видно, а чтоб заказать сертификат нигде не видно.

Юрий Макушин
Юрий Макушин
Россия, Москва, РЭА им. Плеханова, 2004