M1000まとめサイト
OPL:制御文
最終更新:
匿名ユーザー
-
view
<<OPLで開発
制御文
プログラムの実行中に処理を分岐させたり、処理を繰り返させたりするのが制御文です。制御文には「条件分岐」「無条件分岐(ジャンプ)」「繰り返し(ループ)」があります。あと、実行中のエラーに対応する為の「エラー制御」があります。
条件分岐
条件分岐には「IF文(IF...ENDIF(ELSE&ELSEIF)コマンド)」があります。
「IF文」は条件が「真(True)」の時のみ実行されます。下記のサンプルでは条件Aが満たされると(コード1)が実行されます。条件Aが満たされないと何も実行しません。
IF 条件A (コード1) ENDIF
なおIF文内に「ELSE」と「ELSEIF」を加える事によって、条件が「偽(False)」の時に実行する処理を加える事もできます。
「ELSE」の次の行には「IF文の条件式が満たされない時に実行したいコード」を記述します。下記のサンプルでは条件Aが満たされると(コード1)が、満たされないと(コード2)が実行されます。
「ELSE」の次の行には「IF文の条件式が満たされない時に実行したいコード」を記述します。下記のサンプルでは条件Aが満たされると(コード1)が、満たされないと(コード2)が実行されます。
IF 条件A (コード1) ELSE (コード2) ENDIF
「ELSEIF」はIF文で偽(False)の時に実行され、更に条件によって処理を分岐させます。「ELSEIF」はIF文の入れ子による煩雑さを緩和する為に使われます。なお、以下のサンプルは同じ動きをします。
IF 条件A (コード1) ELSE IF 条件B (コード2) ENDIF ENDIF
IF 条件A (コード1) ELSEIF 条件B (コード2) ENDIF
無条件分岐(ジャンプ)
IF文と違い、実行されると指定したラベルへ移動(ジャンプ)するのが無条件分岐です。無条件分岐には「GOTO文(GOTOコマンド)」と「VECTOR文(VECTOR...ENDVコマンド)」があります。
「GOTO文」は実行すると指定されたラベルへジャンプします。ラベルはラベル名の後ろに「コロンを2つ(::)付けて」指定します。(GOTOコマンドでラベル名を指定する時はコロンを省略する事も可能です。)
PROC main: GOTO testlabel:: PRINT "ここは表示されない"
test_label:: PRINT "ここは表示する" ENDP
「VECTOR文」は「ラベル」を複数設定し、VECTORコマンドで指定された番号のラベルへジャンプする事ができます。ラベルはカンマ(,)で区切って指定します。
VECTOR i% ラベル1,ラベル2,ラベル3,...ラベルn ENDV
PROC main: LOCAL i% i% = 2 VECTOR i% label1,label2,label3 ENDV
label1:: PRINT "ここは表示されない" label2:: PRINT "ここは表示される" label3:: PRINT "ここも表示される" ENDP
※近年のプログラミングの流れとして、基本的にラベルによるジャンプは敬遠される傾向にあるので、GOTO文及びVECTOR文は使用を控えた方が良いと思われます。ただ、限定的な用途として後述のGOTOコマンドとの組み合わせでC言語等の「Switch-Case文」のような使い方をする場合は便利かもしれません。
繰り返し(ループ処理)
繰り返し(ループ)には「WHILE文(WHILE...ENDWHコマンド)」と「DO-UNTIL文(DO...UNTILコマンド)」があります。ループ処理は条件を正しく設定しないと「無限ループ」に陥る可能性があるので注意して下さい。
「WHILE文」は「条件を満たしている間」は繰り返し処理を継続します。条件が満たされなくなるとループ処理を終了します。条件の判定は最初に行われ、条件が満たされていないと1度も実行せずに次の処理へ移ります。以下のサンプルは0から9までを画面に表示します。
PROC main: LOCAL i% i% = 0 WHILE i%<10 PRINT i% i% = i% + 1 ENDWH ENDP
「DO-UNTIL文」は条件を満たすまで処理を繰り返します。条件の判定はループ処理の最後に行うので、「必ず1回は実行したい処理」に良く使われます。以下のサンプルは上記サンプルと同様の処理を行います。
PROC main: LOCAL i% i% = 0 DO PRINT i% i% = i% + 1 UNTIL i% = 9 ENDP
ループ処理に対する操作として「BREAKコマンド」と「CONTINUEコマンド」があります。
「BREAKコマンド」は実行するとループ処理を終了させ、その次の処理に移ります。以下のサンプルは、0から5までしか表示しません。
「BREAKコマンド」は実行するとループ処理を終了させ、その次の処理に移ります。以下のサンプルは、0から5までしか表示しません。
PROC main: LOCAL i% i% = 0 WHILE i%<10 PRINT i% %i = i% + 1 IF i% = 5 PRINT "ループを抜けます" BREAK ENDIF ENDWH ENDP
「CONTINUEコマンド」は実行するとループ処理の先頭に戻ります。以下のサンプルは、10回ループしますが、6以上の数は表示しません。
PROC main: LOCAL i% i% = 0 WHILE i%<10 i% = i% + 1 IF 5 < i% REM [WHILE]の行まで戻る CONTINUE ENDIF PRINT i% ENDWH ENDP
エラー処理
OPLではエラー処理をする為のコマンドも用意されています。
※詳細は以下の各コマンドを参照して下さい。(書きかけ)
真と偽
OPLでは真(True)と偽(False)はそれぞれ「0以外(-1)」と「0」として扱われます。ですので、整数と直接比較するようなコードは避けた方が無難です。