1. 程式人生 > >20172333 2017-2018-2 《程序設計與數據結構》四則運算報告(2)

20172333 2017-2018-2 《程序設計與數據結構》四則運算報告(2)

mage 表達式 pen info 個數 及其 優先 負責 結構

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四個等級,每一個等級都只有兩個數進行+——*/等運算,在這個運算中隨機可能會含有分數形式的一個輸出題目。
    ### 2.中綴轉後綴(代碼備註中有)
  • [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)