Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вопросы 8-14.docx
Скачиваний:
3
Добавлен:
27.09.2019
Размер:
196 Кб
Скачать
☆

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,

  • уменьшение k на 1,

  • переход к (1).

В соответствии с подробной блок-схемой цикла по переменной выполнение цикла регламентируется следующими правилами:

  • переменная 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.