今回は前回学んだ条件分岐と前々回学んだ数値計算を組み合わせて電卓(のようなもの)を作ろうと思います。
まず、仕様ですが
・最初に+, -, *, /のいずれかを入力してもらう(+は足し算、-は引き算、*は掛け算、/は割り算)
・次に一つ目の引数を入力してもらう
・次に二つ目の引数を入力してもらう
・最後に結果を出力する
という感じの簡単なものを作成します。
数値のデータの種類としてInt32, Float, Doubleがありますが、とりあえずInt32を使い整数の電卓とします。
今までの学んだ成果を結集させると、おそらくここまでできるでしょう。
足し算の部分のみ作成していますが、最後の計算結果を出力すれば終わりという部分です。
現状、
Console.ReadLineのValueを
Int32.Addに繋ぐことはできません。
なぜ入力された引数を
Int32.Addに繋ぐことができないのでしょうか?
それは、Console.ReadLineで読み取った情報は数値とは限らないデータのためです(正しく言うと文字列という種類)
よって、文字列というデータの種類から数値のデータへと変換する必要があります。
そこで使用するのが
Int32.Parseです。
Int32.ParseはAというプロパティを数値に変換するノードです。変換がうまくいくとSuccessイベントが発生し、
失敗するとFailedイベントが発生します。変換に成功した場合は、Valueプロパティから変換したデータを取得できます。
というわけでその部分を作成するとこんな感じになります。
一つ目の引数の変換に失敗したら、非数値ですというメッセージを表示して終わります。
成功した場合は、二つ目の引数の変換を行い、失敗したら非数値ですというメッセージを表示して終わります。
成功した場合は、変換したデータを使い、
Int32.Addを使い足し算の結果を出力します。
で、足し算の部分ができたので、後はこの部分をコピーしてCtrl+Shift+Vをつかってリンクごとノードを貼り付けて
Int32.Addを
Int32.Subtract,
Int32.Multiply,
Int32.Devideに変え、接続を適切に行うと完成です。(first.fsml)
ちゃんと動いていることが確認できましたか?
これで今回は終わりではありません。
もう一度完成したスクリプトをよく見てください。
なんか汚くないですか?見た目もごちゃごちゃしていてよくわからないことになっています。
その理由としては、同じ処理をする部分が複数あるからです。
これを一つにまとめるとより見た目が良くなりそうです。
一つにまとめられそうな部分は「引数を入力してもらって数値に変換する部分」です。
とはいうものの、FlowScriptのイベントには一つのイベントしか繋ぐことができません。
Logic.SequentialのInに複数繋ぐことができたら…
ということを実現するノードが
Logic.Anyです。
Logic.AnyはIn0~In5までのいずれかのイベントが使用されたらOutイベントが発生するというものです。
それを踏まえると以下のように変えることができます。
後は、2回目の引数の
Int32.Parseが成功したら、
最初のオペレータ(+, -, *, /)に対して
Logic.Ifで分岐を複数作って
Console.WriteLineで終わりです。
ですが、今回はもう一つの条件分岐を使用して少しだけ使用するノードを減らします。
今回、最後に結果を出力するという処理は同じなので、出力する値を条件分岐で変更してみることで実現できます。
データの分岐を行うには
Logic.IfTernaryというノードを使用します。
Conditionが真の場合にA、そうでない場合にはBという値をValueに返すノードです。
これを使用すると以下のように記述することができます。
最初に比べてかなりシンプルになりましたね。
この調子でシンプルなスクリプト作成を心がけていきましょう。(second.fsml)
今回のまとめですが
・Int32.Parseで文字列から整数への変換ができる
・Logic.Anyで共通する処理をまとめることができる
・Logic.IfTernaryでデータに対する条件分岐を行える
となっています。
今回の講座に関する質問はこのスレッドで受け付けています。
次回は反復処理について行う予定です。