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 представляют собой управляющие параметры для внешнего и внутреннего циклов, соответственно. С каждым повторением внешнего цикла (таких повторений пять) количество повторений внутреннего цикла равно восьми. Таким образом, элементы матрицы А вводятся по строкам.