Назначение переменных в программе Java Calculator [Обработка назначений и переменных] - PullRequest
0 голосов
/ 06 февраля 2012

Я в настоящее время нахожусь в центре программы калькулятора Java, и все, кажется, работает правильно, но я хочу больше функциональности.

На данный момент пользователь может ввести математическое выражение, и программа его решит. Однако я бы хотел, чтобы программа присваивала числовые значения переменным, таким как x, y или z.

Пример ввода / вывода может быть:

Введите выражение: x = 10/5

                    => 2

Введите выражение: x

                    => 2
public class Calculator
{
   String expstring;
   int cursor;
   double x;
   double y;
   double z;


   public Calculator()
   {
      expstring = null;
      x = 0;
      y = 0;
      z = 0;
   }

   public Calculator(String instring)
   {
    expstring = instring;
    cursor = 0;
   }

   public void setExpression(String estring)
   {
      expstring = estring;
      cursor = 0;
   }

   public float evalExp()
   {
      if (expstring == null)
      {
         System.err.println("There is no expression to evaluate.");
         System.err.println("Call setExpression() before calling getResult().");
         return 0;
      }
      cursor = 0;
      float result = evalTerm();
      while (nextOperator('+') || nextOperator('-'))
      {
         char operator = getOperator();
         float term = evalTerm();
         if (operator == '+')
            result = result + term;
     if (operator == '-')
        result -= term;
         else
            System.err.println("Invalid operator: " + operator);
      }
      return result;
   }

   private float evalTerm()
   {
      float result = getOperand();
      while (nextOperator('*') || nextOperator('/'))
      {
         char operator = getOperator();
         float term = getOperand();
         if (operator == '*')
            result = result * term;
     if (operator == '/')
        result /= term;
         else
            break;
      }
      return result;
   }


   private float getOperand()
   {
      if (cursor >= expstring.length())
         return 0;
      String opstring = "";
      char nextchar = expstring.charAt(cursor);
      if (nextchar == '-')
      {
         opstring = opstring + '-';
         cursor++;
         nextchar = expstring.charAt(cursor);
      }
/**      if (nextchar == 'x')
      {
     x =    
      }
*/
      while (cursor < expstring.length() && !isOperator(nextchar))
      {
         opstring = opstring + nextchar;
         cursor++;
         if (cursor < expstring.length())
            nextchar = expstring.charAt(cursor);
      }
      return Float.parseFloat(opstring);
   }

   private char getOperator()
   {
      char operator = expstring.charAt(cursor);
      cursor++;
      return operator;
   }

   private boolean nextOperator(char op)
   {
      if (cursor < expstring.length() && expstring.charAt(cursor) == op)
         return true;
      else
         return false;
   }

   private boolean isOperator(char c)
   {
      String opset = "+*-/";
      return (opset.indexOf(c) >= 0);
   }
}

Вот то, что я до сих пор работал, но я не уверен, как реализовать это в коде ... Обработка переменных и присваиваний может быть встроена как особые случаи в логическую структуру выше, или это может быть сделано в отдельной логике до / после вычисления выражения. Вашему классу калькулятора понадобится поле для хранения значения каждой переменной (x, y и z). В присваивании первый операнд является именем переменной, а первый оператор - =. Значение выражения справа от = должно быть оценено, и затем значение может быть сохранено в поле, соответствующем переменной. Если x, y или z присутствует в выражении справа от =, его текущее значение можно найти в соответствующем поле. Переменные могут быть заменены их значениями в коде, который получает следующий операнд, или значения переменных могут быть вставлены в отдельный проход через выражение перед его оценкой.

Любая помощь, подстрекательские ссылки или предложения будут великолепны!

Я новичок в программировании и хотел бы узнать.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2012

Я не знаю, будет ли этот ответ полезным для вас, поскольку я не очень хорошо понимаю проблему, но вот несколько предложений:

  • Чтобы взять переменную в качестве входных данных ираспечатать его значение вы можете использовать HashMap (java.util.HashMap) со строковыми ключами и значениями Double.Это может быть использовано для поиска значений переменных по именам переменных.Эту же карту можно использовать для сложного выражения, такого как x + y * z, путем анализа выражения и поиска значений.

  • Для анализа можно использовать методы класса String, такие как indexOf., substring () и т. д. Также рассмотрите возможность использования класса StringTokenizer, который может принимать разделители (+, -, *, / в вашем случае) и разбивать выражение на токены.

0 голосов
/ 06 февраля 2012

вместо строки return Float.parseFloat (opstring);вы можете проверить, начинается ли opstring с цифры, что-то вроде

if (Character.isDigit(opstring.charAt(0)))
    return Float.parseFloat(opstring);
else
    return variables.get(opstring); // add additional test for null value!

, вы можете объявить контейнер переменных в вашем классе как

final Map<String,Float> variables=new HashMap<String,Float>();

и инициализировать их, когда ваш синтаксический анализатор встречает операторы вроде var = exprvariable.put (имя, значение);

...