- ベストアンサー
VC++の電卓です
初めての投稿になります。 VC++2005で演算子の優先度を識別する電卓を作成しようと試みているのですが、( )の処理がどうにもうまく行きません。 改善点など、ご意見を頂ければ幸いに思います。 詳細に関しては以下の通りです。 仕様 開発環境 VC++2005 開発対象 +-×÷( )の優先度を識別して計算を行う電卓。 備考 BackやCEの機能は考えず、まずは正しい計算結果を求めることが出来れば良い。 問題があると思われるコード //グローバル変数 int num[100];//数値を格納する配列 int op[100];//演算子を格納する配列 int num_count = 0;//数値配列の位置を格納する変数 int op_count = 0;//演算子配列の位置を格納する変数 int ans;//解答を表示 //計算処理 int calculat() { int num1 = num[num_count++];//最初の数値を格納 int num2 = 0;//一つ目の値と二つ目の値を格納しておく変数 int ope = op[op_count++];//最初の演算子を格納 while(ope > 0)//演算子が0(=)にならない限り計算を続ける { switch(ope) { //演算子が+か-の場合 case 1: case 2: num2 = calculat();//再帰的に calculat を呼び出す break; //演算子が×か÷の場合 case 3: case 4: //更に次の演算子が(の場合 if(op[op_count] == 5) { num2 =calculat(); break; } else { num2 = num[num_count++];//二つ目の数値にnum1の次の数値を格納 break; } //演算子が)の場合 case 6: return num1; break; } switch(ope)//格納されている演算子によって処理が異なる { //+の場合 case 1: num1 = num1 + num2; break; //-の場合 case 2: num1 = num1 - num2; break; //×の場合 case 3: num1 = num1 * num2; break; //÷の場合 case 4: num1 = num1 / num2; break; } //次の演算子を格納 ope = op[op_count++]; } return num1; } 計算処理を行う関数 calculat() を再帰的に呼び出すことで優先順位を付けた計算を行っている。 現在のコードで、四則演算までは問題なくこなすことが可能。 ( )を含めた計算も、ループに関しては問題ないが、正しい計算結果が返ってこない。 考えられる原因は計算処理の三行目 int num1 = num[num_count++]; 『演算子が(の場合』で再帰的に関数 calculat() を呼び出した際に限り、 num1に 0 が格納されてしまう。 = num[num_count++]; の処理が行われていない模様。 以上です。 非常に見づらいコードで申し訳ありませんが、よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
補足
アドヴァイスに従い、逆ポーランド記法について少し調べてみました。 優先順位を付けた電卓を作成する際にはよく使われる手法のようですね。 プログラム言語の世界に飛び込んで早一年、世界の広さに呆然とする毎日です。(笑) とにかく、電卓作成の為のアプローチの仕方が根本的に間違っていたと理解しました。 逆ポーランド記法について学習し、リベンジを果たそうと心に誓いました。 と、方向転換を行うことが決定した為、この回答は締め切ろうと思います。 素人同然の私の問いに、親身になって回答してくださった皆様には、深く感謝致します。 逆ポーランド記法での電卓作成法についてまた質問を投稿すると思いますので、その際にはまたよろしくお願いします。