Java實現簡單混合計算器

這個計算器並不是基於逆波蘭實現的,而是通過簡單的遞歸,一層一層地計算最終求得結果。

具體的圖形化界面可以參考我的另外一個篇博客:基於逆波蘭表達式實現圖形化混合計算器,這裏我只是簡單的介紹一下怎樣求得算術表達式的結果,另外如果有需要可以加入另外那個博客中的Check方法,來檢查表達式的合法性。

計算表達式的算式如下所示(GitHub倉庫地址):

import java.math.BigDecimal;
import java.util.Scanner;

public class Calculator {
    private String expression;
    public static void main(String[] args) {
        System.out.print("輸入算式:");
        Scanner scanner = new Scanner(System.in);
        String express = scanner.nextLine();
        Calculator calculator = new Calculator(express);
        System.out.println(calculator.Calculated());
    }
    public Calculator(String expression) {
        this.expression = expression;
    }
    public String Calculated() {
        if (expression == null || expression.trim().equals("")) { //如果算式爲空,返回"0"
            return "0";
        }
        int a1 = expression.indexOf("+"); //求出第一個"+"的位置
        int a2 = expression.indexOf("-"); //求出第一個"-"的位置
        int a3 = expression.indexOf("*"); //求出第一個"*"的位置
        int a4 = expression.indexOf("/"); //求出第一個"/"的位置
        int a5 = expression.indexOf("("); //求出第一個"("的位置
        int a6 = expression.lastIndexOf(")"); //求出最後一個")"的位置
        //如果都不存在
        if (a1 == -1 && a2 == -1 && a3 == -1 && a4 == -1 && a5 == -1 && a6 == -1) {
            if (expression.trim() == null || expression.trim().equals("")) { //如果爲空,返回Error!
                return "Error";
            }
            return expression.trim(); //直接返回
        }
        if (a5 != -1 && a6 > a5) { //存在配對的括號
            //計算出括號裏面的內容
            String str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
            if (str.equals("Error!")) {//如果返回"Error!",有可能是()()這種形式
                a6 = expression.indexOf(")"); //得到第一個")"位置
                if (a6 > a5) {//如果右括號在左括號的右邊
                    //計算出括號裏面的內容
                    str = new Calculator(expression.substring(a5 + 1, a6).trim()).Calculated();
                    if (str.equals("Error!")) //如果得到"Error!"
                        return str; //直接返回
                }
                else return "Error!";
            }
            expression = expression.replace(expression.substring(a5, a6 + 1), str);
            return new Calculator(expression).Calculated();
        }
        else if (a5 != -1 || a6 != -1) //括號不匹配
            return "Error!";
        if (a1 != -1) { //有加號
            String str1 = new Calculator(expression.substring(0, a1)).Calculated();
            String str2 = new Calculator(expression.substring(a1 + 1, expression.length())).Calculated();
            //如果其中一個返回"Error!",直接返回"Error!"
            if (str1.equals("Error!") || str2.equals("Error!"))
                return "Error!";
            //計算
            return String.valueOf(Double.parseDouble(str1) + Double.parseDouble(str2));
        }
        if (a2 != -1) { //有減號
            String str1 = new Calculator(expression.substring(0, a2)).Calculated();
            String str2 = new Calculator(expression.substring(a2 + 1, expression.length())).Calculated();
            //如果其中一個返回"Error!",直接返回"Error!"
            if (str1.equals("Error!") || str2.equals("Error!"))
                return "Error!";
            //計算
            return String.valueOf(Double.parseDouble(str1) - Double.parseDouble(str2));
        }
        if (a3 != -1) { //有乘號
            String str1 = new Calculator(expression.substring(0, a3)).Calculated();
            String str2 = new Calculator(expression.substring(a3 + 1, expression.length())).Calculated();
            //如果其中一個返回"Error!",直接返回"Error!"
            if (str1.equals("Error!") || str2.equals("Error!"))
                return "Error!";
            //計算
            return String.valueOf(Double.parseDouble(str1) * Double.parseDouble(str2));
        }
        if(a4 != -1) { //有除號
            String str1 = new Calculator(expression.substring(0, a4)).Calculated();
            String str2 = new Calculator(expression.substring(a4 + 1, expression.length())).Calculated();
            //如果其中一個返回"Error!"或除數爲0,直接返回"Error!"
            if (str1.equals("Error!") || str2.equals("Error!") || Double.parseDouble(str2) == 0.0)
                return "Error!";
            //舍入計算
            BigDecimal a = new BigDecimal(Double.parseDouble(str1));
            BigDecimal b = new BigDecimal(Double.parseDouble(str2));
            return a.divide(b, 5, BigDecimal.ROUND_HALF_UP).toString();
        }
        return expression.trim();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章