【FlowScript講座】第6回 Repeat


[管理者]
KHCmaster
今回は新たに反復処理について学ぼうと思います。

まず、反復処理を行うためのノードは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について行う予定です。
作成日時:2013-06-16 18:21:23 更新日時:2013-06-16 19:25:23
FlowScript講座をフォーラムを使って開講中です。