2012-02-05 24 views
0

我目前处于Java计算器程序的中间,一切似乎都正常工作,但我需要更多的功能。在Java计算器程序中分配变量[处理分配和变量]

截至目前,用户可以输入一个数学表达式,程序将解决它。但是,我希望程序为变量(如x,y或z)分配数值。

样品输入/输出可以是:

输入表达式:x =5分之10

    => 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出现在=右侧的表达式中,则可以在相应的字段中找到它的当前值。这些变量可以用获取下一个操作数的代码中的值替换,也可以在评估之前通过表达式单独插入变量值。

任何帮助,煽动性链接或建议将是伟大的!

我是编程界新人,很想学习。

回答

0

而不是行 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 = EXPR 变量初始化。把(名字,价值);

+0

我会将所有这一切都添加到getOperand()方法呢? – khoops66 2012-02-05 22:31:09

0

我不知道,因为我无法理解这个问题非常好,但这里有一些建议,这个答案将是对你有用:

  • 举一个变量作为输入和输出它的价值,你可以使用带有String键和Double值的HashMap(java.util.HashMap)。这可以用来通过变量名来查找变量的值。通过解析表达式并查找值,可以将相同的映射用于复杂表达式,如x + y * z。

  • 对于解析,您可以使用String类的方法,如indexOf,substring()等。另外考虑使用StringTokenizer类,它可以使用分隔符(+, - ,*,/在你的情况下)并将表达式分割为标记。