条件によって特定の処理を実行させたり、させなかったりしたい場合があります。
そのような場合、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
こんな画面が出たでしょうか?出ていれば正常終了です。8-11行目の値を変えて、色々試してみて下さい。
→ 次の記事へ(条件分岐(case))
← 前の記事へ(四則演算と組込み関数)
目次(Fortran90)