D05 繰り返し
Cindyscriptでの繰り返し処理にはいくつかの方法があります。
基本はつぎの2つ。
repeat(回数,処理)
while(終了条件,処理)
repeat() では,回数のカウンタを使うこともできます。しかし,途中でループを抜けることはできません。
また,オプションとしていくつかの修飾子があります。
start->n カウンタの初期値をnにします。
stop->n 終了値を設定します。
step->n ステップ数を設定します。
while() は終了条件を満たすまで処理を繰り返すのですが,終了条件を間違えると無限ループに陥りますので,できるだけ避ける方がよいでしょう。どうしても使う場合は終了条件について十分注意が必要です。
Cindyscriptには,もう一つ,特殊な方法として整数のリストを使って繰り返し処理を行う方法があります。
forall(a..b,処理)
です。もともとは,forall(list,処理) で,リストのすべての要素に対して処理を行う関数です。
繰り返し回数が事前に決まっている繰り返し処理
例として、曲線y=x2上の、x座標が a から b までの整数値である点をプロットする関数を作成してみます。
paraplot(a,b):=(
repeat(b-a+1,s,start->a,
draw([s,s^2]);
);
);
b-a+1 が回数,s がカウンタで,カウンタの初期値を start->a で aにしています。
draw([x,y]) は座標(x,y)に点を打つ関数です。
条件を満たすとループを終了する繰り返し処理
数値のリスト num の要素を先頭から順に見ていき、その値 a が3以下であるときは、点 (a,a2) をプロットし、3を超えたら処理を終了するという処理です。
num=[0,1,2.5,3,4,2,5];
c=1;
while(num_c<=3,
x=num_c;
draw([x,x^2]);
c=c+1;
);
注意しなければいけないのは,c=c+1 を忘れると無限ループに陥ることです。
また,リスト num の中に3より大きな値がある前提ですので,そうでない場合はエラーになります。
whileを使わずに repeat にすれば無限ループの危険はなくなります。
フラグを1つ用意し,3より大きい数がでてきたらフラグを立てて,プロットをしないようにします。
num=[0,1,2.5,3,4,2,5];
flag=false;
repeat(length(num),
if(num_#<=3 & !flag,
x=num_#;
draw([x,x^2]),
flag=true;
);
);
ここで,#は,実行変数というもので, repeatのカウンタを表します。変数名を明示したい場合は
if(num_#<=3 & !flag,s,
として s を用います。
flag を立てなければ,3以下のものだけプロットするようになります。
この「flag」を立てる、という方法により,while より安全なループを形成できます。
ただし,「実行しなくなる」だけで,途中でループを抜けるわけではありません。