Fortranプログラミングへようこそ! このステップでは、プログラムの流れをコントロールするための重要な構文、「条件分岐」について学びます。条件分岐を使うと、「もし〇〇だったら△△する、そうでなければ□□する」といったように、状況に応じて処理を変えることができます。Fortranでは主にIF文とSELECT CASE文が使われます。
IF文:柔軟な条件判定の基本
IF文は、Fortranで最もよく使われる基本的な条件分岐構文です。与えられた条件(論理式)が真 (.TRUE.
) か偽 (.FALSE.
) かによって、実行する処理を分けます。
1. 基本的なIF文 (IF … THEN … END IF)
最もシンプルな形は、条件が真の場合のみ特定の処理を実行するパターンです。
program simple_if implicit none integer :: score score = 85 print *, "Your score is ", score if (score >= 60) then print *, "Congratulations! You passed. " end if
end program simple_if
この例では、変数 score
が60以上の場合にのみ、合格メッセージが表示されます。
2. IF … THEN … ELSE … END IF
条件が真の場合と偽の場合で、それぞれ異なる処理を行いたい場合は ELSE
を使います。
program if_else implicit none integer :: temperature temperature = 15 print *, "Current temperature: ", temperature, " degrees Celsius." if (temperature >= 25) then print *, "It's hot! Wear light clothes." else print *, "It's not so hot. Maybe bring a jacket." end if
end program if_else
この例では、気温が25度以上かどうかでメッセージが変わります。
3. IF … THEN … ELSE IF … THEN … ELSE … END IF
複数の条件で分岐させたい場合は ELSE IF
を使います。条件は上から順に評価され、最初に真となった条件の処理が実行されると、残りの条件は評価されずにIF文を抜けます。どの条件にも当てはまらない場合は、ELSE
以下の処理が実行されます(ELSE
は省略可能)。
program multi_if implicit none integer :: grade grade = 75 print *, "Your grade is ", grade if (grade >= 90) then print *, "Excellent! A " else if (grade >= 80) then print *, "Good! B " else if (grade >= 70) then print *, "Fair. C" else if (grade >= 60) then print *, "Pass. D" else print *, "Fail. F " end if
end program multi_if
この例では、点数に応じて評価(A, B, C, D, F)が変わります。
論理式で使う演算子
IF文の条件式では、以下の比較演算子や論理演算子を使います。
比較演算子 (Fortran 90以降) | 比較演算子 (旧形式) | 意味 | 例 |
---|---|---|---|
== | .eq. | 等しい | a == b |
/= | .ne. | 等しくない | a /= 0 |
> | .gt. | より大きい | score > 90 |
< | .lt. | より小さい | temperature < 0 |
>= | .ge. | 以上 | count >= 10 |
<= | .le. | 以下 | value <= 100 |
論理演算子 | 意味 | 例 |
---|---|---|
.and. | かつ (両方が真なら真) | (x > 0) .and. (y > 0) |
.or. | または (どちらか一方が真なら真) | (status == 1) .or. (error_flag) |
.not. | 否定 (真なら偽、偽なら真) | .not. is_valid |
.eqv. | 論理的に等価 | (a < 0) .eqv. (b < 0) (aとbの符号が同じか) |
.neqv. | 論理的に非等価 | (a < 0) .neqv. (b < 0) (aとbの符号が異なるか) |
注意: a < x < b
のような数学的な書き方はできません。(a < x) .and. (x < b)
のように論理演算子でつなげる必要があります。
SELECT CASE文:特定の値に基づく分岐
SELECT CASE文は、ある変数(式)の値が特定の値や範囲に一致するかどうかで処理を分岐させたい場合に便利です。IF文で同じことを書くよりも、コードがすっきりと読みやすくなることがあります。
式には、整数型(INTEGER
)、文字型(CHARACTER
)、または論理型(LOGICAL
)のスカラー(単一の値を持つ変数)を指定します。
基本的なSELECT CASE文
program select_example implicit none integer :: signal_code character(len=20) :: message signal_code = 2 print *, "Signal code received: ", signal_code select case (signal_code) case (1) message = "Status OK" case (2) message = "Warning: Check system" case (3) message = "Error: Critical failure" case default message = "Unknown signal code" end select print *, "Message: ", trim(message)
end program select_example
この例では、signal_code
の値に応じて異なるメッセージが変数 message
に設定されます。
CASEで指定できる値の形式
CASE
文では、以下のように値や範囲、リストを指定できます。
- 単一の値:
case (10)
- 値のリスト:
case (1, 3, 5)
カンマで区切ります。 - 値の範囲:
case (1:10)
: 1から10までの範囲(両端を含む)case (:0)
: 0以下の範囲case (101:)
: 101以上の範囲
- 組み合わせ:
case (-10:-1, 10, 20:30)
CASE DEFAULT
case default
は、どの case
の条件にも一致しなかった場合に実行される処理を指定します。これは省略可能です。
文字型を使った例
program select_char implicit none character(len=1) :: command logical :: exit_flag = .false. print *, "Enter command (p: print, e: edit, q: quit):" read *, command select case (command) case ('p', 'P') ! 大文字・小文字を区別しない場合 print *, "Printing document..." case ('e', 'E') print *, "Editing document..." case ('q', 'Q') print *, "Quitting program. Goodbye! " exit_flag = .true. case default print *, "Unknown command: ", command end select ! exit_flag を使って後続の処理を制御できる (例) if (.not. exit_flag) then print *, "Continuing process..." end if
end program select_char
まとめ
今回は、Fortranの条件分岐の基本であるIF文とSELECT CASE文について学びました。
- IF文は、複雑な条件や範囲に基づいた分岐に適しています。
ELSE IF
を使うことで多岐にわたる条件分岐を記述できます。 - SELECT CASE文は、特定の変数の値が、いくつかの候補値や範囲のどれに一致するかで分岐する場合に、コードをシンプルかつ明瞭にします。
これらの条件分岐を使いこなすことで、より柔軟で実用的なプログラムを作成できるようになります。プログラムの流れを意識して、適切な条件分岐を使ってみましょう!
次のステップでは、処理を繰り返すための「繰り返し処理(DOループ、DO WHILE)」について学びます。お楽しみに!