C#计算器工作不正常

时间:2013-08-07 21:02:15

标签: c# visual-studio-2010

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

   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 = "";
        }
    }

}

2 个答案:

答案 0 :(得分:2)

查看您的btnEquals_Click事件。有人选择添加,因此add = true并且它是唯一执行的if块 - 到目前为止一切都很好。

然后有人选择加倍,现在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)
    {
        ...

答案 1 :(得分:2)

看起来问题是您没有清除操作命令。即你将它设置为Add,但是当你将它设置为Multiply时,你永远不会清除Add。如果你查看btnEquals_Click方法,可以同时激活几个操作,它将执行所有操作。