繁体   English   中英

计算器问题:我输入的只是第二个值

[英]Calculator Trouble: Only getting second value I enter

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

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

我不确定100%,但是我很确定这与以下事实有关:您的变量operater符是一个int但是您正在为其分配一个字符(这可以将字符分配给int),然后将其与整数进行比较(例如,做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
}

因此,在您操作的点击处理程序(药粥+, - ,*,/等)你是你设定operater变量字符'1''2' ,等好了,你operater变量是一个int。 但是,等等,您不应该将一个char分配给一个int吗? 好了,编译器在这里做了隐式转换( 语言规范说应该 )。

因此,当您将operater = '1'时,最终会发生的事情是为该operater分配了49( '1' '的ASCII值)。 然后,当您到达等于按钮单击处理程序时,它将命中该switch语句。 你猜怎么着? 您没有49的保护套。因此什么也没有发生,并且您始终在屏幕上看到第二个数字作为文本。

因此,要解决此问题,请在操作员处理程序中删除分配给operater数字operater的单引号。 IE:

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM