我目前正在执行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出现在=右侧的表达式中,则可以在相应的字段中找到其当前值。变量可以在获取下一个操作数的代码中替换为其值,也可以在对表达式求值之前将变量值插入到单独的传递中。
任何帮助、煽动性链接或建议都将非常棒
我是编程界的新手,很想学习
而不是行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的语句时初始化它们variable.put(名称、值);
我不知道这个答案是否对你有用,因为我不能很好地理解这个问题,但这里有一些建议:
-
要将变量作为输入并打印其值,可以使用带有String键和Double值的HashMap(java.util.HashMap)。这可以用于按变量名查找变量的值。通过解析表达式并查找值,可以将相同的映射用于复杂表达式,如x+y*z。
-
对于解析,您可以使用String类的方法,如indexOf、substring()等。还可以考虑使用StringTokenizer类,该类可以使用分隔符(+、-、*、/),并将表达式拆分为标记。