Fortran/プログラムのフロー制御
選択 編集
If-then(-else) 編集
条件付き実行は、以下の構成のif
、then
、else
文を使って行われます。
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, lastやincrementにはどんな変数名でも構いません。
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
文は、サブルーチンや関数から呼び出し元に戻ります。