2. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ПАСКАЛЕ
2.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 имеет
такие особенности:
·
в теле цикла
запрещается явно изменять значение параметра цикла;
·
по завершении
работы оператора 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 представляют собой
управляющие параметры для внешнего и внутреннего циклов, соответственно.
С каждым повторением внешнего цикла (таких повторений пять) количество
повторений внутреннего цикла равно восьми. Таким образом, элементы матрицы А вводятся по строкам.