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
将离开子程序或函数。