3

大家好,感谢您帮助我。

我用 C# 制作了这个计算器,但遇到了一个问题。当我添加 5+5+5 之类的东西时,它会给我正确的结果,但是当我想减去两个以上的数字并除以或乘以两个以上的数字时,我没有得到正确的结果。

你知道我做错了什么吗

非常感谢你!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace calculator
{
    public partial class Calculator : Form
    {
        public Calculator()
        {
            InitializeComponent();
        }

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

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

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

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

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

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

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

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

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

        private void btnZero_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + btnZero.Text;
        }

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

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


        double total1 = 0;
        double total2 = 0;

        bool plusButtonClicked = false;
        bool minusButtonClicked = false;
        bool divideButtonClicked = false;
        bool multiplyButtonClicked = false;

        private void btnPlus_Click(object sender, EventArgs e)
        {
            plusButtonClicked = true;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = false;

            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();
        }

        private void btnMinus_Click(object sender, EventArgs e)
        {
            plusButtonClicked = false;
            minusButtonClicked = true;
            divideButtonClicked = false;
            multiplyButtonClicked = false;

            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();
        }



        private void btnDivide_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = true;
            multiplyButtonClicked = false;
        }

        private void btnMultiply_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = true;
        }



        private void btnEquals_Click(object sender, EventArgs e)
        {

            if (plusButtonClicked == true)
            {
                total2 = total1 + double.Parse(txtDisplay.Text);
            }

            else if (minusButtonClicked == true)
            {
                total2 = total1 - double.Parse(txtDisplay.Text);
            }

            else if (divideButtonClicked == true)
            {
                total2 = total1 / double.Parse(txtDisplay.Text);
            }

            else if (multiplyButtonClicked == true)
            {
                total2 = total1 * double.Parse(txtDisplay.Text);
            }


            txtDisplay.Text = total2.ToString();
            total1 = 0;
        }




    }
}
4

5 回答 5

3

此代码尚未经过彻底测试。您为什么不尝试以下方法:

using System;
using System.Windows.Forms;

namespace Calculator
{
    public enum Operator
    {
        None,
        Add,
        Minus,
        Divide,
        Multiply
    }

    public partial class Calculator : Form
    {
        private double total = 0;
        private double currentValue = 0;
        private Operator currentOperator;

        public Calculator()
        {
            InitializeComponent();
        }

        private void btnOne_Click(object sender, EventArgs e)
        {
            ShowInput(btnOne.Text);
        }

        private void btnTwo_Click(object sender, EventArgs e)
        {
            ShowInput(btnTwo.Text);
        }

        private void btnThree_Click(object sender, EventArgs e)
        {
            ShowInput(btnThree.Text);
        }

        private void btnFour_Click(object sender, EventArgs e)
        {
            ShowInput(btnFour.Text);
        }

        private void btnFive_Click(object sender, EventArgs e)
        {
            ShowInput(btnFive.Text);
        }

        private void btnSix_Click(object sender, EventArgs e)
        {
            ShowInput(btnSix.Text);
        }

        private void btnSeven_Click(object sender, EventArgs e)
        {
            ShowInput(btnSeven.Text);
        }

        private void btnEight_Click(object sender, EventArgs e)
        {
            ShowInput(btnEight.Text);
        }

        private void btnNine_Click(object sender, EventArgs e)
        {
            ShowInput(btnNine.Text);
        }

        private void btnZero_Click(object sender, EventArgs e)
        {
            ShowInput(btnZero.Text);
        }

        private void btnClear_Click(object sender, EventArgs e)
        {
            currentOperator = Operator.None;
            txtDisplay.Clear();
            total = 0;
        }

        private void btnPoint_Click(object sender, EventArgs e)
        {
            txtDisplay.Text = txtDisplay.Text + '.';
        }

        private void btnPlus_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Add);
        }

        private void btnMinus_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Minus);
        }

        private void btnDivide_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Divide);
        }

        private void btnMultiply_Click(object sender, EventArgs e)
        {
            ApplyOperator(Operator.Multiply);
        }

        private void btnEquals_Click(object sender, EventArgs e)
        {
            Evaluate();
            txtDisplay.Text = Convert.ToString(total);
        }

        private void Evaluate()
        {
            switch (currentOperator)
            {
                case Operator.Add:
                    total += currentValue;
                    break;
                case Operator.Minus:
                    total -= currentValue;
                    break;
                case Operator.Divide:
                    total /= currentValue;
                    break;
                case Operator.Multiply:
                    total *= currentValue;
                    break;
                case Operator.None:
                    break;
            }
            currentValue = 0;
            currentOperator = Operator.None;
        }

        private void ApplyOperator(Operator op)
        {
            if (currentOperator != Operator.None)
            {
                Evaluate();
            }
            else
            {
                total = double.Parse(txtDisplay.Text);
            }
            txtDisplay.Clear();
            currentOperator = op;
        }

        private void ShowInput(String n)
        {
            txtDisplay.Text = txtDisplay.Text + n;
            currentValue = double.Parse(txtDisplay.Text);
        }
    }
}

我仍然建议您最终制作某种形式的运算符解析器。看看这里或自己查看“Shunting Yard”算法。

于 2012-05-04T15:23:18.017 回答
2

计算代码中的乘积、商和差异的逻辑total1 = total1 + double.Parse(txtDisplay.Text);是加法起作用的原因,但仅此而已。所以改变逻辑,让它除法、乘法或减法,而不是加法。

于 2012-05-04T15:34:39.153 回答
2

想想看。minus_clicked 代码所做的是将除最后一个操作数之外的所有操作数相加,然后 equals_clicked 代码对 minus_clicked 的结果和文本框的值(我假设这是最后一个操作数)进行算术运算。因此,由于您在 minus_clicked 中执行的操作是加法,因此您得到的 x - y - z 实际上是:

(X + Y) - Z

我会考虑稍微重构一下,但如果你想保持代码原样,我可能只是将减号点击代码更改为减法而不是加法。

另外,@rhysw 是对的。如果您不希望它完全发挥作用,您还必须为其添加优先级逻辑。

于 2012-05-04T15:36:34.937 回答
2

在您的代码中:

 private void btnMultiply_Click(object sender, EventArgs e)
        {
            total1 = total1 + double.Parse(txtDisplay.Text);
            txtDisplay.Clear();

            plusButtonClicked = false;
            minusButtonClicked = false;
            divideButtonClicked = false;
            multiplyButtonClicked = true;
        }

您没有应用正确的运算符,您有 total1 = total1 + ... 将运算符更改为 *。

于 2012-05-04T15:40:06.233 回答
2

我查看了代码,看起来您每次都在添加每个按钮。所以任何时候点击一个按钮,你都会继续添加。只需将 opps 更改为相应的按钮即可。像这样:

private void btnMinus_Click(object sender, EventArgs e)
{
    plusButtonClicked = false;
    minusButtonClicked = true;
    divideButtonClicked = false;
    multiplyButtonClicked = false;

    total1 = total1 - double.Parse(txtDisplay.Text);
    txtDisplay.Clear();
}

private void btnDivide_Click(object sender, EventArgs e)
{
    total1 = total1 / double.Parse(txtDisplay.Text);
    txtDisplay.Clear();

    plusButtonClicked = false;
    minusButtonClicked = false;
    divideButtonClicked = true;
    multiplyButtonClicked = false;
}
于 2013-06-29T02:11:35.490 回答