Fortran/プログラムのフロー制御

選択編集

If-then(-else)編集

条件付き実行は、以下の構成のifthenelse文を使って行われます。

 if (論理式1) then
    ! コードブロック
 else if (論理式2) then
    ! コードブロック
 else
    ! コードブロック
 end if

else if文はいくつあっても構いません。

論理式を作る際には、以下のような演算子を使うことができます。

関係演算子の一覧
操作 モダンFortran 旧式FORTRAN
より小さい(Less Than) < .LT.
より大きい(Greater Than) > .GT.
より大きいまた等しい >= .GE.
より小さいまたは等しい <= .LE.
等しい(Equal) == .EQ.
等しくない(Not Equal) /= .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には2つの興味深い古風な形式があります。

     IF (<logical_expression>) GOTO <statement_label>
     IF (<arithmetic_expression>) <first_label>, <second_label>, <third_label>

第1の形式では、物事は非常に簡単です。 2番目の形式では、算術式が評価されます。 式が負の数と評価された場合は、最初の文番号で実行が継続されます。 式がゼロと評価された場合、実行は2行目の番号に続きます。 それ以外の場合は、3行目から実行されます。

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~end do文を挿入します。

do i=1,10
    print *, i**2
end do
プログラム例
program hello
do i=1,10
    print *, i**2
end do
end program
動作結果
           1
           4
           9
          16
          25
          36
          49
          64
          81
         100

以下のコードのように、exitを使ってループを早期に終了させることができます。このコードでは、整数の二乗を、いずれかの二乗が25を超えるまで表示します。

do i=1,10
    isquare = i**2
    if (isquare > 25) exit
    print *, isquare
end do


動作結果
           1
           4
           9
          16
          25

ループは入れ子にすることができます。次のコードは、1から10までの整数の累乗2から4を表示します。

do i=1,10
    do ipower=1,3
        print *, i, ipower, i**ipower
    end do
end do
※ 動作結果については、長いので省略。

古い形式のDOでは、ループの終わりの行番号が使われます。 以下は同じループで、ラベル1が各ループの最後の行であることを明示しています(複数のループでのラベルの共有は、Fortran95からは禁止されています)。

      DO 1 i=1,10
          DO 1 ipower=1,3
              1 PRINT *, i, ipower, i**ipower
1     continue

旧来の形式を使用する場合、ループはIFまたはGO TO文で終わらせてはならない。1ラベルのアンカーとしてCONTINUE文を使用することができます。

また、doループを宣言する際には、オプションでインクリメント引数があります。 以下は、2の単位でカウントアップします。2, 4, 6, ...

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

doループの引数は数値リテラルである必要はなく、プログラムのどこかで定義されている任意の整数で構いません。first, lastincrementにはどんな変数名でも構いません。

do i=first,last,increment
    ! Code goes here
end do

単純な文編集

  • goto statement_label文は、指定された文番号にジャンプします。
  • stop exit_code文は、 指定された条件コードまたは終了コードで停止します。stopは、引数なしでコード化することができる。 多くのシステムでは、 stop 0 はまだ失敗であることに注意してほしい。また、Fortran2008以前では、条件コードは変数ではなく定数式でなければならないことに注意してください。
  • exit文は、ループを中断します。
  • continue文は、古風なDOループがIFで終わってしまう場合に、それを終わらせるために使うことができます。
  • cycle文は、プログラムの制御を次のend do文に移します。
  • return文は、サブルーチンや関数から呼び出し元に戻ります。