DO-цикл с параметром (цикл с шагом).


Простейшая конструкция DO.

Понятие о цикле.

Циклы

 

Циклом называется повторное выполнение БОК, завершаемое при выполнении некоторых условий. Однократное выполнение БОК цикла называется итерацией. Операторы и конструкции БОК цикла также называются телом цикла.

Простейшая конструкция DO имеет вид:

[имя:] DO

БОК

END DO [имя]

Данная конструкция задает бесконечный цикл (здесь БОК – тело цикла). Поэтому такой цикл должен содержать, по крайней мере, один оператор, например GOTO или EXIT, обеспечивающие выход из цикла.

Имя конструкции, если оно присутствует, должно появляться в операторах DO и END DO.

 

Рекомендуемая форма DO-цикла с параметром имеет вид:

[имя:] DO I=IN,IK[,IH]

БОК

END DO [имя]

БОК – тело цикла;

I – целая, вещественная, одинарной или двойной точности переменная, называемая переменной цикла или параметром (счетчиком) цикла.

IN,IK – целые вещественные, одинарные или двойной точности скалярные выражения (например, константы или арифметические выражения), задающие диапазон изменения I. Иными словами, IN – начальное значение параметра цикла, а IK – конечное значение параметра цикла.

IH – целое, вещественное, одинарной или двойной точности скалярное выражение (шаг изменения параметра цикла, называемый в литературе шаг цикла). Значение IH не может быть равным нулю. Если параметр IH отсутствует, то «по умолчанию» он принимается равным единице.

DO-цикла с параметром работает так (случай IH>0):

1°. Присвоить I=IN.

2°. Если I<=IK, то перейти к пункту 3°, иначе завершить цикл.

3°. Выполнить БОК.

4°. Присвоить I=I+IH и перейти к пункту 2° (на повтор).

Для случая IH<0 следует модифицировать пункт 2°, переписав его в виде:

2°. Если I>=IK, то перейти к пункту 3°, иначе завершить цикл.

 

Оператор END DO можно также писать без пробела ENDDO.

Число итераций цикла определяется по формуле

NI=MAX(INT((IK-IN+IH)/IH),0)

где MAX – функция выбора наибольшего значения из перечисленных в скобках через запятую; функция INT возвращает значение, равное целой части числа.

Если DO-цикл с параметром не содержит операторов выхода из цикла, например GOTO или EXIT, то БОК выполняется NI раз.

После завершения цикла значение переменной цикла I равно (при IH>0):

· IP+IH, если IK>=IN и цикл не содержит операторов выхода из цикла, где IP – значение переменной цикла на последней итерации;

· IP, если IK>=IN и цикл досрочно прерван, например оператором EXIT или GOTO, где IP – значение переменной цикла I в момент прерывания цикла;

· IN, если IK<IN.

Аналогично определяется значение I и для случая IH<0.

Нельзя изменять значение переменной цикла в теле цикла.

При первом выполнении оператора DO I=IN,IK,IH вычисляются и запоминаются значения выражений IN,IK,IH. Все дальнейшие итерации выполняются с этими значениями. Поэтому, если IN,IK или IH являются переменными и их значения изменяются в теле цикла, то на работе цикла это не отразится.

Пример программы вычисления факториала :

read *,n f=1 do k=1,n f=f*k end do print *,’f=’,f end

 

Решение этой задачи с помощью оператора безусловного перехода

GOTO:

read *,n f=1; k=1 1 f=f*k k=k+1 if(k<=n) goto 1 print *,’f=’,f end

Сопоставляя оба варианта программы друг с другом, заметим, что оператор DO заменил три оператора: первоначальное присвоение (k = 1), увеличение счетчика (k=k+1), проверку условия (if).

При записи DO-циклов могут быть использованы метки. Метками помечаются последние операторы циклов, а в остальном структура остается прежней. Проиллюстрируем эту форму записи в двух вариантах на рассматриваемом примере вычисления факториала:

read *,n f=1 do 1 k=1,n 1 f=f*k print *,’f=’,f end read *,n f=1 do 1 k=1,n f=f*k 1 end do print *,’f=’,f end