玩具程序中的逻辑错误(使用Switch作为计算器操作员)

时间:2014-12-23 09:32:37

标签: java calculator

我正在构建这个玩具程序(一个带GUI的简单计算器),但我无法使其工作。虽然编译器显示一切正常,但当我点击“=”得到结果时它显示0.0。我想这是因为:

a)结果变量在OperatorButtons中实例化,因此一旦关闭实例,它的值就会设置为0。如果是这种情况,我应该把它放在主要部分吗?

b)由于某种原因,我想在OperatorButtons中使用switch是错误的。

//声明变量

      private char previousOperator='+';
      private char currentOperator=' ';
      private double number1;
      private double result=0;
      private String numInStr="";

//设置数字按钮的事件处理程序

     private void NmbrBtn(java.awt.event.ActionEvent evt) {                         
            numInStr+=evt.getActionCommand();
            number1=Double.parseDouble(numInStr);
            tfDisplay.setText(numInStr);
        }                        

//为操作员设置事件处理程序(程序必须跟踪前一个操作符和当前操作符)

     private void OperatorButtons(java.awt.event.ActionEvent evt){                                  
            previousOperator=currentOperator;        
            currentOperator=evt.getActionCommand().charAt(0);


                switch (previousOperator){
                    case '+':result+=number1;
                    case '-':result-=number1;
                    case '*':result*=number1;
                    case '/':result/=number1;
                }

                numInStr="";

        }                                

//设置“=”

的处理程序
        private void EqualsBtn(java.awt.event.ActionEvent evt) {                           

            tfDisplay.setText(result+"");
        }           

1 个答案:

答案 0 :(得分:3)

switch个案例,在Java和几乎所有使用switch构造的语言中,通过落到他们下面的那个,除非你使用break。也就是说,如果previousOperator+,那么result+=number1;不仅会运行,还会运行result-=number1;以及其后的其他两个语句。如果previousOperator*,则result*=number1;result/=number1;都会运行。

添加break告诉编译器你不需要:

switch (previousOperator){
    case '+':result+=number1;break;
    case '-':result-=number1;break;
    case '*':result*=number1;break;
    case '/':result/=number1;break;
}

主观:空间等增强可读性,请考虑:

switch (previousOperator){
    case '+': result += number1; break;
    case '-': result -= number1; break;
    case '*': result *= number1; break;
    case '/': result /= number1; break;
}

注意看到应用运算符的容易程度。如果案例有break以外的多个陈述(或者,在我看来,即使它没有),请使用换行符和缩进:

switch (previousOperator){
    case '+':
        result += number1;
        break;
    case '-':
        result -= number1;
        break;
    case '*':
        result *= number1;
        break;
    case '/':
        result /= number1;
        break;
}

...但是对于除break以外的一个陈述,将它们全部放在一行上并不罕见。有空格。