1. 程式人生 > >20172315『Java程序設計』課程 結對編程練習_四則運算第二周階段總結

20172315『Java程序設計』課程 結對編程練習_四則運算第二周階段總結

code pub 目的 判斷 int tint 輸入 log stat

相關過程截圖

中綴轉後綴及後綴計算測試截圖

技術分享圖片

題目生成截圖

技術分享圖片

計算正確率截圖

技術分享圖片

關鍵代碼解釋

將中綴表達式轉換為後綴表達式並對後綴表達式進行計算

import java.util.Stack;
import java.util.regex.Pattern;
public class StringToArithmetic {

    public StringToArithmetic() {

    }

    // 將中綴表達式字符串計算得到結果
    public static double stringToArithmetic(String string) {
        return suffixToArithmetic(infixToSuffix(string));
    }



    // 將中綴表達式轉換為後綴表達式
    public static String infixToSuffix(String exp) {

        Stack<Character> s = new Stack<Character>();
        // 要輸出的後綴表達式字符串
        String suffix = "";
        int length = exp.length(); // 輸入的中綴表達式的長度
        for (int i = 0; i < length; i++) {
            char temp;

            char ch = exp.charAt(i);
            switch (ch) {

                case ‘ ‘:
                    break;

                case ‘(‘:
                    s.push(ch);
                    break;


                case ‘+‘:
                case ‘-‘:
                    while (s.size() != 0) {
                        temp = s.pop();
                        if (temp == ‘(‘) {

                            s.push(‘(‘);
                            break;
                        }
                        suffix += temp;
                    }

                    s.push(ch);
                    break;


                case ‘ב:
                case ‘÷‘:
                    while (s.size() != 0) {
                        temp = s.pop();

                        if (temp == ‘+‘ || temp == ‘-‘ || temp == ‘(‘) {
                            s.push(temp);
                            break;
                        } else {
                            suffix += temp;
                        }
                    }

                    s.push(ch);
                    break;


                case ‘)‘:

                    while (!s.isEmpty()) {
                        temp = s.pop();
                        if (temp == ‘(‘) {
                            break;
                        } else {
                            suffix += temp;
                        }
                    }
                    break;

                default:
                    suffix += ch;
                    break;
            }

        }
        while (s.size() != 0) {
            suffix += s.pop();
        }

        return suffix;
    }

    public static double suffixToArithmetic(String exp) {

        Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)");

        String[] strings = exp.split("");
        Stack<Double> stack = new Stack<Double>();
        for (int i = 0; i < strings.length; i++) {

            if (strings[i].equals("")) {
                continue;
            }

            if (pattern.matcher(strings[i]).matches()) {
                stack.push(Double.parseDouble(strings[i]));
            }

            else {

                double y = stack.pop();
                double x = stack.pop();

                stack.push(calculate(x, y, strings[i]));
            }
        }

        return stack.pop();
    }

    private static Double calculate(double x, double y, String string) {
        // TODO Auto-generated method stub

        if (string.trim().equals("+")) {
            return x + y;
        }
        if (string.trim().equals("-")) {
            return x - y;
        }
        if (string.trim().equals("×")) {
            return x * y;
        }
        if (string.trim().equals("÷")) {
            return x / y;
        }
        return (double) 0;
    }

創建題目類

    public class createquestions {
    public static String create(int level){
        String add = "+", sub = "-", multi = "×", div = "÷";
        String result="";
        int r1=(int)(Math.random()*9+1);
        int r2=(int)(Math.random()*9+1);
        int r3=(int)(Math.random()*9+1);
        //三個整數
        int fenzi1=(int)(Math.random()*9+1);
        int fenmu1=(int)(Math.random()*9+1);
        String fenshu1=fenzi1+"/"+fenmu1;
        int fenzi2=(int)(Math.random()*9+1);
        int fenmu2=(int)(Math.random()*9+1);
        String fenshu2=fenzi2+"/"+fenmu2;
        int fenzi3=(int)(Math.random()*9+1);
        int fenmu3=(int)(Math.random()*9+1);
        String fenshu3=fenzi3+"/"+fenmu3;
        //三個分數
       int suiji1=(int)(Math.random()*4);
        //第一個運算符
        int suiji11=(int)(Math.random()*3);
        //生成括號
        int suiji2=(int)(Math.random()*4);
        //第二個運算符
        if (level>=1) {
            if(suiji11==0&&level==2&&suiji1!=0&&suiji1!=1)
                result+="(";
            if (level==3)
                result+=fenshu1;
            else
                result+=r1;
            if (suiji1 == 0)
                result+=add;
            if (suiji1 == 1)
                result+=sub;
            if (suiji1==2)
                result+=multi;
            if(suiji1==3)
                result+=div;
            if(suiji11==1&&level==2&&suiji2!=0&&suiji2!=1)
                result+="(";
            if (level==3)
                result+=fenshu2;
            else
                result+=r2;
            if(suiji11==0&&level==2&&suiji1!=0&&suiji1!=1)
                result+=")";
        }
        if (level>=2){
            if (suiji2==0)
                result+=add;
            if (suiji2 == 1)
                result+=sub;
            if (suiji2==2)
                result+=multi;
            if(suiji2==3)
                result+=div;
            if (level==3)
                result+=fenshu3;
            else
                result+=r3;
            if(suiji11==1&&suiji2!=0&&suiji2!=1)
                result+=")";
        }
        return result;
    }

main類

import java.util.Scanner;

public class calculate {
    public static void main(String[] args) {
        System.out.println("輸入你要生成的題數");
        Scanner scan = new Scanner(System.in);
        int tishu = scan.nextInt();
        System.out.println("輸入你要生成題目的等級(輸入1或2或3)");
        int dengji = scan.nextInt();
        //調用一個循環
        double answer;
        int zhengquelv = 0;
        double[] daan = new double[tishu];
        switch (dengji) {
            case 1:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(1);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextDouble();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;
                }break;
            case 2:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(2);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextInt();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;
                }break;
            case 3:
                for (int i = 0; i < tishu; i++) {
                    String a = createquestions.create(3);
                    String b = a + "=";
                    System.out.print(b);
                    answer = scan.nextInt();
                    daan[i] = StringToArithmetic.stringToArithmetic(a);
                    if (answer == daan[i])
                        zhengquelv++;

                }break;

        }

        if(dengji<1||dengji>3)
            System.out.println("題目等級輸入錯誤");
        if (dengji >= 1&&dengji <= 3) {
            System.out.println("答案為");
            for (
                    double daanwei : daan)
                System.out.print(daanwei + " ");
            System.out.println("正確率為" + zhengquelv + "/" + tishu);
        }
    }
}

遇到的困難及解決方法

關於判斷題目的正確率出現了一些小問題
技術分享圖片
經過組內商討,得出了解決辦法
技術分享圖片

寫出項目中自己負責的部分

對中綴轉後綴和後綴的計算類的編寫

個人貢獻度劃分(按百分比給小組各成員劃分貢獻度,各成員貢獻之和為100%)

20172315胡智韜30%
20172312彭霖30%
20172318陸大嶽40%

對結對的小夥伴做出評價給出小夥伴博客鏈接(重點指出需要改進的地方)

彭霖
陸大嶽

給出項目的碼雲鏈接

給出小組結對編程照片

技術分享圖片

20172315『Java程序設計』課程 結對編程練習_四則運算第二周階段總結