【问题标题】:My C# Calculator will not calculate more than 2 consecutive numbers我的 C# 计算器不会计算超过 2 个连续数字
【发布时间】:2018-04-06 07:23:31
【问题描述】:

我最近刚刚完成了我的第一个 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 时)。有人可以为我指出如何解决这个缺陷的正确方向,请记住,我仍然是一个初学者,所以任何和所有的建议和信息都将不胜感激

谢谢

我的应用程序代码的其余部分 --

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

【问题讨论】:

  • 能否打个断点,验证一下参数的值是否正确?
  • 不是你的问题的答案,但我前段时间遇到过类似的问题,最后使用了这个:github.com/pieterderycke/Jace
  • Damon,你有没有试过调试你的代码,即逐行检查它出了什么问题?
  • 我不清楚是什么过程导致您认为连续两次访问同一个文本框会以某种方式产生不同的值。

标签: c# calculator


【解决方案1】:

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

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

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

所以工作流程是这样的:

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

【讨论】:

    【解决方案2】:

    我假设您想模仿一个真正的计算器,而不是考虑第一个、第二个和第三个数字。

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

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

    然后等号按钮变得与其他操作按钮非常相似。这里有一些细微差别,您可能需要考虑某人在何处按下“=”按钮,然后立即按下另一个操作按钮 - 您可能会发现您需要至少两个“操作”值来区分“我是只显示最后一个结果,因为有人按下了 = 键 - 他们此时可以开始另一个操作”和“我正在显示一个结果,但他们现在开始输入其他内容,所以我们要覆盖按下操作键时具有此新输入的累加器”。


    1一旦你完成了这项工作,然后添加第二个变量,这个变量称为“内存”。然后,您可以实现大多数计算器上的“M”、“M+”、“M-”、“MC”、“MR”等按钮。

    【讨论】:

      【解决方案3】:
      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。 在第二次加法操作中丢失了 6 个。 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 变量中。

      【讨论】:

      • 但是现在您的计算器只能执行 (a + b) op c 类型的计算 - 您无法更改此计划下第一个运算符的类型,因为它现在在您的运算符中硬编码为 +
      • @Damien_The_Unbeliever 对。我的回答只是一个起点。可以为其他运算符实现类似的逻辑。至少学会了一种保存先前值的简单方法。而事实上,所有的代码都应该重新设计。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2014-12-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      相关资源
      最近更新 更多