-3

同じ演算子 (*、/、+、-) を使用し続けると、電卓は正常に機能しますが、たとえば、2 つの加算された数値の合計を乗算すると、間違った答えが得られます。解決策を探しましたが、見つからないようです。

   public partial class frmMain : Form
    {
    public frmMain()
    {
        InitializeComponent();
    }

    bool multiply = false;
    bool divide = false;
    bool add = false;
    bool subtract = false;

    private void btnOne_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "1";
    }

    private void btnTwo_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "2";
    }

    private void btnThree_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "3";
    }

    private void btnFour_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "4";
    }

    private void btnFive_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "5";
    }

    private void btnSix_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "6";
    }

    private void btnSeven_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "7";
    }

    private void btnEight_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "8";
    }

    private void btnNine_Click(object sender, EventArgs e)
    {
        txtDisplay.Text = txtDisplay.Text + "9";
    }

    private void btnZero_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text.Length > 0)
        {
            txtDisplay.Text = txtDisplay.Text + "0";
        }
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        txtDisplay.Clear();
    }

    private void btnDecimalPoint_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text.Contains("."))
        {
            return;
        }
        else
        {
            txtDisplay.Text = txtDisplay.Text + ".";
        }
    }

    private void btnNegative_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text.Contains("-"))
        {
            txtDisplay.Text = txtDisplay.Text.Remove(0,1);
        }
        else
        {
            txtDisplay.Text = "-" + txtDisplay.Text;
        }
    }

    private void btnMultiply_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text == "")
        {
            return;
        }
        else
        {
            multiply = true;
            txtDisplay.Tag = txtDisplay.Text;
            txtDisplay.Text = "";
        }
    }


    private void btnAdd_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text == "")
        {
            return;
        }
        else
        {
            add = true;
            txtDisplay.Tag = txtDisplay.Text;
            txtDisplay.Text = "";
        }
    }

    private void btnSubtract_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text == "")
        {
            return;
        }
        else
        {
            subtract = true;
            txtDisplay.Tag = txtDisplay.Text;
            txtDisplay.Text = "";
        }
    }
    private void btnEquals_Click(object sender, EventArgs e)
    {
        if (multiply)
        {
            decimal dec = Convert.ToDecimal(txtDisplay.Tag) * Convert.ToDecimal(txtDisplay.Text);
            txtDisplay.Text = dec.ToString();
        }
        if (divide)
        {
            decimal dec = Convert.ToDecimal(txtDisplay.Tag) / Convert.ToDecimal(txtDisplay.Text);
            txtDisplay.Text = dec.ToString();
        }
        if (add)
        {
            decimal dec = Convert.ToDecimal(txtDisplay.Tag) + Convert.ToDecimal(txtDisplay.Text);
            txtDisplay.Text = dec.ToString();
        }
        if (subtract)
        {
            decimal dec = Convert.ToDecimal(txtDisplay.Tag) - Convert.ToDecimal(txtDisplay.Text);
            txtDisplay.Text = dec.ToString();
        }
        else
        {
            return;
        }
    }

    private void btnDivide_Click(object sender, EventArgs e)
    {
        if (txtDisplay.Text == "")
        {
            return;
        }
        else
        {
            divide = true;
            txtDisplay.Tag = txtDisplay.Text;
            txtDisplay.Text = "";
        }
    }

}
4

2 に答える 2

2

あなたのbtnEquals_Clickイベントを見てください。誰かが追加することを選択したのでadd = true、それが実行される唯一のifブロックです。これまでのところすべてが良好です。

次に、誰かが掛け算を選択したので、今は ですmultiply = trueadd = true、同様に、掛け算足し算をしています。誰かがすべての演算子を通過した場合 (演算子のフラグを決してクリアしていないため)、その後のすべての数値が乗算され、除算され、加算され、最後に減算されます。

これを修正するには、演算子をクリアするメソッドを作成できます。

private void ResetOperatorFlags()
{
    multiply = false;
    divide = false;
    add = false;
    subtract = false;
}

次に、番号に対して操作を実行する前に呼び出します。

private void btnMultiply_Click(object sender, EventArgs e)
{
    if (txtDisplay.Text == "")
        return;

    ResetOperatorFlags();

    multiply = true;
    txtDisplay.Tag = txtDisplay.Text;
    txtDisplay.Text = "";
}

最後に、あなたのbtnEquals_Clickイベントではelse if、フラグをクリアした後は実際には必要ありませんが、一度に 1 つしか設定できない場合、すべてのフラグをテストしても意味がありません:

private void btnEquals_Click(object sender, EventArgs e)
{
    if (multiply)
    {
        ...
    }
    else if (divide)
    {
        ...
于 2013-08-07T21:29:04.123 に答える