這是用來交課間做業的,所以沒有通用性,功能也只是簡單+和-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(); } }