縦書きノベル制作日記 その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)が思いのほか楽しい! ちょっとだけ浮気しよっと、えへ。