06 制御命令

プログラミングでは,一連の動作を条件分岐や繰り返しによって制御することがよくあります。

条件分岐:if(条件,処理1,処理2)

条件が成り立てば処理1を,そうでなければ処理2を行います。

ここで,「条件が成り立つ」とは,その条件が真偽値の真(true) であるということです。

たとえば「1==1」は「1と1が等しい」という条件で,等しいわけですから true になります。

「1==0」は「1と0が等しい」で,これは false になります。

言い換えると,条件が true なら処理1,falseなら処理2を実行するということです。

このことは,条件が「AND」や「OR」というブール演算になっているときにしっかり理解しておく必要があります。

処理2は省略することも可能です。

ところで,Cindyscriptでは if() は関数です。ということは「戻り値」があります。戻り値はそれぞれの実行結果です。処理2が省略されて条件が false のときは,未定義値 ___ (アンダーバー3つ)が返されます。

トリガー:trigger(条件,処理)

if()と似ていますが,動的に実行されます。動的というのは,条件が false から true に変わったとき実行するのです。プログラムを Draw スロットに置くと,描画面上で何か変化が置きたときこのスロットのプログラムが実行されます。ここに,if()とtrigger()を置いたときの動作の違いを次の例で見てみましょう。

・if()の場合:if(|A,B|<3,print("OK"));

Aの近くでBを動かすとそのたびにコンソールにOKが表示されます。

・trigger()の場合:trigger(|A,B|<3,println("OK"));

AとBの距離が3より小さくなるとOKが表示されますが,Aの近くでBを動かしても true のままなので OKは表示されません。いったんBを遠ざけて,またAの近くに持ってくると,距離が3より小さくなった瞬間だけOKが表示されます。

繰り返し:while(条件,処理)

条件が成り立つ間,処理を繰り返します。戻り値は最後に評価した結果です。

繰り返しループを抜けるには,条件が false にならなければなりません。条件が false にならないような状況だと,無限に処理を繰り返します。結果的にCinderellaを終了できなくなり,強制終了するしかなくなりますので要注意です。

例:

s=1;

while(s<=5,

draw([s,s]);

s=s+1;

);

5個の点列 (1,1),(2,2(3,3),(4,4),(5,5) を表示します。

このとき,s=s+1 を忘れるとループから抜けられなくなります。

また,最初の s=1 がないと,sは未定義値なので条件判断の結果がどうなるか保証ができません。場合によっては無限ループになります。

繰り返し:repeat(数,処理)

数に示した回数だけ繰り返します。他の言語の for 〜 ループに相当します。

回数のカウンタは,実行変数という変数に入ります。実行変数は # で表されます。

例:repeat(5,draw([#,#])); : 点列 (1,1),(2,2),(3,3),(4,4),(5,5) を表示します。

カウンタを変数として使いたい場合は repeat(回数,変数,処理)の形で指定します。

例:repeat(5,s,draw([s,s])); : 上と同じ動作です。

repeat() は入れ子(ネスト)にすることができます。その場合はカウンタは明示的に名前を付ける方がよいでしょう。

例:4×4の格子点を表示する。

repeat(4,s,

repeat(4,t,

draw([s,t]);

);

);

なお,コードを書くときは,このように字下げをすると構造が読みやすくなります。

repeat() にはいろいろなオプションがあります。オプションは -> (ハイフン・不等号)を使って記述します。

・start:カウンタの始めの値を設定 : start->2 とすると,カウンタは 2,3,4・・となります。

・stop:カウンタの終わりの値を設定。終わりの値から逆算して始めます。 : stop->3 とすると,・・・,3

・step:カウンタの間隔を設定します。: step->2 とすると,1,3,5,・・・ となります。小数も可です。

これらのオプションは同時に使うことができます。

例:repeat(6,start->3,stop->4,step->0.4,print(#+" "));

とすると,6回の指定があっても実際には3つの値 3,3.4,3.8 しか表示しません。

この他,リストを使った繰り返し処理がありますが,これはリストのところで説明します.