Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java构建一个基本计算器,需要检查用户输入的数学表达式的有效性_Java - Fatal编程技术网

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

用Java构建一个基本计算器,需要检查用户输入的数学表达式的有效性,java,Java,我正在用Java构建一个基本的计算器,需要满足一些要求。它接受来自用户示例的数学表达式输入。3*5^5(必须用空格分隔)。 我很难弄清楚如何将基本数学表达式输入字符串数学传递给isNumber函数,然后在该函数中检查字符串的第一个[0]点和每第四个点(因为空格仍在其中?)之后的双精度。如果我将数学转换为字符串数组,我就可以这样做,但要求明确指出,直到之后我才能将字符串数学转换为数组。我知道如果我能弄明白这一点,那么做一个操作符验证函数并对输入点做同样的操作应该不难。。。 这是我目前在这个项目上的

我正在用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上搜索标记器和解析器技术,了解如何完成此工作。这需要一些阅读。

看起来您需要先拆分。然后,进行检查。