コーディングスタート
設計ができたので、そろそろコーディング開始です。
まずは電卓なので、数式から答えを求める計算ロジックを作ります。 折角なのでw、ちゃんと優先順位つきのものが作りたい。1+3*3が先に足し算をして12になる電卓もあるけど、算数のルールどおりに掛け算を先に実行して10になってほしい。
Rubyなら文字列で式を渡せば計算してくれたりしますが、どうやらそんな都合よいことはないので、自力で作ることになります。
すぐに思いだしたのは、yacc, lex。大学の授業の課題で電卓作りました。 探せばソースもあるだろし、C言語なので使えると思うけど、コードが大きくなりそうな気がするのでボツに。
次に思い出したのは、forthというか逆ポーランド計算(RPN)。懐かしいとか思いながら、これで作ることにしました。
通常の式からRPNに変換するために、2状態のオートマトンとスタック2つを使いました。 RPNになっちゃえば、計算は簡単。 演算子の計算に必要な個数の数字をスタックから取り出して計算するだけw。
といってもテストが煩雑なので、今回はじめてテストコードを書いてみました。 アタマでは分かっていてもやったことのないテストファースト。 なかなか面白いと思いましたが、この手のテストは教科書通りなので、簡単だったからかもしれません。 UIとか通信とか絡むと、難しいのかも。
設計ができたので、そろそろコーディング開始です。
まずは電卓なので、数式から答えを求める計算ロジックを作ります。 折角なのでw、ちゃんと優先順位つきのものが作りたい。1+3*3が先に足し算をして12になる電卓もあるけど、算数のルールどおりに掛け算を先に実行して10になってほしい。
Rubyなら文字列で式を渡せば計算してくれたりしますが、どうやらそんな都合よいことはないので、自力で作ることになります。
すぐに思いだしたのは、yacc, lex。大学の授業の課題で電卓作りました。 探せばソースもあるだろし、C言語なので使えると思うけど、コードが大きくなりそうな気がするのでボツに。
次に思い出したのは、forthというか逆ポーランド計算(RPN)。懐かしいとか思いながら、これで作ることにしました。
通常の式からRPNに変換するために、2状態のオートマトンとスタック2つを使いました。 RPNになっちゃえば、計算は簡単。 演算子の計算に必要な個数の数字をスタックから取り出して計算するだけw。
といってもテストが煩雑なので、今回はじめてテストコードを書いてみました。 アタマでは分かっていてもやったことのないテストファースト。 なかなか面白いと思いましたが、この手のテストは教科書通りなので、簡単だったからかもしれません。 UIとか通信とか絡むと、難しいのかも。
0 コメント:
コメントを投稿