Fortran/程序流程控制
条件执行是使用以下结构中的if
、then
和 else
语句完成的
if (logical_expression1) then
! Block of code
else if (logical_expression2) then
! Block of code
else
! Block of code
end if
您可以根据需要添加任意数量的else if
语句。
在创建表达式时可以使用以下运算符
操作 | 现代 Fortran | 旧 FORTRAN |
---|---|---|
小于 | < | .LT. |
大于 | > | .GT. |
大于或等于 | >= | .GE. |
小于或等于 | <= | .LE. |
等于 | == | .EQ. |
不等于 | /= | .NE. |
逻辑等价 | .EQV. | |
逻辑不等价 | .NEQV. | |
逻辑非 | .NOT. | |
逻辑与 | .AND. | |
逻辑或 | .OR. |
注意:Fortran 标准要求.EQ.
和 .NEQ.
不能与逻辑值一起使用,但某些编译器不会强制执行该标准
要检查多个语句,请使用括号。
if ((a .gt. b) .and. .not. (a .lt. c)) then
以下程序生成一个 0 到 1 之间的随机数,并测试它是否在 0 到 0.3、0.3 到 0.6 或 0.6 到 1.0 之间。
program xif
implicit none
real :: x
real, parameter :: x1 = 0.3, x2 = 0.6
call random_seed()
call random_number(x)
if (x < x1) then
print *, x, "<",x1
else if (x < x2) then
print *, x, "<", x2
else
print *, x, ">=", x2
end if
end program xif
IF
有两种有趣的古老形式
IF (<logical_expression>) GOTO <statement_label>
IF (<arithmetic_expression>) <first_label>, <second_label>, <third_label>
在第一种形式中,事情非常简单。在第二种形式中,将评估算术表达式。如果表达式计算结果为负数,则执行将从第一个行号继续。如果表达式计算结果为零,则执行将从第二个行号继续。否则,执行将从第三个行号继续。
- select case(...) case (...); ... end select
如果 if 块包含对单个变量的重复测试,则可以使用select case 结构来替换它。例如,以下代码
if (month=="January" .or. month=="December") then
num_days = 31
else if (month=="February") then
num_days = 28
else if (month=="March") then
num_days = 31
else
num_days = 30
end if
可以替换为
select case (month)
case ("January", "December")
num_days = 31
case ("February")
num_days = 28
case ("March")
num_days = 31
case default
num_days = 30
end select
Fortran 不需要 break 语句。
- do i=1,10 ... end do
为了进行迭代,Fortran 有一个do 循环。以下循环打印 1 到 10 之间整数的平方
do i=1,10
print *, i**2
end do
可以使用 exit 提早退出循环,如下面的代码所示,该代码打印整数的平方,直到其中一个平方超过 25。
do i=1,10
isquare = i**2
if (isquare > 25) exit
print *, isquare
end do
循环可以嵌套。以下代码打印 1 到 10 之间整数的 2 到 4 次方
do i=1,10
do ipower=1,3
print *, i, ipower, i**ipower
end do
end do
在DO
的一种古老形式中,使用了循环结束的行号。以下是同一个循环,明确声明标签1
是每个循环的最后一行
DO 1 i=1,10
DO 1 ipower=1,3
1 PRINT *, i, ipower, i**ipower
如果使用古老的形式,循环不能以IF
或GO TO
语句结束。您可以使用CONTINUE
语句作为1
标签的锚点。
在声明do 循环时,还有一个可选的增量参数。以下将以 2 为单位递增。2、4、6、...
do i=2,10,2
write (*,*) i
end do
do 循环的参数不必是数字,它们可以是程序中其他地方定义的任何整数。first、last 和 increment 可以是任何变量名。
do i=first,last,increment
! Code goes here
end do
goto statement_label
将跳转到指定的语句编号。
stop exit_code
将使用指定的条件代码或退出代码停止。stop
可以不带参数编码。请注意,在许多系统中,stop 0
仍然是失败。还要注意,在 Fortran 2008 之前,条件代码必须是常量表达式,而不是变量。
exit
将离开循环。
continue
可用于在古老的DO
循环中结束循环,否则循环将在IF
上结束。
cycle
将程序控制转移到下一个end do
语句。
return
离开子程序或函数。