2016-06-04 1 views
4

Я работаю над калькулятором и имею всю функциональность. Единственная проблема заключается в том, что при вводе уравнения, содержащего два арифметических оператора, он работает неправильно. Например, если я нахожу «2 + √9», он возвращает 3, и если я нахожу «√9 + 2», он закроется и говорит «недействительный двойной √9». Пожалуйста помоги.калькулятор не обрабатывает два операторных уравнения

ScientificCalculator.java
String prevAnswer = ""; 
TextView formulascreen; 
TextView resultscreen; 
String formuladisplay = ""; 
String resultdisplay = ""; 
String result = ""; 
String operator; 
DecimalFormat res = new DecimalFormat("#,###,###,###.######"); 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.scientific_calculator, container, false); 

    formulascreen = (TextView) view.findViewById(R.id.formulaTextView); 
    updateformuladisplay(); 

    resultscreen = (TextView) view.findViewById(R.id.resultTextView); 
    updateresultdisplay(); 

    view.findViewById(R.id.btn0).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn3).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn4).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn5).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn6).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn7).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn8).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btn9).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickNumber(v); 
     } 
    }); 

    view.findViewById(R.id.btnSqrt).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClicksqrt(v); 
     } 
    }); 

    view.findViewById(R.id.btnClear).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickClear(v); 
     } 
    }); 

    view.findViewById(R.id.btnDel).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickDel(v); 
     } 
    }); 

    view.findViewById(R.id.btnAdd).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickOperator(v); 
     } 
    }); 

    view.findViewById(R.id.btnMinus).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickOperator(v); 
     } 
    }); 

    view.findViewById(R.id.btnDivide).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickOperator(v); 
     } 
    }); 

    view.findViewById(R.id.btnMultiply).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickOperator(v); 
     } 
    }); 

    view.findViewById(R.id.btnEquals).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickEquals(v); 
     } 
    }); 

    view.findViewById(R.id.btnPrevAns).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      onClickAns(v); 
     } 
    }); 

    return view; 
} 

public void onClickEquals(View view) { 

     getResult(); 
     updateresultdisplay(); 

} 

private boolean getResult() { 

    if (operator.equals("")) return false; 

    String[] operation = formuladisplay.split(Pattern.quote(operator)); 

    if (operation.length < 2) return false; 

    if (operator.equals("√")) { 

     result = String.valueOf(res.format(sqrtOp(operator, operation[1]))); 
     resultdisplay = result; 
     prevAnswer = result; 
     result = ""; 

    } 

    else { 

     result = String.valueOf(res.format(simpleOp(operation[0], operation[1], operator))); 
     resultdisplay = result; 
     prevAnswer = result; 
     result = ""; 

    } 

    return true; 

} 

public double simpleOp(String a, String b, String op) { 

    switch (op) { 

     case "+": 
      return Double.valueOf(a) + Double.valueOf(b); 

     case "-": 
      return Double.valueOf(a) - Double.valueOf(b); 

     case "x": 
      return Double.valueOf(a) * Double.valueOf(b); 

     case "÷": 
      return Double.valueOf(a)/Double.valueOf(b); 

     default: 
      return -1; 

    } 

} 

private void updateformuladisplay() { 

    formulascreen.setText(formuladisplay); 

} 

private void updateresultdisplay() { 

    resultscreen.setText(resultdisplay); 

} 

public void onClicksqrt(View view) { 

    Button b = (Button) view; 

    operator = b.getText().toString(); 

    formuladisplay += operator; 
    updateformuladisplay(); 

} 

public void onClickDel(View view) { 

    if (formuladisplay.length() >= 1) { 

     formuladisplay = formuladisplay.substring(0, formuladisplay.length() - 1); 
     updateformuladisplay(); 

    } 

} 

private void clear() { 

    formuladisplay = ""; 
    resultdisplay = ""; 

} 

public void onClickClear(View view) { 

    clear(); 
    updateformuladisplay(); 
    updateresultdisplay(); 

} 

public void onClickNumber(View view) { 

    //if (!(result.equals(""))) { 

     // clear(); 
     //updateformuladisplay(); 

    //} 

    Button b = (Button) view; 

    if (formuladisplay.length() >= 0 && formuladisplay.length() <= 17) { 

     formuladisplay += b.getText(); 
     updateformuladisplay(); 

    } 

    else { 

     updateformuladisplay(); 

    } 

} 

public void onClickOperator(View view) { 

    Button b = (Button) view; 

    operator = b.getText().toString(); 

    formuladisplay += operator; 
    updateformuladisplay(); 

} 

public double sqrtOp(String op, String a) { 

    switch (op) { 

     case "√": 
      return Math.sqrt(Double.valueOf(a)); 

     default: 
      return -1; 

    } 

} 

public void onClickAns(View view) { 

    Button b = (Button) view; 

    if (formuladisplay.length() >= 0 && formuladisplay.length() <= 10) { 

     formuladisplay += prevAnswer; 
     updateformuladisplay(); 

    } 

    else { 

     updateformuladisplay(); 

    } 

} 

}

+0

Вы должны использовать разделить выражение в суб выражении, то вычислить математическое calculaation –

+0

@DixitPanchal Не могли бы вы, пожалуйста, руководство меня, как я могу осуществить это в моем текущий код? Извините, я новичок –

ответ

0

Использование стека структуры данных для вычисления выражения .Try этого простого класса Вы можете добавить операцию SQRT в регулярном выражении

частных статических final Строковые операторы = "- +/*";

И добавить операцию sqrt в методе метода calcPostfix.

public class InfixPostfixEvaluator { 

     /** 
     * Operators in reverse order of precedence. 
     */ 
     private static final String operators = "-+/*"; 
     private static final String operands = ""; 

     public int evalInfix(String infix) { 
       return evaluatePostfix(convert2Postfix(infix)); 
     } 

     public String convert2Postfix(String infixExpr) { 
       char[] chars = infixExpr.toCharArray(); 
       Stack&lt;Character&gt; stack = new Stack&lt;Character&gt;(); 
       StringBuilder out = new StringBuilder(infixExpr.length()); 

       for (char c : chars) { 
         if (isOperator(c)) { 
           while (!stack.isEmpty() && stack.peek() != '(') { 
             if (operatorGreaterOrEqual(stack.peek(), c)) { 
               out.append(stack.pop()); 
             } else { 
               break; 
             } 
           } 
           stack.push(c); 
         } else if (c == '(') { 
           stack.push(c); 
         } else if (c == ')') { 
           while (!stack.isEmpty() && stack.peek() != '(') { 
             out.append(stack.pop()); 
           } 
           if (!stack.isEmpty()) { 
             stack.pop(); 
           } 
         } else if (isOperand(c)) { 
           out.append(c); 
         } 
       } 
       while (!stack.empty()) { 
         out.append(stack.pop()); 
       } 
       return out.toString(); 
     } 

     public int evaluatePostfix(String postfixExpr) { 
       char[] chars = postfixExpr.toCharArray(); 
       Stack&lt;Integer&gt; stack = new Stack&lt;Integer&gt;(); 
       for (char c : chars) { 
         if (isOperand(c)) { 
           stack.push(c - '0'); // convert char to int val 
         } else if (isOperator(c)) { 
           int op1 = stack.pop(); 
           int op2 = stack.pop(); 
           int result; 
           switch (c) { 
           case '*': 
             result = op1 * op2; 
             stack.push(result); 
             break; 
           case '/': 
             result = op2/op1; 
             stack.push(result); 
             break; 
           case '+': 
             result = op1 + op2; 
             stack.push(result); 
             break; 
           case '-': 
             result = op2 - op1; 
             stack.push(result); 
             break; 
           } 
         } 
       } 
       return stack.pop(); 
     } 
     private int getPrecedence(char operator) { 
       int ret = 0; 
       if (operator == '-' || operator == '+') { 
         ret = 1; 
       } else if (operator == '*' || operator == '/') { 
         ret = 2; 
       } 
       return ret; 
     } 
     private boolean operatorGreaterOrEqual(char op1, char op2) { 
       return getPrecedence(op1) &gt;= getPrecedence(op2); 
     } 

     private boolean isOperator(char val) { 
       return operators.indexOf(val) &gt;= 0; 
     } 

     private boolean isOperand(char val) { 
       return operands.indexOf(val) &gt;= 0; 
     } 

} 

Подробности читайте http://willcode4beer.com/design.jsp?set=evalInfix

http://www.java2novice.com/data-structures-in-java/stacks/infix-expression/

+0

Будет ли это работать, когда уравнение имеет операцию sqrt в начале? Как «√4 - 1»? –

+0

есть. вы должны использовать скобки, такие как sqrt (4-1). см. вторую ссылку в ответе – USKMobility

+0

Хорошо спасибо. Собираюсь прочитать об этом, реализовать его, и я дам вам знать, как это происходит :) –

 Смежные вопросы

  • Нет связанных вопросов^_^