条件分岐(if)

条件によって特定の処理を実行させたり、させなかったりしたい場合があります。
そのような場合、fortranではif文やcase文を使います。

この記事ではif文を使った条件分岐について説明します。
記事の最後にサンプルプログラムを掲載しています。

スポンサーリンク

if文の記述ルール

if文の基本形は以下のとおりです。条件1を満たしている(真である)場合に、処理1が実行されます。

if (条件1) 処理1


複数の処理を実行したければ、以下のように書きます。ちなみに、処理の数が一つの場合でも以下の書式は使えます。

if (条件1) then
__処理1
__処理2
end if


条件1を満たしている(真である)場合には処理1を実行し、満たしていない(偽である)場合には処理2を実行するプログラムは以下のように else を用いて記述します。

if (条件1) then
__処理1
else
__処理2
end if


条件1と条件2の両方を満たしている場合に、処理1を実行させたければ、以下のように .and. を用います。and の前と後に . (ドット)を付けるのを忘れないで下さいね。

if ((条件1) .and. (条件2)) 処理1


条件1と条件2のいずれかを満たしている場合に、処理1を実行させたければ、以下のように .or. を用います。同じく or の前と後に . (ドット)を付けて下さい。

if ((条件1) .or. (条件2)) 処理1


.and..or. を同時に使うときは、以下のように優先したい条件をかっこでくくります。以下の例では、条件1と条件2のいずれかが満たされ、かつ条件3が満たされた場合に、処理1が実行されます。

if ( ((条件1) .or. (条件2)) .and. (条件3) ) 処理1


以下のように、if文の中にif文を入れることもできます。この場合、条件1と条件2が満たされれば、処理1が実行されます。

if (条件1) then
__if (条件2) then
____処理1
__end if
end if

条件の記述方法(比較演算子)

変数Aが変数Bより大きい場合に、処理1を実行させるには以下のように記述します。

if (A > B) then
__処理1
end if

上記の > (不等号の記号)は、比較演算子と呼ばれます。比較演算子には以下のようなものがあります。等しい場合は、== のようにイコールを2回続けて記載する点に注意して下さい。

__A == B__! AはBと等しい
__A != B__! AはBと異なる
__A > B___! AはBより大きい
__A < B___! AはBより小さい
__A >= B__! AはB以上である
__A <= B__! AはB以下である

if文のちょっとしたtips

tipsを以下に列挙します。読みやすいプログラムや、速いプログラムを書くときに役に立つと思うので、頭の片隅に置いておいて下さいね。

・if文の中にif文を入れる場合は、あまり多重にしない。プログラムの可読性が下がります。アルゴリズムを工夫して2重ぐらいにとどめましょう。

・条件が多いときは、case文を使いましょう。可読性が上がります。case文は別記事で解説します。→ 条件分岐(case)

・if文の処理には掛け算1回分と同程度の時間がかかります。繰り返し回数の多いループ文の中では可能な限りif文を減らしましょう。ループ文は別記事で解説します。→ 繰り返し(do)

サンプルプログラム

サンプルプログラムを下記します。4-6行目は変数の型宣言、8-11行目は変数に初期値を代入、18-24行目は実数型変数と実数の比較、26-36行目は実数型変数同士の比較、38-42行目は文字型変数と文字列の比較です。

44-45行目では、実数型変数と実数の比較結果が真の場合に、論理型変数に .true. を代入し、この論理型変数の真偽判定を46-50行目で実行しています。if文が複雑になることを回避するために、こんな書き方をする場合があります。ちなみに、論理型変数の真偽判定では、
if (lg == .true.) then
のような書き方もできますが、== .true. は省略できます。

以下のFortranプログラムをコピペし、****.f90の名前で保存して下さい(****の部分は適当でいいです)。コピペが面倒な場合は、こちらからダウンロードして下さい(右クリックメニューから保存)。→ sample05.f90

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
program sample05
  implicit none
!--------------------------------------------------------------------
  real(8) :: a, b, c
  character(len=80) :: o
  logical :: lg
!--------------------------------------------------------------------
  a = 1.0
  b = 2.0
  c = 3.0
  o = 'dog'
 
  write(*,'(a,f3.1)') 'a = ', a
  write(*,'(a,f3.1)') 'b = ', b
  write(*,'(a,f3.1)') 'c = ', c
  write(*,'(a,a10)') 'o = ', o
 
  if (a > 0.0) write(*,'(a)') 'True: a is greater than 0.0.'
 
  if (a >= 1.0) then
    write(*,'(a)') 'True: a is greater than  or equal to 1.0.'
  else
    write(*,'(a)') 'False: a is less than 1.0.'
  end if
 
  if (a > b) then
    write(*,'(a)') 'True: a is greater than b.'
  else
    write(*,'(a)') 'False: a is less than or equal to b.'
  end if
 
  if ( ((a > b) .or. (c > b)) .and. (c > a) ) then
    write(*,'(a)') 'True: ((a > b) .or. (c > b)) .and. (c > a)'
  else
    write(*,'(a)') 'False'
  end if
 
  if (o == 'cat') then
    write(*,'(a)') 'True: o is cat.'
  else
    write(*,'(a)') 'False: o is not cat.'
  end if
 
  lg = .false.
  if (a > 0.0) lg = .true.
  if ( lg ) then
    write(*,'(a)') 'True'
  else
    write(*,'(a)') 'False'
  end if
 
!--------------------------------------------------------------------
end program sample05

使い方は、前記事と同様に、****.f90を以下の****.batにドラッグ&ドロップするだけです。
64bit用 → comp_exe_64.bat
32bit用 → comp_exe_32.bat

sample05

こんな画面が出たでしょうか?出ていれば正常終了です。8-11行目の値を変えて、色々試してみて下さい。


→ 次の記事へ(条件分岐(case))
← 前の記事へ(四則演算と組込み関数)
目次(Fortran90)

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です