IT pass HikiWiki - [itbase2023]Fortran 実習 条件分岐 Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

{{toc}}

プログラムでは, 条件によって処理の内容を変えることが良くあります.
Fortran ではこの条件分岐の方法がいくつか提供されていますが,
ここでは最も基本的な方法である if 文について説明します.

= if 文

if 文は例えば下のようにのように書きます.

  if ( 条件文 ) then

    実行文 1

  else

    実行文 2

  end if

このプログラムは, まず条件文が評価され, それが成り立つときには
実行文 1 が実行されます.
もし条件文が成り立たない場合には実行文 2 のみが実行されます.

下のようなプログラムを ifelse.f90 というファイル名で作成して 実行してみましょう.

  program ifelse

    implicit none

    real :: val

    write( 6, * ) "Input a number: "      ! 数値の入力を促す
    read ( 5, * ) val                     ! キーボードから数値を入力

    if ( val > 0 ) then
      ! 数値が正の時の処理
      write( 6, * ) "Positive"

    else
      ! それ以外の時の処理
      write( 6, * ) "Zero or Negative"

    end if

  end program ifelse

入力を促されたときには正の数値や負の数値を入力して動作を確認してみましょう.

上の例では, キーボードから数値を入力すると, その数値が
正なのかそうでないのかによって画面に表示される文字が変わります.

なお, else 文は必ず必要なわけではなく, なくても構いません.
つまり, if 文は下のような構造でも問題ありません.

    if ( val > 0 ) then
      ! 数値が正の時の処理
      write( 6, * ) "Positive"

    end if

また, if 文は, 下のように複数を重ねることもできます.

  if ( 条件文 1 ) then

    実行文 1

  else if ( 条件文 2 ) then

    実行文 2

  else if ( 条件文 3 ) then

    実行文 3

  else

    実行文 4

  end if

また, if 文は, 下のように入れ子にすることもできます.

  if ( 条件文 1 ) then

    実行文 1

    if ( 条件文 2 ) then

      実行文 2

    else

      実行文 3

    end if

  else

    実行文 4

  end if


= 比較演算子・論理演算子

条件文に使える比較演算子や論理演算子には下のようなものがあります.

# RT
  delimiter = %

演算子% 旧来の書き方 % 意味 % 使用例
== % .eq. % 等しい % a == b
/= % .ne. % 等しくない % a /= b
> % .gt. % より大きい % a > b
>= % .ge. % 以上 % a >= b
< % .lt. % より小さい % a < b
<= % .le. % 以下 % a <= b
.not. %  % 以外 (否定) % .not. (a==b)
.and. %  % かつ % (a==b).and.(c==d)
.or. %  % もしくは % (a==b).or.(c==d)


= 練習問題 1

上に示したプログラム ifelse.f90 を変更して, 正の値の時には
"Positive" と表示し, ゼロの時には "Zero" と表示し, 負の値の時には "Negative" と表示するプログラムを作りなさい.

== プログラム例
* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2022/fortran_program/ifelse_mod.f90>))|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/ifelse_mod.f90>))


= 練習問題 2

二つの整数をキーボードから入力し, 一つ目の整数が二つ目の
整数で割り切れるかどうかを調べるプログラムを作りなさい.
割り切れるときには "OK" と表示し, 割り切れないときには "NG" と
表示しなさい.

== ヒントとプログラム例
* 一つ目の整数が二つ目の整数で割り切れるかどうかはどのように判定すればよいでしょう?
* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2022/fortran_program/divisible.f90>))|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/divisible.f90>))


= 練習問題 3

キーボードから年 (西暦) を入力し, その年が閏年ならば "Leap year!" と表示し,
そうでなければ "Non leap year" と表示するプログラムを作りなさい.

== ヒントとプログラム例
* 閏年
  グレゴリオ暦での閏年は, 4 で割り切れる年のうち,
  100 で割り切れる年を除き, 400 で割り切れる年を含めた年である.
* ((<プログラム例|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2022/fortran_program/leapyear.f90>))|URL:http://itpass.scitec.kobe-u.ac.jp/~itbase/exp/fy2023/fortran_program/leapyear.f90>))