Fortran
Контроль выполнения
Поиск…
Если конструкция
Конструкция if
(называемая блочным IF-заявлением в FORTRAN 77) является общей для многих языков программирования. Он условно выполняет один блок кода, когда логическое выражение оценивается как true.
[name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [name]
block]
[ELSE [name]
block]
END IF [name]
где,
- name - имя конструкции if (необязательно)
- expr - скалярное логическое выражение, заключенное в круглые скобки
- block - последовательность из нуля или более операторов или конструкций
Имя конструкции в начале оператора if then
должно иметь то же значение, что и имя конструкции в end if
, и оно должно быть уникальным для текущего модуля определения области видимости.
В операторах if
, (in) равенства и логические выражения, оценивающие оператор, могут использоваться со следующими операторами:
.LT. which is < ! less than
.LE. <= ! less than or equal
.GT. > ! greater than
.GE. >= ! greater than or equal
.EQ. = ! equal
.NE. /= ! not equal
.AND. ! logical and
.OR. ! logical or
.NOT. ! negation
Примеры:
! simplest form of if construct
if (a > b) then
c = b / 2
end if
!equivalent example with alternate syntax
if(a.gt.b)then
c=b/2
endif
! named if construct
circle: if (r >= 0) then
l = 2 * pi * r
end if circle
! complex example with nested if construct
block: if (a < e) then
if (abs(c - e) <= d) then
a = a * c
else
a = a * d
end if
else
a = a * e
end if block
Историческое использование конструкции if
в так называемом «арифметическом if». Однако, поскольку это может быть заменено более современными конструкциями, это не рассматривается здесь. Более подробную информацию можно найти здесь .
Конструкция SELECT CASE
Конструкция select case
условно выполняет один блок конструкций или операторов в зависимости от значения скалярного выражения в заявлении о select case
. Эта конструкция управления может рассматриваться как замена для вычисленного goto
.
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
где,
- name - имя конструкции
select case
(необязательно) - expr - скалярное выражение типа integer, логическое или символьное (заключено в круглые скобки)
- case-value - одно или несколько скалярных целочисленных, логических или символьных выражений инициализации, заключенных в круглые скобки
- block - последовательность из нуля или более операторов или конструкций
Примеры:
! simplest form of select case construct
select case(i)
case(:-1)
s = -1
case(0)
s = 0
case(1:)
s = 1
case default
print "Something strange is happened"
end select
В этом примере значение (:-1)
case - это диапазон значений, соответствующий всем значениям, меньшим нуля, (0)
соответствует нулям, и (1:)
соответствует всем значениям выше нуля, раздел по default
включает в себя, если другие разделы не выполняется.
Блок DO построить
Конструкция do
представляет собой петлевую конструкцию, которая имеет ряд итераций, управляемых с помощью управления контуром
integer i
do i=1, 5
print *, i
end do
print *, i
В приведенной выше форме переменная цикла i
проходит через петлю 5 раз, принимая поочередно значения от 1 до 5. По завершении построения переменная цикла имеет значение 6, то есть переменная цикла увеличивается еще раз после завершения цикла .
В более общем плане конструкцию петли do
можно понять следующим образом
integer i, first, last, step
do i=first, last, step
end do
Цикл начинается с i
со значением first
, увеличивая каждую итерацию на step
пока i
станет больше last
(или меньше last
если размер шага отрицательный).
Важно отметить, что поскольку Fortran 95, переменная цикла и выражения управления контуром должны быть целыми.
Итерация может быть завершена преждевременно с помощью инструкции cycle
do i=1, 5
if (i==4) cycle
end do
и вся конструкция может прекратить выполнение с помощью оператора exit
do i=1, 5
if (i==4) exit
end do
print *, i
do
конструкции могут быть названы:
do_name: do i=1, 5
end do do_name
что особенно полезно, когда вложенные конструкторы do
do1: do i=1, 5
do j=1,6
if (j==3) cycle ! This cycles the j construct
if (j==4) cycle ! This cycles the j construct
if (i+j==7) cycle do1 ! This cycles the i construct
if (i*j==15) exit do1 ! This exits the i construct
end do
end do1
do
конструкции могут также иметь неопределенный контур управление, либо «навсегда» или пока данное условие не будет выполнено
integer :: i=0
do
i=i+1
if (i==5) exit
end do
или же
integer :: i=0
do while (i<6)
i=i+1
end do
Это также допускает бесконечный цикл do
через .true.
заявление
print *,'forever'
do while(.true.)
print *,'and ever'
end do
Конструкция do
может также оставлять порядок итераций неопределенным
do concurrent (i=1:5)
end do
отметив , что форма управления с обратной связью является таким же , как в forall
контроля.
Существуют различные ограничения на операторы, которые могут выполняться в пределах диапазона do concurrent
конструкции do concurrent
которые предназначены для обеспечения отсутствия зависимостей между итерациями конструкции. Это явное указание программиста может обеспечить большую оптимизацию (включая распараллеливание) компилятором, которая может быть затруднена для определения иначе.
«Частные» переменные в рамках взаимодействия могут быть реализованы с использованием block
конструкции внутри do concurrent
:
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
В другой форме блока do
create использует помеченный оператор continue
вместо end do
:
do 100, i=1, 5
100 continue
Можно даже вложить такие конструкции с общим заявлением о завершении
do 100, i=1,5
do 100, j=1,5
100 continue
Обе эти формы, и особенно вторая (которая устаревает), как правило, следует избегать в интересах ясности.
Наконец, есть и не-блок do
построить. Это также считается устаревшим и описано в do
другом месте , а также методы по реструктуризации как блок do
построить.
Конструкция WHERE
Конструкция where
, доступная в Fortran90 и далее, представляет собой скрытую конструкцию do
. Оператор маскирования следует тем же правилам инструкции if
, но применяется ко всем элементам данного массива. Использование where
позволяет выполнять операции над массивом (или несколькими массивами того же размера), элементы которого удовлетворяют определенному правилу. Это можно использовать для упрощения одновременных операций над несколькими переменными.
Синтаксис:
[name]: where (mask)
block
[elsewhere (mask)
block]
[elsewhere
block]
end where [name]
Вот,
- name - это имя, присвоенное блоку (если указано)
- mask - это логическое выражение, применяемое ко всем элементам
- block - серия команд, которые должны выполняться
Примеры:
! Example variables
real:: A(5),B(5),C(5)
A = 0.0
B = 1.0
C = [0.0, 4.0, 5.0, 10.0, 0.0]
! Simple where construct use
where (C/=0)
A=B/C
elsewhere
A=0.0
end
! Named where construct
Block: where (C/=0)
A=B/C
elsewhere
A=0.0
end where Block