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 |