
- •Лекция-3
- •1.10.2. Некоторые правила ввода.
- •1.10.3. Ввод и вывод данных из текстового файла.
- •§ 1.11. Операторы stop, pause, goto, continue
- •§ 1.12. Операторные функции
- •§ 1.13. Циклы
- •1.13.1. Понятие о цикле.
- •1.13.2. Простейшая конструкция do.
- •1.13.3. Do-цикл с параметром (цикл с шагом).
- •1.13.4. Цикл с условием.
- •1.13.5. Операторы прерывания циклов.
- •1.13.6. О вложенности do-конструкций.
- •1.13.7. Некоторые правила работы с do и do while циклами.
- •1.13.8. Примеры организации циклов.
§ 1.13. Циклы
1.13.1. Понятие о цикле.
Цикломназывается повторное выполнение БОК, завершаемое при выполнении некоторых условий. Однократное выполнение БОК цикла называетсяитерацией. Операторы и конструкции БОК цикла также называютсятелом цикла.
1.13.2. Простейшая конструкция do.
Простейшая конструкция DO имеет вид:
[имя:] DO
БОК
END DO [имя]
Данная конструкция задает бесконечный цикл (здесь БОК– тело цикла). Поэтому такой цикл должен содержать, по крайней мере, один оператор, напримерGOTOилиEXIT, обеспечивающие выход из цикла.
Имя конструкции, если оно присутствует, должно появляться в операторахDOиEND DO.
1.13.3. 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 |