我目前正处于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出现在=右边的表达式中,则可以在相应的字段中找到其当前值。变量可以在获取下一个操作数的代码中替换为它们的值,或者可以在计算它之前将变量值插入到表达式的单独传递中。
任何帮助,煽动性链接或建议都会很棒!
我是编程领域的新手,想学习。
答案 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类,它可以采用分隔符(+, - ,*,/在您的情况下)并拆分表达式进入代币。