我的C#计算器不会计算超过2个连续数字

时间:2018-04-06 07:23:32

标签: c# calculator

我刚刚完成了我的第一个Windows窗体计算器工作正常,但我的问题是 - 如何在达到等号之前在计算中添加第三个,甚至第四个数字?我一直在尝试将ThirdNumber变量放在代码中的许多不同位置,如此 -

  private void bequal_Click(object sender, EventArgs e)
    {
        double SecondNumber;
        double ThirdNumber;
        double Result;

        SecondNumber = Convert.ToDouble(textBox1.Text);
        ThirdNumber = Convert.ToDouble(textBox1.Text);

        if (Operation == "+")
        {
            Result = (FirstNumber + SecondNumber) + ThirdNumber; 
            textBox1.Text = Convert.ToString(Result);
            FirstNumber = Result;
        }

但是,每次给出错误答案时(例如6 + 6 + 8 = 22,当我知道应该是20时)。有人可以指出我正确的方向,如何解决这个缺陷,请记住,我仍然是一个初学者,所以任何和所有的建议和信息将不胜感激

由于

App的其余代码 -

public partial class Form1 : Form
{
    double FirstNumber;
    string Operation;
    public Form1()
    {
        InitializeComponent();
    }

    private void n1_Click(object sender, EventArgs e)
    {
        if (textBox1.Text == "0" && textBox1.Text != null)  // If the textbox value is 0 or is not null then
        {                                                   // the number that corresponds to the button that is clicked
            textBox1.Text = "1";                            // will be subsituted in
        }
        else
        {                                                   // Else add the button value to the existing text box value 
            textBox1.Text = textBox1.Text + "1";
        }
    }

    private void n2_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "2";
        }
        else
        {
            textBox1.Text = textBox1.Text + "2";
        }
    }

    private void n3_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "3";
        }
        else
        {
            textBox1.Text = textBox1.Text + "3";
        }
    }

    private void n4_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "4";
        }
        else
        {
            textBox1.Text = textBox1.Text + "4";
        }
    }

    private void n5_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "5";
        }
        else
        {
            textBox1.Text = textBox1.Text + "5";
        }
    }

    private void n6_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "6";
        }
        else
        {
            textBox1.Text = textBox1.Text + "6";
        }
    }

    private void n7_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "7";
        }
        else
        {
            textBox1.Text = textBox1.Text + "7";
        }
    }

    private void n8_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "8";
        }
        else
        {
            textBox1.Text = textBox1.Text + "8";
        }
    }

    private void n9_Click(object sender, EventArgs e)
    {
        if(textBox1.Text == "0" && textBox1.Text != null)
        {
            textBox1.Text = "9";
        }
        else
        {
            textBox1.Text = textBox1.Text + "9";
        }
    }

    private void n0_Click(object sender, EventArgs e)
    {
        textBox1.Text = textBox1.Text + "0";
    }

    private void bad_Click(object sender, EventArgs e)
    {
        FirstNumber = Convert.ToDouble(textBox1.Text);
        textBox1.Text = "0";
        Operation = "+";
    }

    private void sub_Click(object sender, EventArgs e)
    {
        FirstNumber = Convert.ToDouble(textBox1.Text);
        textBox1.Text = "0";
        Operation = "-";
    }

    private void bmul_Click(object sender, EventArgs e)
    {
        FirstNumber = Convert.ToDouble(textBox1.Text);
        textBox1.Text = "0";
        Operation = "*";
    }

    private void bdiv_Click(object sender, EventArgs e)
    {
        FirstNumber = Convert.ToDouble(textBox1.Text);
        textBox1.Text = "0";
        Operation = "/";
    }

    private void bc_Click(object sender, EventArgs e)
    {
        textBox1.Text = "0";
    }

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

    private void bequal_Click(object sender, EventArgs e)
    {
        double SecondNumber;
        double ThirdNumber;
        double Result;

        SecondNumber = Convert.ToDouble(textBox1.Text);
        ThirdNumber = Convert.ToDouble(textBox1.Text);

        if (Operation == "+")
        {
            Result = (FirstNumber + SecondNumber) + ThirdNumber; 
            textBox1.Text = Convert.ToString(Result);
            FirstNumber = Result;
        }
        else if (Operation == "-")
        {
            Result = (FirstNumber - SecondNumber);
            textBox1.Text = Convert.ToString(Result);
            FirstNumber = Result;
        }
        else if (Operation == "*")
        {
            Result = (FirstNumber * SecondNumber);
            textBox1.Text = Convert.ToString(Result);
            FirstNumber = Result;
        }
        else if (Operation == "/")
        {
            if (SecondNumber == 0)
            {
                textBox1.Text = "Cannot divide by zero";
            }
            else
            {
                Result = (FirstNumber / SecondNumber);
                textBox1.Text = Convert.ToString(Result);
                FirstNumber = Result;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:1)

你得到6 + 6 + 8 = 22因为你基本上做的是:

  • 输入6,按+
  • 6存储为FirstNumber
  • 输入另一个6,按+
  • FirstNumber被新的6覆盖。
  • 输入8,按=
  • 检索FirstNumber - 即6 - 并将两次添加8

另一种方法可能是创建一个存储数字和相关操作的类型。

所以工作流程就像:

  • 输入6,按+
  • { op: multiply, value: 6 }等信息存储在“事件”的集合中。
  • 继续添加。
  • 按下=会迭代这些“事件”的集合并计算结果。

答案 1 :(得分:1)

我假设你想要模仿一个真正的计算器,而不是用第一,第二和第三个数字来思考。

对于简单的计算器,您真正想要的是累加器。这是一个单变量/寄存器,我们存储我们计算的最后一个结果。 1

任何"操作"按下按钮,然后需要考虑累加器中的当前值,文本框的当前内容以及按下的上一个操作按钮。然后,您可以在累加器和文本框中的数字之间执行 操作,使用该新值更新累加器和文本框,并记录您刚开始执行的新操作。您应该能够将大部分逻辑放入一个功能中,以便您的所有"操作"按钮电话。

然后,等于按钮变得非常类似于其他操作按钮。这里有一些细微差别你可能想要考虑某人按下" ="按钮,然后立即按下另一个操作按钮 - 你可能会发现你想要至少两个"操作"区分"我只是显示最后一个结果,因为有人按下了=键 - 他们可以在此时开始另一个操作"和#34;我正在显示一个结果,但他们现在开始输入其他内容,所以当按下操作键时,我们希望用这个新输入覆盖累加器"。

1 一旦你有了这个工作,然后添加第二个变量,这个变量称为" Memory"。然后,您可以实施" M"," M +"," M - "," MC"," MR&大多数计算器上都有#34;等按钮。

答案 2 :(得分:0)

private void bdiv_Click(object sender, EventArgs e)
{
    FirstNumber = Convert.ToDouble(textBox1.Text);
    textBox1.Text = "0";
    Operation = "/";
}

每当你按下' +'按钮,第一个数字将被重置,旧值将丢失。

    SecondNumber = Convert.ToDouble(textBox1.Text);
    ThirdNumber = Convert.ToDouble(textBox1.Text);

第二个和第三个数字总是相同的。

6 + 6 + 8在你的计算器中得到22,因为它实际上计算了6 + 8 + 8。 其中一个在第二个添加操作中丢失了。并且8是重复的,因为第二个和第三个数字将等于textBox1.Text。

解决方案:

使用+ =操作

private void bdiv_Click(object sender, EventArgs e)
{
   FirstNumber += Convert.ToDouble(textBox1.Text);
   textBox1.Text = "0";
   Operation = "/";
}

删除SecondNumber变量。

SecondNumber = Convert.ToDouble(textBox1.Text); // remove this line
ThirdNumber = Convert.ToDouble(textBox1.Text);

不需要第二个数字,因为它现在位于FirstNumber变量中。