今回は新たに反復処理について学ぼうと思います。
まず、反復処理を行うためのノードはRepeat以下にあります。
・
Repeat.For・
Repeat.While・
Repeat.DoWhile・
Repeat.Foreachの4つになります。現状
Repeat.Foreachに関してはArrayListに関する説明をしていないので
ArrayListの説明をしたときに合わせて説明します。今回はそれ以外の3つについてみて行きます。
まず、なぜ反復処理を行うのかということですが、例えば
「コンソールに1~1000までの数字を1行ずつ表示したい」
といったときに
Console.WriteLineを1000個用意して、一つずつ……
なんて馬鹿げたことを簡単に行うために用います。
従って、似たような処理がたくさんある場合にしか使えません。
今回は上で上げた
「コンソールに1~1000までの数字を1行ずつ表示したい」
を実装してみることにします。
まず、順番が入れ替わりますが
Repeat.Forから説明します。
Repeat.Forには3つのイベントあります、Init, Loop, LoopEndです。
さらにConditionというプロパティがあります。
これらがどう使われるかというと
①Initイベントが発生
②Conditionを評価。Falseなら終了
③Loopイベントが発生
④LoopEndイベントが発生
⑤②に戻る
となっています。覚えましょう。
今回だと
①[今何回目のループかを覚えておく変数]を0に初期化
②[今何回目のループかを覚えておく変数]が1000より小さいならTrue、そうでなければFalse
③[今何回目のループかを覚えておく変数]+1を
Console.WriteLineで出力
④[今何回目のループかを覚えておく変数]を+1する
⑤②に戻る
となります。[今何回目のループかを覚えておく変数]というのが今回のもう一つのキーワードです。
変数というものが今まで一度も出てこなかったのですが、FlowScriptにもあります。
Scope.SetValue,
Scope.GetValueで変数についての処理を行います。
Scope.SetValueはValueNameという変数にValueを設定するノードです。
Scope.GetValueはValueNameという変数に設定されている値を取得するノードです。
とりあえず、ループ変数を0に初期化するところを書くと
となります。
ValueNameにiという名前を使用していますが、これはプログラミングにおける慣例でiterationの頭文字みたいなものです。
Int32.Valueは整数の値のノードです。デフォルトで0なのでプロパティに0を設定する必要はありません。
さらに反復処理の部分を書くと
となります。+1して出力しないと1~1000にならないので注意です。(ノードの共通化を行っています。)
最後に反復の継続条件であるConditionには
Int32.Lessを使用します。これはA<BならTrue、そうでないならFalseを返すノードです。
今回はBに1000を設定します。
これで終わりです。
動かしてみると1~1000まで出力されましたか?
コンソールの設定によっては行数が1000もないので最初のほうの数字は切れているかもしれません。
次に、
Repeat.Whileですが
Repeat.ForからInitとLoopEndをなくしたものになります。
①Conditionを評価。Falseなら終了
②Loopイベントが発生
③①に戻る
ですので、
Logic.Sequentialを使うことで
Repeat.Forと同一にすることができます。(while.fsml)
もう一つ、
Repeat.DoWhileですが、これは実行順序が
Repeat.Whileとは異なります。
①Loopイベントが発生
②Conditionを評価。Falseなら終了
③①に戻る
ですので、doWhile.fsmlの
Int32.LessのBを0に変えると、Whileでは何も表示されないのに対して1と表示されて終わるのを確認できると思います。
今回のまとめですが
・反復処理には3つある
・
Scope.SetValue,
Scope.GetValueで変数を設定、取得できる
・Int32.Lessで小さいかどうかを調べることができる
となっています。
今回の講座に関する質問はこのスレッドで受け付けています。
次回はArrayListについて行う予定です。