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 將離開子程式或函式。