3章:命令と入出力
3.2 制御文
ここでは、制御文「GO TO」、「IF」、「CASE」、「DO」について説明する。
3.2.1 GOTO文
GO TO文はプログラム文を飛び越えて先に進むまたは、前に戻る命令であり、以下のように書く。
GO TO 文番号
または
GOTO 文番号
(例)
IF (X>100) GO TO 50
実行文
┇
50 END
3.2.2 IF文
IF文は、指定した条件式が成立か不成立かによって文のならびを実行または無視する処理を行う命令である。
![IF文の流れ](img/chap3-01.gif)
IF文の形
IF文の基本形は以下のように書く。
IF(条件式)THEN
![ブロック1](img/block01.gif)
END IF
条件式が成立した場合はブロック1の処理を行い、不成立の場合は処理を終了する。
また条件によって、実行する文が変わる場合は以下のように書く。
IF(条件式)THEN
![ブロック1](img/block01.gif)
ELSE
![ブロック2](img/block02.gif)
END IF
条件式が成立した場合はブロック1の処理を行い、不成立の場合はブロック2の処理が行われる。
「ELSE」を省略して以下のように書くこともできる。
IF(条件式)THEN
![](img/block.gif)
END IF
条件式が成立した場合はブロック内の処理が実行され、不成立の場合は何もしない。
条件式が成立した場合の実行文が1文だけの場合は、以下のように書くことができる。
IF(条件式) 成立時に行う実行文
■条件文
条件式は、関係式か論理式で書く。
関係式とは関係演算子で2つの数値式を結んだものであり、論理式とは2つ以上の関係式を論理演算子で結んだものである。
式の条件が成立した場合は「真」(true、正しい)、不成立の場合は「偽」(false、正しくない)となる。
(関係演算子の詳細は2.3.2の■比較の表を参照のこと。論理演算子の詳細は2.2.3の■論理型の表を参照のこと。)
(関係式の例)A≧1.0 の場合
A.GE.1.0
または
A>=1.0
と書く。
(論理式の例)0<A<10
A>0.AND.A<10
または
A.GT.0.AND.A.LT.10
と書く。
■ブロック
実行文の集まりのことで、何行でも書くことができる。
IF文はいくつでも続けることができる。
また、ブロックの中にIF文を書くこともできる。その場合は同じブロック内にEND IFを書かなければならない。
演算の優先順位
IF文における演算の優先順位は、次のようになる。
①数値演算 → ②関係演算 → ③論理演算 → ④.EQV.、.NEQV.
論理演算の演算規則は以下のとおりである。
A | B | .NOT.A | A.AND.B | A.OR.B | A.EQV.B | A.NEQV.B |
---|---|---|---|---|---|---|
真 | 真 | 偽 | 真 | 真 | 真 | 偽 |
真 | 偽 | 偽 | 偽 | 真 | 偽 | 真 |
偽 | 真 | 真 | 偽 | 真 | 偽 | 真 |
偽 | 偽 | 真 | 偽 | 偽 | 真 | 偽 |
名前付きIF文
IF文には、必要に応じて名前を付けることができる。複雑なIF文や長いIF文には、名前を付けるとプログラムが見やすくなる。
名前を付ける場合は以下のように書く。
名前: IF(条件式) THEN
![ブロック](img/block.gif)
END IF 名前
IF THEN文の先頭に名前を付けた場合は、対応するEND IF文に同じ名前を付けなければならない。
IF文の例
西暦X年を読み込み、うるう年か平年かを調べ、結果を出力するプログラム
(うるう年は400で割り切れるか、4で割り切れるが100では割り切れない年のこと)
INTEGER : : X
READ *,X
IF(MOD(X,400).EQ.0) THEN
PRINT*,’うるう年’
ELSE IF(MOD(X,100).EQ.0) THEN
PRINT*,’平年’
ELSE IF(MOD(X,4).EQ.0) THEN
PRINT*,’うるう年’
ELSE
PRINT*,’平年’
END IF
END
3.2.3 CASE文
CASE文は、1つの条件式について複数の条件分岐がある場合に使う。
![](img/chap3-02.gif)
基本形は以下のように書く。
SELECT CASE(条件式)
CASE(値1)
![ブロック1](img/block01.gif)
CASE(値2)
![ブロック2](img/block02.gif)
CASE DEFAULT
![ブロック3](img/block03.gif)
END SELECT
条件式の値が「値1」ならばブロック1の処理を行い、「値2」ならばブロック2の処理が行われる。それ以外の場合はブロック3の処理を行う。
「CASE DEFAULT」は省略することもできる。
■条件式
条件式は、整数式、文字式、論理式のいずれかで書く。
実数式(実数型)は使用することができない。
■値
値は、整数型、文字型、論理型で書く。
値を複数指定する時は「,」(カンマ)、値の範囲を指定する時は「:」(コロン)を使用する。
(整数型の例)A=1の場合
CASE(1)
(文字型の例)A=FまたはMの場合
CASE(”F”,”M”)
(論理型の例)A=真の場合
CASE(.TRUE.)
A=偽の場合
CASE(.FALSE.)
CASE文はいくつでも続けることができる。
「SELECT CASE」は「SELECTCASE」、「END SELECT」は「ENDSELECT」と書くこともできる。
名前付きCASE文
CASE文は、IF文と同様、必要に応じて名前を付けることができる。
CASE文の先頭に名前を付けた場合は、対応するEND SELECT文に同じ名前を付けなければならない。
(例)固体の重量Xを読み込み、固体のサイズとサイズごとの個数を出力するプログラム
(条件)
重量の範囲は0≦X≦250
X≦100 は S
101≦X≦150 は M
151≦X≦200 は L
それ以外は LL
INTEGER : : X,S1,S2,S3,S4
X=0,S1=0,S2=0,S3=0,S4=0
1 READ *,X
IF(X<0.OR.X>250) GO TO 10
SELECT CASE(X)
CASE(:100)
PRINT *,’S’
S1=S1+1
CASE(101:150)
PRINT *,’M’
S2=S2+1
CASE(151:200)
PRINT *,’L’
S3=S3+1
CASE DEFAULT
PRINT *,’LL’
S4=S4+1
END SELECT
GO TO 1
10 PRINT *,’S=’,S1,’M=’,S2,’L=’,S3,’LL=’,S4
END
3.2.4 DO文
DO文は、同じ処理や操作を繰り返し行う命令である。
DO文にはカウンタ制御DOループと、汎用DOループがある。
カウンタ制御DOループ
ループ(繰り返し)回数を指定する場合に使用する。
カウンタ制御DOループは以下のように書く。
DO 変数=初期値,終値,増分値
![ブロック](img/block.gif)
END DO
DO文が実行されると、変数に初期値が代入され、終値に達するまで初期値に増分値を加算しながらブロックの処理を行い、終値に達したらループ処理を終わる。
終値に達する条件は以下のとおりである。
- 増分値が正の場合は、変数>終値
- 増分値が負の場合は、変数<終値
ブロック内の処理実行時にGO TO文などでブロック外に出ることはできるが、ブロック外からブロック内に入ることはできない。
■DO変数
整数型で指定する。ブロック内の処理実行時にDO文の変数の値を変えることはできない。
■初期値、終値
整数式で指定する。
■増分値
増分値に0は指定できない。1を指定する時は増分値を省略することができる。
汎用DOループ
汎用DOループは、ループ回数が不定の場合に使用するもので、基本形とDO WHILE文がある。
基本形は以下のように書く。
DO
![ブロック1](img/block01.gif)
IF(条件式) EXIT
![ブロック2](img/block02.gif)
END DO
条件式が成立するまで、DO~END DO内の処理を繰り返す。
- 条件式は、関係式か論理式で書く。
- ブロック1やブロック2は省略することもできる。
- 条件式が成立しないと永久ループになってしまうので注意する。
DO WHILE文は以下のように書く。
DO WHILE(条件式)
![ブロック](img/block.gif)
END DO
条件式が成立している間、ブロックの処理を繰り返す。成立しなくなったらループ処理を終わる。
多重DO
多重DOとはDOループの中にDOループを入れることである。
多重DOにする場合は、外側のDOループの中に内側のDOループが完全に入った「入れ子」になっていなくてはならない。
DがDO文、LがEND DOの場合
![](img/chap3-03.gif)
名前付きDO文
DO文には、必要に応じて名前を付けることができる。
DO文の先頭に名前を付けた場合は、対応するDO文に同じ名前を付けなければならない。
(例)1から100までの整数の和を計算し、出力する
INTEGER : : X,W=0
DO X=1,100
W=W+X
END DO
PRINT *,W
END