簡體   English   中英

計算器類,在單個輸入行中解析和處理多個操作

[英]Calculator class, parsing and processing multiple operations in single input line

我正在研究一個計算器類,以更好地理解Java。 以下是我的代碼框架,可為您提供一個想法。 目前,它只能處理簡單的命令,例如2+2 2/2 2^2等。

任何人都可以從此處開始提供指導或示例嗎?

  1. 如何調整解析器以了解更復雜的命令,例如(2 + (2 * 2^2)) / 2 另外,如何調整我的方法以接受任意數量的參數? 我使用數組存儲我的值和運算符。 也許我可以使用ArrayList,以便它可以處理任意數量的元素/參數?

  2. 如何建立一般准則和操作順序(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)
        {
            ...
        }
    }

一種非常簡單的方法是多次運行。 說你有以下表達

2 + 2 * 2^2 / 2

首先運行並做指數。 你留下了

2 + 2 * 4 / 2

然后遍歷並進行乘法/除法

2 + 4

然后加/減

6

塔達!

您可能希望將表達式存儲為String並解析所要查找的運算符。 然后得到相鄰的數字並將整個東西縮小為一個數字。 括號稍微難一點,但是可以用遞歸的方法幾乎完全相同。 只需對每個括號級別執行上述方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM