- •8. Все разновидности чисел integer и real, представление чисел в Фортране, операции над числами
- •Строковое выражение
- •Логическое выражение
- •10. Логические выражения и порядок действий при их вычислении. Интерпретация отношений, логических значений, операций, выражений. Булева алгебра и ее законы
- •11. Оператор присваивания, арифметический, логический, строковый. Смешанные числовые выражения и порядок их вычислений
- •12. Структурный if, одноблочный if, логический if, многоблочный if Ветвления – конструкция If
- •13. Сравнение трех видов циклов, вспомогательные операторы
- •Цикл по переменной
- •14. Цикл с заранее известным числом повторений, его подробная блок-схема
13. Сравнение трех видов циклов, вспомогательные операторы
Циклы – конструкции DO
Циклом в программе называют группу (блок) многократно выполняемых операторов. Конструкция do обрамляет цикл
do …
…блок_do…
enddo
Имеется три разновидности циклов в Фортране:
бесконечный цикл;
итеративный цикл (цикл по условию);
цикл по переменной (с заранее известным числом повторений).
Бесконечный цикл
Блок-схема |
Конструкция Do |
|
do блок_do, в том числе if (на_выход) exit enddo ! только повтор do
|
Чтобы выполнение цикла когда-либо закончилось, среди операторов блока_DO должен быть хотя бы один exit с условием выхода из цикла.
Цикл по условию (итеративный цикл)
Блок-схема |
Конструкция Do |
|
Пока условие выполняется, цикл продолжается Do while(условие) блок_do enddo ! только повтор do
|
Цикл по переменной
Переменная
в операторе DO
– предпочтительнее целая, но также
допускается вещественная или вещественная
двойной точности. Формула расчета числа
повторений цикла
.
Начало xn, конец xk и шаг step – константы, переменные или выражения одного из перечисленных типов. Функция int() вычисляет целую часть указанного частного, отбрасывая дробную, без округления. Результат max : max (0, +) => + max (0, –) => 0 max (0, 0) => 0 . Опуская подробности, цикл рисуют так:
Блок-схема |
Конструкция Do |
|
do переменная = xn, xk, step блок_do enddo |
Цикл не выполнится ни разу, то есть kp=0, если
или
Шаг цикла step регламентируется следующим образом:
step≠0;
эквивалентны Do i= 1,10,1 и Do i = 1,10 – по умолчанию step=1;
если step>0, x возрастает, по окончании цикла x > xk;
если step<0, x убывает, по окончании цикла x < xk.
Переменная цикла x изменяется по закону арифметической прогрессии. Для понимания того, как это происходит, покажем подробную блок-схему, в которой проясняются все детали и правила для цикла по переменной.
14. Цикл с заранее известным числом повторений, его подробная блок-схема
Подробная блок-схема цикла по переменной |
|
Блок-схема |
Пояснения |
|
Здесь х – переменная цикла; xn, xk, step – константы, переменные или выражения. 1) do x=xn,xk,step 2) блок_do 3) enddo 4) продолжение enddo – это пункт (3), включающий в себя 3 действия:
|
В соответствии с подробной блок-схемой цикла по переменной выполнение цикла регламентируется следующими правилами:
переменная x в цикле do изменяется автоматически по закону арифметической прогрессии – изменять ее в блоке_do запрещено;
не разрешается входить внутрь блока_do извне, поскольку в этом случае не определено число повторений цикла kp и переменная x;
переменные xn, xk, step можно изменять в цикле – это не повлияет на число повторений уже запущенного цикла;
оператор Cycle, встретившийся в блоке_do, прерывает пункт (2) и вызывает переход к enddo – пункту (3);
оператор Exit, встретившийся в блоке_do, прерывает цикл, завершает его досрочно и вызывает переход к пункту (4) – на оператор непосредственно следующий в тексте за end do;
при нормальном завершении цикла переменная x достигает значения x = xn + step *kp, а при досрочном выходе сохраняется достигнутое значение x из [xn,xk].
Цикл по вещественной переменной x имеет неустойчивый характер:
при некоторых xn, xk, step цикл выполняется для значения x = xk;
при других xn, xk, step цикл пропускает последнее значение x = xk.
Причина: ошибка в вычислении kp и накопление погрешности округления в x=x+step, особенно при сравнительно малом step по отношению к x.
Такой цикл можно скорректировать, возможны два варианта:
переделать радикально – построить цикл по целой переменной int, через которую выразить вещественную переменную x. Количество повторений kp при этом следует рассчитать самостоятельно перед циклом; int будет изменяться точно, x не станет накапливать погрешность, хотя разовая погрешность сохранится
integer int, kp; real x
kp = . . . ! количество повторений цикла
do int = 0, kp-1 ! kp – число повторений цикла
x = xn + int * step
! содержимое прежнего блока_do
enddo
«подправить» цикл по вещественной переменной, «обманув» Do и переписав его так: do x = xn, xk + step/2, step .
Среди операторов блока_do может встретиться конструкция Do. В этом случае говорят о вложенном цикле. Оценивая количество повторений оператора WRITE внутри вложенного цикла в примере, показанном ниже, необходимо помнить, что при каждом повторении внешнего цикла, внутренний цикл повторяется заново:
Пример вложенных конструкций Do
DO y = -1.0, 1.1, 0.2 ! 11 раз
do x = -1.0, 1.1, 0.2 ! 11 раз
WRITE(1,*) x,y ! 121=11*11 раз
enddo
ENDDO
В файл будет выведена 121 пара значений х и y.
