【问题标题】:Calculator Trouble: Only getting second value I enter计算器故障:只输入第二个值
【发布时间】:2019-01-01 03:40:56
【问题描述】:

我创建了一个基本计算器,但每次输入第二个值并按等号按钮时,我都没有返回任何结果。只有我输入的第二个值。 我的 +-*/ 方法在一个单独的类中。解决此问题的最佳方法是什么?这可能是一个简单的错误,但我找不到它。你能否也请给我一个解释我做错了什么。提前致谢。

public sealed partial class Calculator : Page
{
    public double num01, num02;
    int operater;

    public Calculator()
    {
        this.InitializeComponent();
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text =txtcalcdisplay.Text+ "1";          
    }

    private void btn2_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "2";            
    }

    private void btn3_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "3";
    }

    private void btn4_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "4";        
    }

    private void btn5_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "5";
    }

    private void btn6_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "6";
    }

    private void btn7_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "7";
    }

    private void btn8_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "8";
    }

    private void btn9_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = txtcalcdisplay.Text + "9";
    }

    private void Clear_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text = string.Empty;
    }

    private void btnsubtract_Click(object sender, RoutedEventArgs e)
    {
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
        txtcalcdisplay.Text = "";
        operater = '1';
    }

    private void btnadd_Click(object sender, RoutedEventArgs e)
    {
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
        txtcalcdisplay.Text = "";
        operater = '2';
    }

    private void btnmultiply_Click(object sender, RoutedEventArgs e)
    {
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
        txtcalcdisplay.Text = "";
        operater = '3';
    }

    private void btndivide_Click(object sender, RoutedEventArgs e)
    {
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
        txtcalcdisplay.Text = "";
        operater = '4';
    }

    private void btnequals_Click(object sender, RoutedEventArgs e)
    {
        switch (operater)
        {
            case 1:
                num02 = Convert.ToDouble(txtcalcdisplay.Text);
                CalculationClass sub = new CalculationClass();
                double answer= sub.Subtract(num01, num02);
                txtcalcdisplay.Text = answer.ToString();
                break;

            case 2:
                num02 = Convert.ToDouble(txtcalcdisplay.Text);
                CalculationClass add = new CalculationClass();
                answer= add.Addition(num01, num02);
                txtcalcdisplay.Text = answer.ToString();
                break;

            case 3:
                num02 = Convert.ToDouble(txtcalcdisplay.Text);
                CalculationClass mult = new CalculationClass();
                answer = mult.Multiply(num01, num02);
                txtcalcdisplay.Text = answer.ToString();
                break;

            case 4:
                num02 = Convert.ToDouble(txtcalcdisplay.Text);
                CalculationClass div = new CalculationClass();
                answer = div.Div(num01, num02);
                txtcalcdisplay.Text = Convert.ToString(answer);
                break;
        }
    }

    private void btnback_Click(object sender, RoutedEventArgs e)
    {
    }

    private void btnplusdivideminus_Click(object sender, RoutedEventArgs e)
    {
    }

    private void btncomma_Click(object sender, RoutedEventArgs e)
    {
    }

    private void btngallery_Click(object sender, RoutedEventArgs e)
    {
    }

    private void btncontact_Click(object sender, RoutedEventArgs e)
    {
    }

    private void num0_Click(object sender, RoutedEventArgs e)
    {
        txtcalcdisplay.Text += "0";
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
    }
}


class CalculationClass
{
    double answer;

    public double Addition(double x, double y)
    {
        answer = x + y;
        return answer;
    }

    public double Subtract(double x, double y)
    {
        answer = x - y;
        return answer;
    }

    public double Multiply(double x, double y)
    {
        answer = x * y;
        return answer;
    }

    public double Div(double x, double y)
    {
        answer = x / y;
        return answer;
    }
}

【问题讨论】:

  • 最好的办法是关闭调试器,在事件处理程序上为等号按钮设置断点,然后逐步执行。
  • 是的,如果不使用 XAML,很难看出哪里可能出现错误。是否所有运算符(即加、减、乘和除)都会出现此错误,还是仅出现一个?如果有,是哪一个?
  • 请尝试提供minimal complete and verifiable code example。这可能会显示您的错误,并使我们更容易查看您的问题(如果问题仍然存在)。谢谢
  • 顺便说一句,你拼错了“操作员”。这不是问题的根源,但它足以困扰我的提及它
  • 是的,所有运营商都会发生这种情况。

标签: c# calculator


【解决方案1】:

我不是 100% 确定,但我很确定这与您的变量 operaterint 但您为其分配了一个字符(这有效 - 字符可以分配给整数),然后将其与整数进行比较(例如,1 == '1'

int x = '1';
Console.WriteLine(x); // outputs 49
Console.WriteLine(x == 1); // outputs false

所以要修复它,请使用开关中的字符:

switch(operater){
   case '1': ...
}

或者分配整数1,2,3,4而不是字符'1','2,'3','4'

private void btnadd_Click(object sender, RoutedEventArgs e)
{
    num01 = Convert.ToDouble(txtcalcdisplay.Text);
    txtcalcdisplay.Text = "";
    operater = 2; // here
}

【讨论】:

    【解决方案2】:

    因此,在您的操作员单击处理程序(用于 +、-、* 等的处理程序)中,您将 operater 变量设置为字符 '1''2' 等。好吧,您的 operater变量是一个整数。但是等等,您不应该将char 分配给int?!好吧,编译器在这里做了一个隐式转换(language spec says it should)。

    所以当您执行operater = '1' 时最终发生的事情是operater 被分配了49('1' 的ASCII 值)。然后,当您到达您的等号按钮单击处理程序时,它会触发该 switch 语句。你猜怎么着?你没有 49 的情况。所以什么都没有发生,你一直在屏幕上看到你的第二个数字。

    因此,要修复它,请删除您在运算符处理程序中分配给 operater 的数字周围的单引号。即:

    private void btnsubtract_Click(object sender, RoutedEventArgs e)
    {
        num01 = Convert.ToDouble(txtcalcdisplay.Text);
        txtcalcdisplay.Text = "";
        operater = 1;  // <-- change this line to be like this, removed the single quotes
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-12
      • 2018-08-14
      • 1970-01-01
      • 2013-12-08
      • 2016-08-30
      • 1970-01-01
      • 2010-12-31
      相关资源
      最近更新 更多