読者です 読者をやめる 読者になる 読者になる

エディトリアルデザイナーのアプリ制作日記

Unityで遊ぶ個人開発者のメモ書き

縦書きノベル制作日記 その9 式の評価

 今回は、なんでも自分でやれるものはやってみようの精神で、 式の評価にチャレンジ。といっても、ググったら即解決しちゃいました。括弧なしの四則演算ですが、わかりやすかったのが下のリンク。普段目にしている式をいったん逆ポーランド記法へ変換し、それを実際に演算する2ステップ方式です。

挿入記法から逆ポーランド記法への変換 【 無料でC#プログラミング実験室 】

逆ポーランド記法の数式の解を求める 【 無料でC#プログラミング実験室 】

 逆ポーランド記法なんて十数年ぶりに聞いた…Z80マシン語をいじくり回していた時以来です。とりあえず、ソースコードもあるし、利用できるものは利用させてもらうとします。括弧は使えればいいにこしたことはないですが、そこまで手をかける必要もない、余裕ができたら拡張すると心に決めて放置(おそらく永遠に…)。

 ただ今回比較演算子を使えるようにしなくてはならないので、どうしたものかなぁとしばし考えましたが、なんのことはない、演算の優先度を一番低くすればいいだけでした。

優先度低

 >、<、>=、<=、==

 +、ー

  *、/(÷) 

優先度高

上記のように優先度を決めて、逆ポーランド記法へ変換すればok。

・入力(挿入記法)

1 + 2 > 3 * 5

逆ポーランド記法

1 2 + 3 5 * >

 うん、大丈夫そう。こんな感じで、解説も適当なように、ソースもほぼ参考通りで楽勝だったのですが、2つほど問題がありました。

1)int型(整数)では演算結果に問題が出る

 当たり前ですが、intでやると3÷2の結果は1になります。これが、積み重なったりすると正しい結果にならないので、結局、演算はfloatで行うことにしました。ただ、色設定などfloatの演算結果を必要とすることあるので、結果的に正しい選択になったのでよしとします。

2)通常の計算と条件式では、返り値の型を変える必要がある

 演算式は、通常の計算(変数への代入など)と条件式(IF文とか)で使用するつもりでしたので、通常の計算はfloatで結果を返す、条件式ではboolで結果を返すようにする必要がありました。演算部分をうまくまとめられないなぁと思考停止の結果、コピペして通常の計算結果と条件結果を求めるメソッドを2つ別々に用意するという方法で解決。う、動けばいいよね…。

 次はどうしよっかなぁ…と思って煮詰まっていた時に、つい手を出したVR(cardboard)が思いのほか楽しい! ちょっとだけ浮気しよっと、えへ。