簡單的非通用計算器

這是用來交課間做業的,所以沒有通用性,功能也只是簡單+和-java

而且因爲是要求放到安卓上的,因此輸入只是容許單個 0 - 9 和 +-,當=時計算,或者BACK!時撤回上一步android

沒啥優雅的寫法啊,只是既然花了時間,那總得記錄一下這糟糕的過程吧express

UPD.更新了支持加減乘除的版本,使用逆波蘭表達式,實現上較暴力app

StringUtil類,用了個簡單的正則(放棄小數點了。。)ui

package com.cal;

public class StringUtil {
    
    private StringUtil() {}
    
    static public boolean hasLength(String str) {
        return str != null && !"".equals(str);
    }
    
    // 默認輸入只有 0-9 + -
    static public boolean isNum(String str) {
        if(!hasLength(str)) {
            return false;
        }
//        return str.matches("\\d*\\.?\\d+");
        return str.matches("\\d+");
    }
        
    static public boolean isOperator(String str) {
        if(!hasLength(str)) {
            return false;
        }
        return !isNum(str) && !".".equals(str); // .暫時廢棄
    }
}

CalExpression類,用於處理輸入語法表達式的簡單緩衝(方便回退操做)及格式化this

package com.cal;

import java.util.ArrayList;

public class CalExpression {
    
    private StringBuilder expression;
    private ArrayList<String> inputRecord;
    
    public CalExpression() {
        expression = new StringBuilder();
        inputRecord = new ArrayList<>();
    }
    
    public void next(String input) {
//        if(StringUtil.isNum(input)) {
//            expression.append(input);
//        } else if(inputRecord.size() == 0) {
//            expression.append(input + " ");
//        } else {
//            expression.append(" " + input + " ");
//        }
        inputRecord.add(input);
    }
    public void back() {
        if(inputRecord.size() == 0) return;
        inputRecord.remove(inputRecord.size()-1);
    }
    
    public String done() {
        for(int i = 0; i < inputRecord.size(); i++) {
            String elem = inputRecord.get(i);
            if(".".equals(elem)) {
                expression.append(elem);
            } else if(StringUtil.isNum(elem)) {
                expression.append(elem);
            } else if(inputRecord.size() == 0) {
                expression.append(elem + " ");
            } else {
                expression.append(" " + elem + " ");
            }
        }
        return expression.toString();
    }
    
    public String toString() {
        return expression.toString();
    }
    
}

Calculator類,真正用於計算邏輯和判斷噁心錯誤code

package com.cal;

// 本計算姬目前已經支持 + - 和判斷式子正確的能力
// 下一步增長撤回一格的操做 // OK!
// 下下一步增長小數點的支持 // 太麻煩啦!
// 下下下一步增長 x / 括號的支持
public class Calculator {
    
    private String expression;
    private boolean validExpression;
    
    public Calculator() {
        validExpression = false;
        expression = new String();
    }
    
    public Calculator(CalExpression expression) {
        this.expression = expression.done();
        validExpression = check();
    }
    
    public boolean setExpression(CalExpression exp) {
        this.expression = exp.done();
        validExpression = check();
        return validExpression;
    }
    
    public int calculate() {
        if(!check()) {
            validExpression = false;
            return -1;
        } else {
            return getAnswer();
        }
    }
    
    public boolean check() {
        if(!StringUtil.hasLength(expression)) {
            return false;
        }
        String[] elems = expression.split(" ");
        boolean lastIsOp = false;
        for(int i = 0; i < elems.length; i++) {
            
            String elem = elems[i];
            
//            System.out.println("{"+elem+"}");
            
            if(StringUtil.hasLength(elem) == false) {
                continue;
            }
            if(StringUtil.isOperator(elem) && lastIsOp) {
                return false;
            }
            if(i == elems.length-1 && StringUtil.isOperator(elem)) {
                return false;
            }
            lastIsOp = StringUtil.isOperator(elem) ? true : false;
        }
        return true;
    }
    
    protected boolean isVaild() {
        return validExpression;
    }
    
    public int getAnswer() {
        if(!StringUtil.hasLength(expression)) {
            return -1;
        }
//        System.out.println(Character.toString(expression.charAt(0)));
        if(StringUtil.isOperator(Character.toString(expression.charAt(0)))) { // 修正負號問題
            expression = "0 " + expression;
        }
        int ans = 0, lastOp = 1;
        String[] elems = expression.split(" ");
        for(int i = 0; i < elems.length; i++) {
            String elem = elems[i];
            if(StringUtil.isNum(elem)) {
                ans += lastOp * Integer.valueOf(elem);
            } else {
                lastOp = "+".equals(elem) ? 1 : -1;
            }
        }
        return ans;
    }

    public String getExpression() {
        return String.join("", expression.split(" "));
    }
    
    public String toString() {
        return getExpression();
    }
    
}

輸入類,上課時把它換掉android邏輯就ok了ci

package com.cal;

import java.util.Scanner;


public class InputExpression {
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        Calculator cal = new Calculator();
        CalExpression exp = new CalExpression();
        while(cin.hasNext()) {
            String input = cin.next();
            if(input.contentEquals("BACK!")) {
                exp.back();
            } else if(input.equals("=")) {
                cal.setExpression(exp);
                System.out.println("exp: " + exp.toString());
                System.out.println("cal: " + cal.toString());
                if(cal.isVaild() == false) {
                    System.out.println("Please input correctly");
                } else {
                    System.out.println(cal.getAnswer());
                }
                cal = new Calculator();
                exp = new CalExpression();
            } else {
                exp.next(input);
            }
        }
        cin.close();
    }
}

暴力V2rem

package com.lpy.calculator;

import java.util.Scanner;
import java.util.Stack;

public class CalculatorExpression {
    
    public static Stack<Character> st_ch;
    public static Stack<Double> st_num;
    
    public static void cal1() {
        char ch = st_ch.peek();
        while(ch != '(') {
            double num1 = st_num.pop();
            double num2 = st_num.pop();
            switch(ch) {
            case '+':
                num2 += num1;
                break;
            case '-':
                num2 -= num1;
                break;
            case '*':
                num2 *= num1;
                break;
            case '/':
                num2 /= num1;
                break;
            default:
                break;
            }
            st_num.push(num2);
            st_ch.pop();
            ch = st_ch.peek();
        }
    }
    
    public static void cal2() {
        char ch = st_ch.peek();
        while(ch == '*' || ch == '/') {
            double num1 = st_num.pop();
            double num2 = st_num.pop();
            switch(ch) {
            case '*':
                num2 *= num1;
                break;
            case '/':
                num2 /= num1;
                break;
            default:
                break;
            }
            st_num.push(num2);
            st_ch.pop();
            ch = st_ch.peek();
        }
    }
    

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);       
        while(sc.hasNext()) {
            st_ch = new Stack<>();
            st_num = new Stack<>();
            st_ch.push('(');
            String str = sc.next();
            try {
                StringBuilder str_num = new StringBuilder("");
                for(int i = 0; i < str.length(); i++) {
                    String ch = Character.toString(str.charAt(i));
                    if(ch.matches("\\d") || ".".equals(ch)) {
                        str_num.append(ch);
                        continue;
                    }
                    if("".equals(str_num.toString()) == false) {
                        st_num.push(Double.valueOf(str_num.toString()));
                        str_num = new StringBuilder("");
                    }
                    switch(str.charAt(i)) {
                    case '+':
                    case '-':
                        cal1();
                        st_ch.push(str.charAt(i));
                        break;
                    case '*':
                    case '/':
                        cal2();
                        st_ch.push(str.charAt(i));
                        break;
                    case '(':
                        st_ch.push('(');
                        break;
                    case ')':
                    case '=':
                        cal1();
                        st_ch.pop();
                        break;
                    }
                }
                System.out.println(st_num.pop());
            } catch(Exception e) {
                System.out.println("Error!");
            }
        }
        sc.close();
    }
}
相關文章
相關標籤/搜索