-3

如果我继续使用相同的运算符(*、/、+、-),计算器可以正常工作,但例如,如果我决定将两个相加数字的总和相乘,它会给我一个错误的答案。我一直在寻找解决方案,但似乎找不到。

   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执行的块 - 到目前为止一切都很好。

然后有人选择乘法,所以 now multiply = true,但add = 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... 在清除标志后您将不再需要它,但是如果一次只能设置一个标志,则测试每个标志是没有意义的:

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

看起来问题在于您没有清除操作命令。即,您将其设置为相加,但是当您将其设置为相乘时,您永远不会清除相加。如果您查看 btnEquals_Click 方法,可能会同时激活多个操作,并且它会执行所有操作。

于 2013-08-07T21:29:24.533 回答