比較、分岐、くりかえしなどの制御命令

↑目次に戻る

@ラベル名

プログラムやデータの位置を示す名前

・GOTOなどで行番号を直接指定することはできない
・分岐先やデータ位置はすべてラベルで指定
・@で始まる英数字とアンダースコア(_)

@MAINLOOP

GOTO @ラベル

強制分岐

引数

@ラベル

・ジャンプ先のラベル名
・ラベル名をでくくったラベル文字列(文字列変数も可)
・1:
ラベル名 の形式でプログラムSLOT指定も可能
・あらかじめUSE命令で対象SLOTを使用可能にしておくこと

GOTO @MAIN
JP$="@MAIN":GOTO JP$

GOSUB @ラベル

サブルーチンの呼び出し

引数

@ラベル

・呼び出すサブルーチンのラベル名
・ラベル名をでくくったラベル文字列(文字列変数も可)
・1:
ラベル名 の形式でプログラムSLOT指定も可能
・あらかじめUSE命令で対象SLOTを使用可能にしておくこと

GOSUB "@SUB" 

RETURN

サブルーチンから呼び出し元へ復帰
RETURN

RETURN 値

サブルーチンから値を返しつつ呼び出し元へ復帰(関数型として定義されたDEF命令内で値を戻す場合に利用)
DEF CALC(A,B)
 RETURN A*B
END
PRINT CALC(2,3)

OUT

複数の値を返すDEF命令の複数の出力先を指定

・複数の値を返すDEF命令の宣言で利用
・複数の値を返す組み込み命令でも利用される

DEF SUB A OUT D,M
 D=A DIV 10
 M=A MOD 10
END
SUB 34 OUT DV,ML
PRINT DV,ML

ON 制御変数 GOTO ラベル0, ラベル1…

制御変数の値に合わせてラベル行に分岐

引数

制御変数

分岐するための値が入った変数(0~)

@ラベル0

制御変数が0のときのジャンプ先

@ラベル1

制御変数が1のときのジャンプ先
 :
・必要な数だけ飛び先を用意する
・ON~GOTOのラベルには、ラベル文字列は使えない

ON IDX GOTO @JMP_A,@JMP_B
PRINT OVER:END
@JMP_A
PRINT "IDX=0":END
@JMP_B
PRINT "IDX=1":END

ON 制御変数 GOTO ラベル0, ラベル1…

制御変数の値に合わせてラベル行に分岐

引数

制御変数

分岐するための値が入った変数(0~)

@ラベル0

制御変数が0のときのジャンプ先

@ラベル1

制御変数が1のときのジャンプ先
 :

・必要な数だけ飛び先を用意する
・ON~GOTOのラベルには、ラベル文字列は使えない

ON IDX GOTO @JMP_A,@JMP_B
PRINT OVER:END
@JMP_A
PRINT "IDX=0":END
@JMP_B
PRINT "IDX=1":END

ON 制御変数 GOSUB ラベル0, ラベル1…

制御変数の値に合わせてサブルーチン呼び出し

引数

制御変数

分岐するための値が入った変数(0~)

@ラベル0

制御変数が0のときのサブルーチン

@ラベル1

制御変数が1のときのサブルーチン
 :

・必要な数だけ飛び先を用意する
・ON~GOSUBのラベルには、ラベル文字列は使えない

ON IDX GOSUB @SUB_A,@SUB_B
PRINT EXIT:END
@SUB_A
PRINT "IDX=0":RETURN
@SUB_B
PRINT "IDX=1":RETURN

ON 制御変数 GOSUB ラベル0, ラベル1…

制御変数の値に合わせてサブルーチン呼び出し

引数

制御変数

分岐するための値が入った変数(0~)

@ラベル0

制御変数が0のときのサブルーチン

@ラベル1

制御変数が1のときのサブルーチン
 :

・必要な数だけ飛び先を用意する
・ON~GOSUBのラベルには、ラベル文字列は使えない

ON IDX GOSUB @SUB_A,@SUB_B
PRINT EXIT:END
@SUB_A
PRINT "IDX=0":RETURN
@SUB_B
PRINT "IDX=1":RETURN

IF 条件式 THEN 成立時処理1 ELSE 不成立時処理2 [ENDIF]

条件成立時に処理1を、不成立時に処理2を実行

・THENやELSE直後のGOTOは、GOTOを省略可能
・処理が複数行にわたるときはENDIFを使用

条件式

比較演算子

== 等しい
!= 等しくない
> より大きい
< より小さい
>= 以上
<= 以下

論理演算子(複数条件の比較用)

条件1 AND 条件2 同時に満たす
条件1 && 条件2 同時に満たす
条件1 OR 条件2 いずれかを満たす
条件1 || 条件2 いずれかを満たす
IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 ELSE PRINT DATE$
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

THEN 処理

IFによる条件が成立した時の制御先
IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 'GOTOの省略
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

ELSE 処理

IFによる条件が成立しない時の制御先
IF A==1 THEN PRINT OK
IF A>1 THEN @JMP1 ELSE PRINT DATE$
IF A==1 THEN
 PRINT "オメデトウ":BEEP 2
ELSE
 PRINT "ザンネン" 
ENDIF
@JMP1
END

ELSEIF 条件式 THEN 成立時処理 ENDIF

IFによる条件不成立時の追加条件判定

・不成立時に続けて条件判断を行う場合に利用
・条件判定については、IFの説明をご覧ください

IF A==1 THEN
 PRINT "オメデトウ":BEEP 0
ELSEIF A==2 THEN 
 PRINT "ザンネン" 
ELSE IF A==3 THEN 
 PRINT "まあまあ" 
ENDIF ' ELSE IF の場合は必要
ENDIF

ENDIF

IFによる制御切替後処理が複数行になる場合の終了
IF A==0 THEN
 PRINT "A=0" 
ENDIF

IF 条件式 GOTO @ラベル [ELSE 不成立時処理]

条件が成立時@ラベルに分岐

ラベルに文字列を使う場合の注意事項

・ラベルにはラベル文字列も使用可能
・ELSE直後でのGOTO省略時に文字列は使えない

× IF A==0 GOTO @LABEL1 ELSE @LABEL2
○ IF A==0 GOTO @LABEL1 ELSE @LABEL2
○ IF A==0 GOTO @LABEL1 ELSE GOTO @LABEL2

IF A==1 GOTO @MAIN
IF X<0 GOTO @JMP1 ELSE PRINT A$
IF Y==5 GOTO @JMP1 ELSE @JMP2
@JMP1
PRINT "@JMP1" 
@JMP2
PRINT "@JMP2" 
END

FOR ループ変数=初期値 TO 終了値 [STEP 増分]

処理を指定回数繰り返す

・処理の最後にはNEXT命令を置く
・条件が満たされない場合、1回も実行されないことがある

引数

ループ変数

ループ回数をカウントする変数(1ループごとに増分が加算)

初期値

ループ開始時のループ変数の値または式

TO 終了値

ループ終了時のループ変数の値または式

STEP 増分

・ループ終わりにループ変数に加算する増分(省略時=1)
・増分が小数の時、演算誤差で意図した回数にならない可能性あり

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

TO 終了値

ループ数の終わりの値指定

・FOR~NEXTについてはFOR命令の説明をご覧ください

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

STEP 増分

FORループ数の増分の値指定

・FOR~NEXTについてはFOR命令の説明をご覧ください

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

NEXT [ 制御変数 ]

FORループの終わりを示す命令

・FOR~NEXTについてはFOR命令の説明をご覧ください
・FORループ内のIFでNEXTを使うのは非推奨
・強制的に次のループへ進める時はCONTINUEを使用
・ループの強制終了はBREAKを使用

引数

制御変数

・制御変数は記述しても無視され単なるNEXTと同じ働き
・NEXT J,I のような記述は不可

FOR I=0 TO 9 STEP 2
 PRINT I;",";
NEXT

WHILE 条件式

条件が成立している間、WENDまでをくりかえす

・不成立時、またはBREAK命令でループを抜ける

条件式

IFと同等の条件式を書くことができます

== 等しい
!= 等しくない
> より大きい
< より小さい
>= 以上
<= 以下

論理演算子(複数条件の比較用)

条件1 AND 条件2 同時に満たす
条件1 && 条件2 同時に満たす
条件1 OR 条件2 いずれかを満たす
条件1 || 条件2 いずれかを満たす
A=0:B=4
WHILE A<B
 A=A+1
WEND

WEND

WHILEループの終わりを示す命令
A=0:B=4
WHILE A<B
 A=A+1
WEND

REPEAT

REPEATループの開始命令

・ループの終わりにUNTIL命令と条件式を置く
・WHILE命令とは異なり先に処理を実行してから条件判断
・成立時、またはBREAK命令でループを抜ける

A=0:B=4
REPEAT
 A=A+1
UNTIL A>B

UNTIL 条件式

条件が満たされるまでREPEATからをくりかえす

・ループの始まりにREPEAT命令を置く
・WHILE命令とは異なり先に処理を実行してから条件判断
・成立時、またはBREAK命令でループを抜ける

条件式

IFと同等の条件式を書くことができます

比較演算子

== 等しい
!= 等しくない
> より大きい
< より小さい
>= 以上
<= 以下

論理演算子(複数条件の比較用)

条件1 AND 条件2 同時に満たす
条件1 && 条件2 同時に満たす
条件1 OR 条件2 いずれかを満たす
条件1 || 条件2 いずれかを満たす
A=0:B=4
REPEAT
 A=A+1
UNTIL A<B

CONTINUE

ループを強制的に次に進める

・FOR~NEXT、WHILE~WEND、REPEAT~UNTIL内で使用

FOR I=0 TO 9
 IF I==1 THEN CONTINUE
 IF I==7 THEN BREAK
 PRINT I;",";
NEXT

BREAK

ループから強制的に抜ける

・FOR~NEXT、WHILE~WEND、REPEAT~UNTIL内で使用

FOR I=0 TO 9
 IF I==1 THEN CONTINUE
 IF I==7 THEN BREAK
 PRINT I;",";
NEXT

END

プログラムを終了
END

END

ユーザー関数、ユーザー命令のDEF定義を終了
DEF FUNC
 PRINT FUNC
END

STOP

実行中のプログラムを中断

・中断したプログラムSLOT:行番号が表示される
・CONT命令で続行可能(ただし状況によっては続行できない)

STOP

↑目次に戻る