2

私は逆ポーランド記法計算機に取り組んでいます。計算を処理するメソッドを作成しましたが、エラーの原因となっているコードが3行あります。すべて=の操作が実行されてから表示された後。から文字列を取得しTxtInputBoxて整数に変換しようとしていますが、常にキャッチメッセージが表示されますPlease check the input。その後、何も計算または表示されません。私の最初のifステートメントは実際の整数をチェックし、文字を回避すると確信しています。私の最終的な目標は、数式をrpn形式で入力し、結果を複数行のテキストボックスに表示することです。

サンプル入力 5 6 -=

コード

namespace rpncalc
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void RPNCalc(TextBox TxtBoxInputbox, TextBox TxtBoxOutputbox)
        {
            Stack<int> stackone = new Stack<int>();
            stackone.Clear();
            string[] inputarray = TxtBoxInputbox.Text.Split();
            int end = inputarray.Length - 1;
            int numinput;
            int i = 0;

            do
            {
                if(inputarray[i] != "=" && inputarray[i] != "+" && inputarray[i] != "-" && inputarray[i] != "*" && inputarray[i] != "/")  
                {
                    try
                    {
                        numinput = Convert.ToInt32(inputarray[i]);
                        stackone.Push(numinput);
                    }
                    catch
                    {
                        MessageBox.Show("Please check the input");
                    }
                }

                    else if (inputarray[i]== "+")
                    {
                        try
                        {
                            int store1 = stackone.Pop();
                            int store2 = stackone.Pop();
                            stackone.Push(store2 + store1);
                        }
                        catch
                        {
                        }
                    }

                    else if (inputarray[i]== "-")
                    {
                        try
                        {
                            int store1 = stackone.Pop();
                            int store2 = stackone.Pop();
                            stackone.Push(store2 + store1);
                        }
                        catch
                        {
                        }
                    }

                    else if (inputarray[i]== "+")
                    {
                        try
                        {
                            int store1 = stackone.Pop();
                            int store2 = stackone.Pop();
                            stackone.Push(store2 + store1);
                        }
                        catch
                        {
                        }
                    }

                    else if (inputarray[i]== "*")
                    {
                        try
                        {
                            int store1 = stackone.Pop();
                            int store2 = stackone.Pop();
                            stackone.Push(store2 + store1);
                        }
                        catch
                        {
                        }
                    }

                    else if (inputarray[i]== "/")
                    {
                        try
                        {
                            int store1 = stackone.Pop();
                            int store2 = stackone.Pop();
                            stackone.Push(store2 + store1);
                        }
                        catch
                        {
                        }
                    }

            }
            while(i < end && inputarray[i]!= "=" && stackone.Count != 0);
            string txtout = TxtInputBox + " " + stackone.Pop().ToString() + Environment.NewLine;
            TxtOutputBox.AppendText(txtout);
            TxtInputBox.Clear();

        }

        private void Btn_Calc_Click(object sender, EventArgs e)
        {
            RPNCalc(TxtInputBox, TxtOutputBox);
        }

    }
}

ここに画像の説明を入力してください

4

2 に答える 2

3

引数のないSplitコマンドは、スペースと他の空白で文字列を分割します。

-=の間の入力にはスペースがないため、ifステートメントのテストと一致しない1つのトークンとして扱われます。

元の回答は、引数なしの分割が個々の文字に分割されていることを誤って示唆していました。

于 2012-11-30T06:04:54.407 に答える
2

ループiの各反復後にインクリメントするために何をしていますか? do私はあなたのコードを試してみましたが、iインクリメントされていないようです。また、キャッチして走るときも

catch
{
    MessageBox.Show("Please check the input");
}

おそらく次のように変更できます。

catch (Exception e) 
{
    MessageBox.Show(e.ToString());
}

キャッチしているものとその理由を確認できます。

編集:

これがあなたのコードの私のバージョンで、今は正しく動作しています:

  • i反復ごとにインクリメントされます
  • 代わりに加算を行うマイナス、乗算、および除算演算子のタイプミスを修正しました
  • 冗長な加算演算子を削除しました
namespace rpncalc {
    public partial class Form1 : Form {
        public Form1 () {
            InitializeComponent();
        }

        private void RPNCalc (TextBox TxtBoxInputbox, TextBox TxtBoxOutputbox) {
            Stack<int> stackone = new Stack<int>();
            stackone.Clear();
            string[] inputarray = TxtBoxInputbox.Text.Split();
            int end = inputarray.Length - 1;
            int numinput;
            int i = 0;

            do {
                if (inputarray[i] != "=" && inputarray[i] != "+" && inputarray[i] != "-" && inputarray[i] != "*" && inputarray[i] != "/") {
                    try {
                        numinput = Convert.ToInt32(inputarray[i]);
                        stackone.Push(numinput);
                    } catch (Exception e) {
                        MessageBox.Show(e.ToString());
                    }
                } else if (inputarray[i] == "+") {
                    try {
                        int store1 = stackone.Pop();
                        int store2 = stackone.Pop();
                        stackone.Push(store2 + store1);
                    } catch {
                    }
                } else if (inputarray[i] == "-") {
                    try {
                        int store1 = stackone.Pop();
                        int store2 = stackone.Pop();
                        stackone.Push(store2 - store1);
                    } catch {
                    }
                } else if (inputarray[i] == "*") {
                    try {
                        int store1 = stackone.Pop();
                        int store2 = stackone.Pop();
                        stackone.Push(store2 * store1);
                    } catch {
                    }
                } else if (inputarray[i] == "/") {
                    try {
                        int store1 = stackone.Pop();
                        int store2 = stackone.Pop();
                        stackone.Push(store2 / store1);
                    } catch {
                    }
                }
            }
            while (i++ < end && inputarray[i] != "=" && stackone.Count != 0);
            string txtout = TxtInputBox.Text + " " + stackone.Pop().ToString() + Environment.NewLine;
            TxtOutputBox.AppendText(txtout);
            TxtInputBox.Clear();

        }

        private void Btn_Calc_Click (object sender, EventArgs e) {
            RPNCalc(TxtInputBox, TxtOutputBox);
        }
    }
}
于 2012-11-30T06:28:40.857 に答える