5. ОРГАНИЗАЦИЯ ПРОГРАММ
ЦИКЛИЧЕСКОЙ СТРУКТУРЫ
Для
многократного повторения одних и тех же действий в Паскале предусмотрены три оператора
цикла. Если число повторений цикла известно, то применяется оператор for. Если число повторений заранее неизвестно, но известно
условие завершения цикла, применяются операторы repeat и while.
Оператор цикла с параметром for
Данный
оператор имеет вид:
for i:= a to b do s;
При выполнении
оператора for сначала вычисляется начальное
значение а, которое присваивается переменной
i, называемой параметром
цикла. Затем вычисляется
конечное значение b и проверяется,
имеет ли место равенство i = b. Если равенства нет, выполняется оператор s, который
может быть составным, и переменная i увеличивается на единицу. После этого проверка (не
равен ли параметр конечному значению), выполнение оператора s и увеличение переменной i на единицу выполняется циклически до тех пор, пока
не наступает равенство i = b. Параметр цикла i, начальное и конечное значения
a и b могут
принадлежать любому порядковому типу данных (например, integer ).
Если начальное значение превышает или равно конечному значению с самого начала,
оператор s не
выполняется ни разу.
Использованные
здесь зарезервированные слова for, to и do имеют смысл от, до и выполнить, соответственно.
Возможна
другая форма оператора цикла с параметром:
for i:= a down to b do s;
Здесь, чтобы
выполнялся оператор s, начальное значение
а должно превышать конечное
значение b. Кроме того, в этом случае
параметр i с каждым циклом уменьшается
на единицу, пока не станет равным значению b.
Оператор цикла
for имеет такие особенности:
1.
в теле цикла запрещается явно изменять значение
параметра цикла;
2.
по завершении работы оператора for значение параметра цикла считается неопределенным.
Пример использования
оператора цикла for:
program maxi;
{программа нахождения наибольшего
элемента одномерного массива}
var
x: array [1..100] of real; {исходный массив}
n: integer; {число элементов массива}
k: integer; {параметр цикла}
max: real; {наибольший элемент массива}
begin
write (’n =’): readln
(n);
for k:= 1 to n do
begin
write (’a[’,
k:3,’]=’): readln (a[k]);
end;
max: = a[1];
for k:= 2 to n do
if a[k] > max then max: = a[k];
writeln (’наибольший
элемент =’, max:10:4);
end.
Оператор цикла с предусловием while
Данный
оператор имеет вид:
while p do s;
При его
выполнении сначала вычисляется логическое выражение p (условие),
в случае истинности которого
выполняется оператор s (являющийся, как правило,
составным оператором). После этого вычисление условия, его проверка и
выполнение оператора s повторяется до тех пор, пока
выражение p не станет равным false. Тогда управление передается следующему (после while) оператору в программе. Если условие p равно false с самого начала, оператор s, который называется телом цикла, не выполняется ни разу.
Использованные
здесь ключевые слова while и do имеют смысл пока и выполнить, соответственно.
В качестве
примера использования оператора while приведем
программу вычисления числа π по формуле
Грегори:
с точностью
0.5·10-7:
program calcpi;
const
c = 0.5E – 7;
var
a, sum: real;
sign: integer;
n: longint;
begin
sign: = -1;
sum: = 1.0;
a: = 1.0;
n: = 1;
while abs(a) > c do
begin
a: = sign /
(2 * n – 1);
sum: = sum +
a;
sign: = -
sign;
n: = n + 1;
end;
sum: = 4 * sum;
write (’pi =’, sum);
end.
Оператор цикла с постусловием repeat
Данный
оператор имеет вид:
repeat s until p;
Сначала
выполняется тело цикла (s), затем вычисляется
логическое выражение p (условие),
в случае ложности которого вновь
выполняется тело цикла. Затем выполнение тела цикла, вычисление условия p и его проверка повторяются до тех
пор, пока выражение p не станет равным true. Тогда управление передается следующему (за repeat) оператору в программе.
Использованные
здесь зарезервированные слова repeat и until имеют
смысл повторять и пока не, соответственно.
Пример
использования оператора цикла repeat:
Program prost; {проверка, является ли
введенное с клавиатуры
натуральное
число простым}
var
n: integer; {введенное число}
d: integer; {делитель}
r: integer; {остаток от деления}
begin
write (’Введите натуральное
число:’); readln
(n);
d:= 2; {сначала будем делить на
два}
repeat
r:= n mod d;
if r < > 0 {n не
разделилось нацело на d}
then d:= d + 1;
until r = 0; {пока не нашли число,
на которое делится n}
if d = n
then writeln (n,’ – простое число.’)
else writeln
(n,’ – не простое
число.’);
end.
Вложенные циклы
В программах
на Паскале возможно использование вложенных циклов. Это подразумевает, что
существует внешний цикл и один или несколько внутренних циклов. Каждое
повторение внешнего цикла означает завершение всех внутренних циклов; при этом
всем выражениям, которые управляют внутренними циклами, вновь присваиваются
начальные значения.
Пример
использования вложенных циклов:
Program summa; {программа вычисления
суммы положительных
элементов
матрицы А(5*8)}
var
a: array [1..5, 1..8] of real; {исходная матрица}
i, j: integer; {параметры циклов}
sum: real; {сумма положительных элементов}
begin
s:= 0;
for i:= 1 to 5 do
begin
for j:= 1 to
8 do
begin
read
(a[i, j]);
if a[i, j] > 0 then s:= s + a[i,
j];
end;
writeln;
end;
writeln (’сумма
положительных элементов =’, sum:10:6);
end.
Данная
программа содержит два оператора цикла с параметром, вложенные один в другой. Две переменные (i и j) типа integer представляют
собой управляющие параметры для внешнего и внутреннего циклов, соответственно.
С каждым повторением внешнего цикла (таких повторений пять) количество
повторений внутреннего цикла равно восьми. Таким образом, элементы матрицы А вводятся по строкам.