Поиск…


Если конструкция

Конструкция 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow