サーチ…
構築する場合
if
構文(FORTRAN 77のブロックIF文と呼ばれる)は、多くのプログラミング言語で共通しています。論理式がtrueと評価されたときに条件付きで1ブロックのコードを実行します。
[name:] IF (expr) THEN
block
[ELSE IF (expr) THEN [name]
block]
[ELSE [name]
block]
END IF [name]
ここで、
- name - if構文の名前(オプション)
- expr - カッコで囲まれたスカラー論理式
- block - 0個以上の文または構文のシーケンス
if then
文の先頭の構文名は、 end if
文の構文名と同じ値でなければならず、現在のend if
範囲単位に対して一意でなければなりません。
if
文では、文を評価する(平等)および論理式を次の演算子で使用できます。
.LT. which is < ! less than
.LE. <= ! less than or equal
.GT. > ! greater than
.GE. >= ! greater than or equal
.EQ. = ! equal
.NE. /= ! not equal
.AND. ! logical and
.OR. ! logical or
.NOT. ! negation
例:
! simplest form of if construct
if (a > b) then
c = b / 2
end if
!equivalent example with alternate syntax
if(a.gt.b)then
c=b/2
endif
! named if construct
circle: if (r >= 0) then
l = 2 * pi * r
end if circle
! complex example with nested if construct
block: if (a < e) then
if (abs(c - e) <= d) then
a = a * c
else
a = a * d
end if
else
a = a * e
end if block
if
構文の歴史的な使用法は、「算術式if」文と呼ばれます。しかし、これはより現代的な構造に置き換えることができるので、ここでは扱いません。詳細はこちらをご覧ください 。
SELECT CASE構文
select case
構文は、 select case
文のスカラー式の値に応じて、条件付きで1ブロックの構文または文を実行しselect case
。この制御構造は、計算されたgoto
代わりとみなすことができる。
[name:] SELECT CASE (expr)
[CASE (case-value [, case-value] ...) [name]
block]...
[CASE DEFAULT [name]
block]
END SELECT [name]
ここで、
- name -
select case
構文の名前(オプション) - expr - 整数型、論理型、または文字型のスカラー式(かっこで囲まれています)
- case-value - 括弧で囲まれた1つ以上のスカラー整数、論理、または文字初期化式
- block - 0個以上の文または構文のシーケンス
例:
! simplest form of select case construct
select case(i)
case(:-1)
s = -1
case(0)
s = 0
case(1:)
s = 1
case default
print "Something strange is happened"
end select
この例では、 (:-1)
の場合の値は、値の範囲は、ゼロ以上のすべての値に一致している(0)
ゼロに一致し、 (1:)
ゼロ以上のすべての値に一致は、 default
他の部分がなかった場合部が含まれ実行されません。
ブロックDO構成
do
構造体は、ループ制御によって制御される多くの反復を持つループ構造体です
integer i
do i=1, 5
print *, i
end do
print *, i
上記の形式では、ループ変数i
はループを5回通過し、値1〜5を順番にとります。構文が完了した後、ループ変数は値6を持ちます。つまり、ループ変数はループの完了後にもう一度インクリメントされます 。
より一般的には、 do
ループ構成は、以下のように理解することができる
integer i, first, last, step
do i=first, last, step
end do
ループが始まるi
値とfirst
によって各反復をインクリメントし、 step
までi
より大きいlast
(またはより少ないlast
のステップサイズが負の場合)。
Fortran 95以降、ループ変数とループ制御式は整数でなければならないことに注意することが重要です。
cycle
ステートメントで途中で終了することがあります
do i=1, 5
if (i==4) cycle
end do
構造全体がexit
ステートメントで実行を停止することがありexit
do i=1, 5
if (i==4) exit
end do
print *, i
do
構文の名前は次のとおりです。
do_name: do i=1, 5
end do do_name
これはネストされたdo
構造がある場合に特に便利です
do1: do i=1, 5
do j=1,6
if (j==3) cycle ! This cycles the j construct
if (j==4) cycle ! This cycles the j construct
if (i+j==7) cycle do1 ! This cycles the i construct
if (i*j==15) exit do1 ! This exits the i construct
end do
end do1
do
構造体は、「永遠」か、または所与の条件が満たされるまで、不定ループ制御を有することもできる
integer :: i=0
do
i=i+1
if (i==5) exit
end do
または
integer :: i=0
do while (i<6)
i=i+1
end do
これはまた、 .true.
を介して無限のdo
ループを可能にdo
ます.true.
ステートメント
print *,'forever'
do while(.true.)
print *,'and ever'
end do
do
構造はまた、反復の順序を不確定にする可能性がある
do concurrent (i=1:5)
end do
ループ制御の形式はforall
制御と同じであることに注意してください。
do concurrent
コンストラクトの範囲内で実行されるステートメントには、コンストラクトの反復間にデータ依存性がないことを保証するように設計された様々な制限があります。プログラマによる明示的な指示により、コンパイラによる最適化(並列化を含む)が可能になります。
インタラクション内の「私的な」変数は、 do concurrent
されるdo concurrent
内のblock
構造の使用によって実現することができます。
do concurrent (i=1:5, j=2:7)
block
real tempval ! This is independent across iterations
end block
end do
block do
構造のもう1つの形式は、 end do
代わりにcontinue
というステートメントを使用してend do
。
do 100, i=1, 5
100 continue
そのような構造を共有終了文でネストすることさえ可能です
do 100, i=1,5
do 100, j=1,5
100 continue
これらの形態の両方、特に第2のもの(陳腐化している)は、一般に、明確さのために避けるべきである。
最後に、non-block do
構造もあります。これはまた、陳腐化していると考えられ、 他の場所で説明されており、ブロック・do
コンストラクトとして再構成する方法も説明されてdo
。
WHEREコンストラクト
where
がFortran90で利用可能なコンストラクトは、以降のマスクされた表しdo
構築します。 masking文は、 if
文と同じ規則に従いますが、指定された配列のすべての要素に適用されます。使用したwhere
、動作はアレイ(または同じサイズの複数のアレイ)上で実施されることを可能にする特定のルールを満たすの要素。これは、複数の変数の同時操作を簡略化するために使用できます。
構文:
[name]: where (mask)
block
[elsewhere (mask)
block]
[elsewhere
block]
end where [name]
ここに、
- name - ブロックに与えられた名前です(名前が付けられている場合)。
- mask - すべての要素に適用される論理式です
- ブロック - 実行される一連のコマンド
例:
! Example variables
real:: A(5),B(5),C(5)
A = 0.0
B = 1.0
C = [0.0, 4.0, 5.0, 10.0, 0.0]
! Simple where construct use
where (C/=0)
A=B/C
elsewhere
A=0.0
end
! Named where construct
Block: where (C/=0)
A=B/C
elsewhere
A=0.0
end where Block