用Java构建一个基本的计算器,需要检查用户输入的数学表达式的有效性



我正在用Java构建一个基本的计算器,并有一些要求需要满足。它采用了用户示例中的数学表达式输入。3*5^5(必须用空格分隔(。我很难弄清楚如何将基本的数学表达式输入字符串math传递给isNumber函数,然后在该函数中检查字符串的第一个[0]点和之后的第四个点(因为空格还在吗?(是否有双精度。如果我把数学变成一个字符串数组,我可以做到,但需求特别指出,在之后我才能把字符串数学变成数组。我知道如果我能弄清楚这一点,那么制作一个运算符验证函数并对输入点执行同样的操作应该不难。。。这是我目前在这个项目上的进展。

import java.util.Scanner;
/**
*
* @author 
*/
public class Calculator2 {
static ArrayList<String> validOperators = new ArrayList<String>(){{
add("^");
add("*");
add("/");
add("+");
add("-");
}}; 

public static void main(String[] args) {
System.out.println("This is a text based calculator!");
Scanner in = new Scanner(System.in);        
boolean loop = true;
while (loop) {
System.out.println("Enter a math expression ot type quit to exit: ");
String math = in.nextLine();
if ("quit".equalsIgnoreCase(math)) {
System.out.print("Quitting");
break;
}

if (isOperator(math)){
if (isNumber(math)){
String[] splitExpression = math.split("\s+");
if(isValidExpression(splitExpression)){
for (int i=0; i<splitExpression.length; i++){
System.out.println(splitExpression[i]);
} 
System.out.println("Number of tokens: " + splitExpression.length);
}
}else {
System.out.println("invalid expression!");
}
}else{
System.out.println("please use valid operators");
}


}
}

public static boolean isNumber(String number){
return 
}
} ```

数字可以是可变长度的,可以有多个空格-你的方法(包括"检查第四个字符"(不起作用-你不能在这样的绝对位置上工作。它必须是相对的。

通常的方法是意识到你在这里构建了一个实际的语法,它可能会变得非常复杂(加上写括号的能力,它确实非常复杂(。看起来很简单,但事实并非如此。

一般来说,您首先对字符流进行标记,将其转换为节点流。CCD_ 1是一个节点。1.21398123也是如此。节点知道它们代表什么样的东西。

然后,将节点流转化为一棵树。然后你通过穿过树,从叶子一直到根部来计算结果。

i、 e,这个:

"10 * (2+3)"

首先变成:

List.of(
NumericNode.of(10), 
Operator.MULTIPLY,
Operator.OPEN_PAREN,
NumericNode.of(2),
Operator.ADD,
NumericNode.of(3),
Operator.CLOSE_PAREN);

然后变成:

*
/   
10   +
/ 
2  3

然后,您可以通过递归地折叠节点,将其简单地"解析"为50。

一旦你把它分解成这样,你可能就会知道:不是微不足道的。

你可以在网上搜索标记器和解析器技术来了解如何完成这项工作。这需要一些阅读。

相关内容

最新更新