エムノベファンの皆様、こんばんは。 MTL研究室の桜花です。
今夜は「条件分岐」について、説明いたします♪
条件分岐とは、「ある条件を基に、処理分け」することをさします。
この講座でも、ちょこちょこ出てきているので、おおよそご理解いただいているとは思いますが、
今夜は、それを整理したいと思います。
参考ページ:
(■ 第二十夜 メニューについて ■ 第二十一夜 変数について)
■ 単純分岐
ある条件が成立した時に、指定ラベル位置に処理をジャンプするときに使います。
◆ 構文
if 変数 比較演算子 値 goto #ラベル名
比較演算子は、以下の記述が可能です。
■ 比較演算子
名称 |
演算子 |
式 |
意味 |
等価比較 |
== |
変数==値 の場合 |
Aは、Bである |
不等価比較 |
!= |
変数!=値 の場合 |
Aは、Bではない |
以下比較 |
<= |
変数<=値 の場合 |
Aは、B以下である |
以上比較 |
>= |
変数>=値 の場合 |
Aは、B以上である |
小比較 |
< |
変数<値 の場合 |
Aは、Bより小さい |
大比較 |
> |
変数>値 の場合 |
Aは、Bより大きい |
※ 等価比較は「==」と2つの「=」を重ねます。(C言語ぽい)
では、前夜のストーリーで考えてみます。
------------------------------------------------------------------------
dim KENJYU = 0 ;拳銃変数を未発見で定義。
dim SHIMON = 0 ;指紋変数を未発見で定義。
・
・
・
;
;捜査処理
;
#SOUSA
捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5
if KENJYU == 0 goto #SOUSA ; 拳銃は未発見であれば、#SOUSAに戻る。
#SHIMON
指紋検証処理1
指紋検証処理2
指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
指紋検証処理4
指紋検証処理5
if SHIMON == 0 goto #SHIMON ; 指紋が一致していなければ、#SHIMONに戻る。
逮捕処理1
逮捕処理2
逮捕処理3
逮捕処理4
逮捕処理5
・・・となります。
ある条件をクリアーしないと、ストーリーが進まない場合は、この単純分岐を使うことで対応できそうです。
■ if文に処理を閉じ込める単純分岐
単純分岐は、GOTO文を使った方法以外に、if文の中に処理を閉じ込めることもできます。
◆ 構文
if 変数 比較演算子 値 then
処理1
処理2
処理3
処理4
処理5
endif
↑の意味は、「変数と値を比較して成立したならば、処理1〜5を実行する。」です。
こちらも、前夜のストーリーで考えてみます。
------------------------------------------------------------------------
dim KENJYU = 0 ;拳銃変数を未発見で定義。
dim SHIMON = 0 ;指紋変数を未発見で定義。
・
・
・
;
;捜査処理
;
#SOUSA
捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5
if KENJYU == 1 then ; 拳銃を発見した。
指紋検証処理1
指紋検証処理2
指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
指紋検証処理4
指紋検証処理5
if SHIMON == 1 then ; 指紋が一致した
逮捕処理1
逮捕処理2
逮捕処理3
逮捕処理4
逮捕処理5
end ; 逮捕して終了。エンディング
endif
endif
goto #SOUSA
・・・となります。
GOTO文を使った、単純分岐と比較してみていかがですか?
GOTO文が少なくなったぶん、処理がわかりやなっていませんか?
※ 厳密にいうと、上の2つのスクリプトは、実行結果が異なります。(あくまで、一例として捕らえてください。)
■ 2分分岐
単純分岐だけでも、プログラムを作ることができますが、GOTO文を多用してしまう傾向があるため、どうしてもスクリプトが読みにくくなります。
2分分岐は、この欠点をほんの少し(気持ち分?)だけ、補ってくれます。
◆ 構文
if 変数 比較演算子 値 then
処理A1
処理A2
処理A3
処理A4
処理A5
else
処理B1
処理B2
処理B3
処理B4
処理B5
endif
↑の意味は、「変数と値を比較して成立したならば、処理A1〜A5を実行する。
不成立の場合は、処理B1〜B5を実行する。」です。
2分分岐の最大の利点は、成立しなかった場合の処理を指定することができることです。
こちらも、前夜のストーリーで考えてみます。
------------------------------------------------------------------------
dim KENJYU = 0 ;拳銃変数を未発見で定義。
dim SHIMON = 0 ;指紋変数を未発見で定義。
・
・
・
;
;捜査処理
;
#SOUSA
捜査処理1
捜査処理2
捜査処理3 ;拳銃を発見したなら、KENJYU = 1(発見)にする。
捜査処理4
捜査処理5
if KENJYU == 0 then ; 拳銃を発見していない。
goto #SOUSA
else
指紋検証処理1
指紋検証処理2
指紋検証処理3 ;指紋が一致したなら、SHIMON = 1(発見)にする。
指紋検証処理4
指紋検証処理5
if SHIMON == 1 then ; 指紋が一致した
逮捕処理1
逮捕処理2
逮捕処理3
逮捕処理4
逮捕処理5
end ; 逮捕して終了。エンディング
endif
goto #SOUSA
endif
前夜と今夜の講座は、プログラマぽい発想が多くなっていますが、ご理解いただけたでしょうか?
■ 2分分岐の入れ子について
エムノベ(Ver 0.05)では、最大で4階層まで、実装可能です。
if x == 1 then
x == 1 の処理をする。
else
if x == 2 then
x == 2 の処理をする。
else
if x == 3 then
x == 3 の処理をする。
else
if x == 4 then
x == 4 の処理をする。
else
x == 1〜4ではない処理をする。
endif
endif
endif
endif
このような記述もできますが、入れ子はプログラム構造を理解しづらくする場合があります。
場合によっては、単純分岐を使った方がよいこともあります。
プログラマの方なら、「switch case」文を使えばよいじゃないか?とご指摘がありそうですが、
エムノベ(Ver 0.05)では、「switch case」文はサポートしていません(笑)
ひょっとしたら・・・
サポートするかもしれませんが、今のところは考えていません。
■ 編集後記
今夜は、条件分岐について、説明いたしました。
ストーリーの分岐は、条件分岐を使うことで対応ができます。
さて、次夜ですが、スクリプトに関するエラーについて説明したいと思います。
では、今宵はこのあたりで・・・しーゆ♪