2015-01-08 1 views
0

Я пытаюсь найти решение для этого в течение нескольких дней, и я не могу понять это. Я пишу программу, которая (в какой-то момент) принимает математические выражения и отображает ответ. Я использую синтаксический анализатор beanshell для этого, но оценка не является проблемой. Когда пользователь нажимает кнопку «Отменить», этот метод должен отменить последний вход (либо операцию (+ - * /), либо номер. Это дает мне ошибки в самое странное время, и я не могу понять, почему. может кто-нибудь помочь? Я хотел бы поблагодарить всех, кто помогает заранее!Анализ математических выражений со строками

public void undo(View v) throws EvalError{ 
    Interpreter interpreter1 = new Interpreter(); // interpreter to evaluate user solution 
    userExpressionList.remove(userExpressionList.size()-1); // remove last element of userExpressionList 
    String tempExp3 = ""; 
    if (userExpressionList.size() != 0){ 
     for (String element:userExpressionList) { 
      tempExp3 = tempExp3 + element; 
      if (tempExp3.substring(tempExp3.length() - 1).equals("+") || tempExp3.substring(tempExp3.length() - 1).equals("-") || 
       tempExp3.substring(tempExp3.length() - 1).equals("*") || tempExp3.substring(tempExp3.length() - 1).equals("/")) { 
        displaySolution = (Double)interpreter1.eval(tempExp3.substring(0, tempExp3.length() - 2)); 
        userSolution = tempExp3.substring(tempExp3.length() - 1); 
       } 
      else { 
       displaySolution = (Double) interpreter1.eval(tempExp3.substring(0, tempExp3.length() - 1)); 
       userSolution = ""; 
       } 
      Log.i("tempExp3", tempExp3); 
      Log.i("displaySolution", displaySolution.toString()); 
     } 
     textViewUserSolution.setText(displaySolution.toString()); 
    } 
    else { 
     clear(findViewById(R.id.clearButton)); 
     textViewUserSolution.setText(""); 
    } 
    Log.i("isExpectingNumber before invert", String.valueOf(isExpectingNumber)); 
    isExpectingNumber = !isExpectingNumber; 
    Log.i("isExpectingNumber after invert", String.valueOf(isExpectingNumber)); 
    textViewUserExpression.setText(tempExp3); 
} 

Если вам нужна дополнительная информация, пожалуйста, обращайтесь. Я очень признателен за любую помощь вы, ребята, можете предложить.

+4

Какие ошибки это дает вам и когда? – codeMagic

+1

userExpressionList.remove (userExpressionList.size() - 1) должен быть защищен userExpressionList.size()> 0. – laune

+0

Вы подтвердили, что список, имеющий значение – newuser

ответ

0

проблема очень вероятно, основываясь на предположении, что символ «вернуться» по характеру всегда будет приводить к тому, что можно оценить без проблем.

Рассмотрите:

1+23 - you can undo '3' and eval "1+2" 
1+2 - you can undo '2' but you can't eval "1+", just "1" 
1+2+ - you can undo '+' and eval "1+2" 

Поэтому

switch(exp3.charAt(exp3.length()-1)){ 
case '+': case '-': case '*': case '/': 
    // 1+2+ 
    sol = int.eval(exp3.substring(0, exp3.length()-1)); // not -2!  
    usrSol = exp3.substring(exp3.length() - 1); 
    break; 
default: 
    if(exp3.length() > 2){ 
     char d = exp3.charAt(exp3.length()-2); 
     if('0' <= d && d <= '9'){ 
      // 1+23 
      sol = int.eval(exp3.substring(0, exp3.length() - 1)); 
     } else { 
      // 1+2 
      sol = int.eval(exp3.substring(0, exp3.length() - 2)); 
     } 
    } else { 
     // "12" 
     sol = int.eval(exp3.substring(0, exp3.length() - 1)); 
    } 
    usrSol = ""; 
    break; 
} 

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

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