用Java构建一个基本计算器,需要检查用户输入的数学表达式的有效性
我正在用Java构建一个基本的计算器,需要满足一些要求。它接受来自用户示例的数学表达式输入。3*5^5(必须用空格分隔)。 我很难弄清楚如何将基本数学表达式输入字符串数学传递给isNumber函数,然后在该函数中检查字符串的第一个[0]点和每第四个点(因为空格仍在其中?)之后的双精度。如果我将数学转换为字符串数组,我就可以这样做,但要求明确指出,直到之后我才能将字符串数学转换为数组。我知道如果我能弄明白这一点,那么做一个操作符验证函数并对输入点做同样的操作应该不难。。。 这是我目前在这个项目上的进展用Java构建一个基本计算器,需要检查用户输入的数学表达式的有效性,java,Java,我正在用Java构建一个基本的计算器,需要满足一些要求。它接受来自用户示例的数学表达式输入。3*5^5(必须用空格分隔)。 我很难弄清楚如何将基本数学表达式输入字符串数学传递给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
}
} ```
import java.util.Scanner;
/**
*
*@作者
*/
公共类计算器2{
静态ArrayList validOperators=新ArrayList(){{
加上(“^”);
添加(“*”);
加上(“/”);
加上“+”;
加上(“—”;
}};
公共静态void main(字符串[]args){
System.out.println(“这是一个基于文本的计算器!”);
扫描仪输入=新扫描仪(系统输入);
布尔循环=真;
while(循环){
System.out.println(“输入数学表达式或键入quit以退出:”);
字符串数学=in.nextLine();
如果(“退出”。相等信号案例(数学)){
系统输出打印(“退出”);
打破
}
if(等参算子(数学)){
如果(isNumber(数学)){
字符串[]splitExpression=math.split(\\s+);
if(isValidExpression(splitExpression)){
对于(int i=0;i数字可以是可变长度的,可以有多个空格-您的方法(包括“检查第四个字符”)无法工作-您无法在这样的绝对位置工作。它必须是相对的
通常的方法是意识到你已经在这里构建了一个实际的语法,它可能变得相当复杂(再加上写括号的能力,它确实相当复杂)。看起来很简单,但事实并非如此
通常,首先标记化,将字符流转换为节点流。+
是一个节点。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
然后变成:
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
一旦你把它分解成这样,你可能就知道了:不是琐碎的
您可以在web上搜索标记器和解析器技术,了解如何完成此工作。这需要一些阅读。看起来您需要先拆分。然后,进行检查。