20172333 2017-2018-2 《程序設計與數據結構》四則運算報告(2)
阿新 • • 發佈:2018-05-09
mage 表達式 pen info 個數 及其 優先 負責 結構
1.生成題目(一共四級題目+-*/,每一級都可能含有分數隨機的)
20172333 2017-2018-2 《程序設計與數據結構》實驗2報告(2)
1.結對成員
嚴域俊20172333
2.小組結對合作圖片
3.項目中自己負責的部分
package ddaadada; import java.util.*; public class LT { public char[] op = {'+','-','*','/','(',')'}; public String[] strOp = {"+","-","*","/","(",")"}; public boolean isDigit(char c){ if(c>='0'&&c<='9'){ return true; } return false; } public boolean isOp(char c){ for(int i=0;i<op.length;i++){ if(op[i]==c){ return true; } } return false; } public boolean isOp(String s){ for(int i=0;i<strOp.length;i++){ if(strOp[i].equals(s)){ return true; } } return false; } /** * 處理輸入的計算式 * @param str * @return */ public List<String> work(String str){ List<String> list = new ArrayList<String>(); char c; StringBuilder sb = new StringBuilder(); for(int i=0;i<str.length();i++){ c = str.charAt(i); if(isDigit(c)){ sb.append(c); } if(isOp(c)){ if(sb.toString().length()>0){ list.add(sb.toString()); sb.delete(0, sb.toString().length()); } list.add(c+""); } } if(sb.toString().length()>0){ list.add(sb.toString()); sb.delete(0, sb.toString().length()); } return list; } public void printList(List<String> list){ for(String o:list){ System.out.print(o+" "); } } /** * 中綴表達式轉化為後綴表達式 * 1,遇到數字輸出 * 2,遇到高優先級的全部出棧 * 3,最後全部出棧 */ public List<String> InfixToPostfix(List<String> list){ List<String> Postfixlist = new ArrayList<String>();//存放後綴表達式 Stack<String> stack = new Stack<String>();//暫存操作符 //stack.push('#'); for(int i=0;i<list.size();i++){ String s = list.get(i); if(s.equals("(")){ stack.push(s); }else if(s.equals("*")||s.equals("÷")){ stack.push(s); }else if(s.equals("+")||s.equals("-")){ if(!stack.empty()){ while(!(stack.peek().equals("("))){ Postfixlist.add(stack.pop()); if(stack.empty()){ break; } } stack.push(s); }else{ stack.push(s); } }else if(s.equals(")")){ while(!(stack.peek().equals("("))){ Postfixlist.add(stack.pop()); } stack.pop(); }else{ Postfixlist.add(s); } if(i==list.size()-1){ while(!stack.empty()){ Postfixlist.add(stack.pop()); } } } return Postfixlist; } /** * 後綴表達式計算 */ public int doCal(List<String> list){ Stack<Integer> stack = new Stack<Integer>(); for(int i=0;i<list.size();i++){ String s = list.get(i); int t=0; if(!isOp(s)){ t = Integer.parseInt(s); stack.push(t); }else{ if(s.equals("+")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2+a1; stack.push(v); }else if(s.equals("-")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2-a1; stack.push(v); }else if(s.equals("*")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2*a1; stack.push(v); }else if(s.equals("÷")){ int a1 = stack.pop(); int a2 = stack.pop(); int v = a2/a1; stack.push(v); } } } return stack.pop(); }
4.個人貢獻度劃分
可以說應該算是各自百分之五十吧,因為我們組內就兩個人,所以分工很明確的,由他完成題目輸出而我則是中綴轉後綴,但是現在面臨合並的問題,然後我兩共同思考編寫方法,所以沒有說誰偷懶之類的,大家都很努力編寫,也希望盡快完成吧。
5.相關代碼截圖
1.生成題目(一共四級題目+-*/,每一級都可能含有分數隨機的)
2.中綴轉後綴加計算 圖1234
3.判斷答案及其正確率 圖1
6.關鍵代碼
1.生成題目(代碼上一部分有)
- [x] 思路解釋:我們原本是要用符號個數來代表題目等級的,後來涉及到中綴轉後綴不方便,就換了一個思路,那就是分為0,1,2,3四個等級,每一個等級都只有兩個數進行+——*/等運算,在這個運算中隨機可能會含有分數形式的一個輸出題目。
- [x] 思路解釋:第一步處理題目,第二步
中綴表達式轉化為後綴表達式 1遇到數字輸出 2遇到高優先級的全部出棧 3最後全部出棧,第三步後綴表達式計算。
### 3.判斷結果並輸出正確率 - [x] 思路解釋:就是單純的布魯型If判斷語句,最後在輸出正確答案,至於輸出正確率則是在生成題目中含有。
7.遇到的困難及解決方法
- [x] 1.最最嚴重的問題:由於之前剛開始的單獨作戰,導致了一個非常嚴重的問題,我做的題目輸出是一次性多次題目出現,而李楠的中綴轉後綴是只接受一個題目,就會導致我們現在完全對接不上,導致這個四則運算沒有完成。
解決方法:目前尚未解決。
參考資料
2017-2018-2 1723 『Java程序設計』課程 結對編程練習_四則運算
結對編程項目-四則運算
S.O.L.I.D 原則
20172333 2017-2018-2 《程序設計與數據結構》四則運算報告(2)