(4つの数字と四則演算を用いて10をつくるゲーム。解くプログラムを作ろうとして、その1要素としてC++で逆ポーランド記法を計算するプログラムを書いてみたら楽しかったのでメモしておきます。2ならば、12+の用に書きます。コンピュータで計算式を解析するのに向いている記法で、演算子を後置するようなイメージです。ような例をつかって計算順序のイメージをみてみます。左から順番に文字を処理していき以下のような順序で演算していきます。10)10詳しい説明はこちらのサイトがすごくわかりやすいので、ぜひ参照してみてください。環境は以下の通りです。/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/binまた、c++14の記法を一部使っています。今回はユニットテスト用にgoogleTestを使用することにしました。Testに関しては参考になったサイトを載せておくのでそちらを参照していただければと思います。今回実装した成果物はこちらhttps://github.com/foresta/rpn実装は以下の手順で進めました。上記の参考サイトを参照していい感じに設定をします。Testのバイナリを含めてしまいましたが、どこに配置しても大丈夫かと思います。ディレクトリの構成は以下のような感じにしています。テスト実行スクリプト文字をパースする一文字を受け取ってそれが、オペレータなのかオペランドなのか不正な文字なのかをパースする関数を実装します。テストテストは以下のような感じ。定義して文字がどれなのかを判別するようにしています。数値の判別には、isdigit関数が使えるのでそれを利用しました。ParseResult::Invalid;}文字列を文字に分解する入力された文字列を一文字ずつ解析するために、分解する関数を用意しました。文字を数値として扱うため、変換します。'0'というのは、0~9までのASCIIコードが連番なのを利用したイディオムです。ならんでおりその差を取ると、数値の4になるという具合です。文字列からstd::functionを返します。テストテストでは、帰ってきた関数で実際に計算した結果が期待した数値かどうかをみています。対応する関数を返します。除算は0を返すように実装しました。(例外を出した方が良いかもですが。)また、除算において小数や分数を扱うことはせず、整数のみを対象にしています。}}stackを用いて逆ポーランド記法を実装テスト期待する動作をテストコードで列挙します。throwするようにしています。そもそも文字が不正}実装いままでに実装してきた部品を組み合わせて逆ポーランド記法を実装します。operands.top();}ちょっと長いので個別にみていきます。直前の数値を取り出す必要があるので、LIFO(後入れ先出し)のデータ構造であるstackを用いると良さそうです。stackはc++のstdライブラリに用意されているのでそれを使います。operands;つぎに、入力文字列を一文字ずつ解析していきます。...}そして、結果に応じて処理を振り分けていきます。演算子の場合はスタックから数値を二つ取り出します。するようにしています。引数として与え、計算を行います。最後に、結果をスタックに保持します。break;}次に数値の場合ですが、数値は純粋にスタックに積みます。break;}不正な文字であった場合は例外をthrowします。exists.");}上記の処理を入力された文字だけループして行います。最後に逆ポーランド記法の結果は単一の数値になるはずなのでスタックの要素数が1出ない場合はエラーとして例外をthrowします。operand)");}このようにして計算された結果はスタックに残っているのでその要素を返して、rpn関数の役目は終わりです。10では、分数を扱う必要があります。ような回答があります。計算してしまうため、10を作ることができません。逆ポーランド記法などは割とよく知られた問題ですが、ちゃんとプログラムとして書くと意外とつまづいたりすることもあって面白かったです。今回はテスト駆動開発を意識でやってみましたがテストが通った瞬間の気持ち良さがあり楽しかったです。いうちょっと遊びだけど、頭使う系のプログラムもたまには良いものだなーと思いました。