Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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_Parsing_Operator Precedence - Fatal编程技术网

Java 计算器类,在单个输入行中解析和处理多个操作

Java 计算器类,在单个输入行中解析和处理多个操作,java,parsing,operator-precedence,Java,Parsing,Operator Precedence,我正在学习一个计算器类,以便更好地理解Java。下面是我的代码的一个框架,给你一个想法。目前,它只能处理简单的命令,例如2+2,2/2,2^2,等等 有人能就如何从这里开始提供指导或示例吗 如何调整解析器以理解更复杂的命令,例如(2+(2*2^2))/2?另外,如何调整方法以接受任意数量的参数?我使用数组来存储我的值和运算符。也许我可以使用ArrayList,这样它就可以处理任意数量的元素/参数 如何建立通用指南和操作顺序(PEMDAS)来指导我的程序的计算 谢谢你的帮助 import

我正在学习一个计算器类,以便更好地理解Java。下面是我的代码的一个框架,给你一个想法。目前,它只能处理简单的命令,例如
2+2
2/2
2^2
,等等

有人能就如何从这里开始提供指导或示例吗

  • 如何调整解析器以理解更复杂的命令,例如
    (2+(2*2^2))/2
    ?另外,如何调整方法以接受任意数量的参数?我使用数组来存储我的值和运算符。也许我可以使用ArrayList,这样它就可以处理任意数量的元素/参数

  • 如何建立通用指南和操作顺序(PEMDAS)来指导我的程序的计算

  • 谢谢你的帮助

        import java.util.Scanner;
    
        public abstract class Calc 
        {
            private static double num1, num2;
    
            public static void start()
            {
                System.out.println("Calculator. Type \"exit\" to quit.");
                System.out.print("> ");
    
                Scanner scan = new Scanner(System.in);       
                String entry = scan.nextLine();
    
                while (! (entry.equals("exit")))
                {    
    
                    String [] operands = entry.replaceAll("\\s+", "").split("[\\+\\-\\/\\*\\%\\^]");        
                    String operator = entry.replaceAll("(\\s+|\\d+|\\.)", "");
    
                    Double [] numbers = new Double[operands.length];
                    for (int i = 0; i < operands.length; i++)
                    {
                        numbers[i] = new Double(operands[i]);
                    }
    
                    num1 = numbers[0];
                    num2 = numbers[1];
    
                    double result = 0;
    
                    switch (operator)
                    {
                        case "+":
                            result = Calc.add(num1, num2);
                            break;
                        case "-":
                            ...
                        case "*":
                            ...
                        case "/":
                            ...
                        case "^":
                            ...
                        case "%":
                           ...
                        default:
                            System.out.println("Not valid.");
                    }
    
                    System.out.println(result);
                    System.out.print("> ");
                    entry = scan.nextLine();
                }
            }
    
            public static double add(double num1, double num2)
            {
                double sum = num1 + num2;
                return sum;
            }
    
            public static double subtract(double num1, double num2)
            {
                ...
            }
    
            public static double multiply(double num1, double num2)
            {
                ...
            }
    
            public static double divide(double num1, double num2)
            {
                ...
            }
    
            public static double exponentiate(double num1, double num2)
            {
                ...
            }
    
            public static double modulus(double num1, double num2)
            {
                ...
            }
        }
    
    import java.util.Scanner;
    公共抽象类计算
    {
    专用静态双num1,num2;
    公共静态void start()
    {
    System.out.println(“Calculator.Type\'exit\'toquit.”);
    系统输出打印(“>”);
    扫描仪扫描=新扫描仪(System.in);
    String entry=scan.nextLine();
    而(!(entry.equals(“exit”))
    {    
    字符串[]操作数=entry.replaceAll(“\\s+”,”).split(“[\+\-\\/\*\\%\^]”);
    字符串运算符=entry.replaceAll(“(\\s+\\\d+\\”,”);
    Double[]number=新的双精度[operands.length];
    for(int i=0;i”);
    entry=scan.nextLine();
    }
    }
    公共静态双加(双num1,双num2)
    {
    双和=num1+num2;
    回报金额;
    }
    公共静态双减法(双num1,双num2)
    {
    ...
    }
    公共静态双乘法(双num1,双num2)
    {
    ...
    }
    公共静态双除法(双num1,双num2)
    {
    ...
    }
    公共静态双指数(双num1,双num2)
    {
    ...
    }
    公共静态双模量(双num1,双num2)
    {
    ...
    }
    }
    
    一个非常简单的方法是多次运行它。 假设你有下面的表达式
    2+2*2^2/2
    首先运行并执行指数运算。你只剩下
    2+2*4/2
    然后运行和到乘法/除法
    2+4
    然后是加减法
    6
    塔达


    您可能希望将表达式存储为字符串,并对正在查找的运算符进行解析。然后得到相邻的数字,把整个数字压缩成一个数字。圆括号有点难,但是可以用递归的方法完成。只需在括号的每个级别上执行上述方法。

    一个非常简单的方法是多次运行它。 假设你有下面的表达式
    2+2*2^2/2
    首先运行并执行指数运算。你只剩下
    2+2*4/2
    然后运行和到乘法/除法
    2+4
    然后是加减法
    6
    塔达


    您可能希望将表达式存储为字符串,并对正在查找的运算符进行解析。然后得到相邻的数字,把整个数字压缩成一个数字。圆括号有点难,但是可以用递归的方法完成。只需在括号的每个级别上执行上述方法。

    查看解析数学表达式算法,如,然后计算表达式。这不是您要求的-但您可能希望使用
    BigDecimal
    而不是
    double/double
    。否则,当你计算
    0.1+0.2
    时,你可能会得到一个严重的惊喜。然后
    按下所有左括号,直到找到右括号,然后我就可以开始弹出了。@LuiggiMendoza谢谢,我会看看的@戴维德瓦尔斯:好主意。我以前没有使用过BigDecimal,但我知道它的用法。您知道如何调整我的方法(add()、subtract()、exponentiate()等)以接受BigDecimal参数并返回BigDecimal对象吗?请查看类似的解析数学表达式算法,然后对表达式求值。这不是您要求的-但您可能希望使用
    BigDecimal
    而不是
    double/double
    。否则,当你计算
    0.1+0.2
    时,你可能会得到一个严重的惊喜。然后
    按下所有左括号,直到找到右括号,然后我就可以开始弹出了。@LuiggiMendoza谢谢,我会看看的@戴维德瓦尔斯:好主意。我以前没有使用过BigDecimal,但我知道它的用法。您知道如何调整我的方法(add()、subtract()、exponentiate()等)以接受BigDecimal参数并返回BigDecimal对象吗?这个问题