在Java计算器程序中分配变量[处理赋值和变量]

时间:2012-02-05 22:06:34

标签: java parsing variables calculator

我目前正处于Java计算器程序的中间,一切似乎都正常,但我想要更多的功能。

截至目前,用户可以输入数学表达式,程序将解决它。但是,我希望程序将数值赋给x,y或z等变量。

示例输入/输出可以是:

  

输入表达式:x = 10/5

                    => 2
     

输入Expression: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 :(得分:0)

而不是线  返回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 = expr等语句时初始化它们     variable.put(name,value);

答案 1 :(得分:0)

我不知道这个答案对你有用,因为我不能很好地理解这个问题,但这里有一些建议:

  • 要将变量作为输入并打印其值,可以使用带有String键和Double值的HashMap(java.util.HashMap)。这可用于通过变量名称查找变量的值。通过解析表达式并查找值,可以将相同的映射用于复杂表达式,例如x + y * z。

  • 对于解析,您可以使用String类的方法,如indexOf,substring()等。还可以考虑使用StringTokenizer类,它可以采用分隔符(+, - ,*,/在您的情况下)并拆分表达式进入代币。