跳轉至內容

Fortran/程式流程控制

來自華夏公益教科書,開放的書籍,開放的世界
(從 Fortran/Fortran control 重定向)


If-then(-else) 條件

[編輯 | 編輯原始碼]

條件執行是使用以下結構中的 ifthenelse 語句完成的

 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>

在第一種形式中,事情非常簡單。在第二種形式中,將評估算術表示式。如果表示式的值為負數,則執行將在第一個行號處繼續。如果表示式的值為零,則執行將在第二個行號處繼續。否則,執行將在第三個行號處繼續。

case (switch)

[編輯 | 編輯原始碼]
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

如果使用過時形式,迴圈不能以 IFGO TO 語句結束。可以使用 CONTINUE 語句作為 1 標籤的錨點。

在宣告 do 迴圈時還有一個可選的增量引數。以下將以 2 為單位遞增。2、4、6、...

do i=2,10,2
    write (*,*) i
end do

do 迴圈的引數不必是數字,可以是程式中定義的任何整數。firstlastincrement 可以是任何變數名。

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

華夏公益教科書