[Fortranのはじめ方] Part8: 条件分岐(IF文、SELECT CASE)

Fortran

Fortranプログラミングへようこそ!🎉 このステップでは、プログラムの流れをコントロールするための重要な構文、「条件分岐」について学びます。条件分岐を使うと、「もし〇〇だったら△△する、そうでなければ□□する」といったように、状況に応じて処理を変えることができます。Fortranでは主にIF文SELECT CASE文が使われます。

IF文:柔軟な条件判定の基本

IF文は、Fortranで最もよく使われる基本的な条件分岐構文です。与えられた条件(論理式)が真 (.TRUE.) か偽 (.FALSE.) かによって、実行する処理を分けます。

最もシンプルな形は、条件が真の場合のみ特定の処理を実行するパターンです。


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以上の場合にのみ、合格メッセージが表示されます。

条件が真の場合と偽の場合で、それぞれ異なる処理を行いたい場合は 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度以上かどうかでメッセージが変わります。

複数の条件で分岐させたい場合は 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)のスカラー(単一の値を持つ変数)を指定します。


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 (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 の条件にも一致しなかった場合に実行される処理を指定します。これは省略可能です。


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)」について学びます。お楽しみに! 😊

参考情報

コメント

タイトルとURLをコピーしました