1. 程式人生 > 實用技巧 >2020.10.13二柱子與他的計算題

2020.10.13二柱子與他的計算題

程式碼:

public class Caculate03 {
    private static int grade;
    private static int number = 30;
    private static int range;
    private static String[] operator = new String[100];
    private static int operatorNumber;
    private static int[] randomOperator = new int[100];
    private static int[] randomNumber = new int[100];
    private static String[] sum = new String[100];
    private static String[] formula = new String[100];
    private static String[] formula2 = new String[100];
    private static String[] errorQuestionKey = new String[100];
    private static int error = 0;//錯題數量
    private static int correct = 0;//正確數量
    public static void Initialize() {
        Scanner sc = new Scanner(System.in);
        System.out.print("請輸入出題個數:");
        number = sc.nextInt();
        System.out.print("請輸入運算元取值範圍:");
        range = sc.nextInt();
    }

    //列印
    public static void print() {
        for (int i = 0; i < number; i++) {
            System.out.println(formula[i]);
        }
    }

    //生成隨機數
    public static void generateRandomNumber() {
        long seed = System.currentTimeMillis();
        Random r = new Random(seed);
        for (int i = 0; i < number*operatorNumber; i++) {
            randomNumber[i] = r.nextInt(range);
        }
    }
    //生成四則運算
    public static void generateOperation() {
        Random r = new Random();
        for (int i = 0; i < (operatorNumber-1)*number; i++) {
            randomOperator[i] = r.nextInt(4);
            switch (randomOperator[i]) {
                case 0:
                    operator[i] = "+";
                    break;
                case 1:
                    operator[i] = "-";
                    break;
                case 2:
                    operator[i] = "*";
                    break;
                case 3:
                    operator[i] = "/";
                    break;
                default:
                    System.out.println("Error1!");
                    break;
            }
        }
    }

    //組合
    public static void combination() {
        int n = 0, k =0;
        Random r = new Random();

        for (int i = 0; i < operatorNumber * number; i = i+operatorNumber){

            for (int j = i; j < i+operatorNumber; j++) {

                if (j != (i+operatorNumber-1)) {
                    while (true) {
                        if ("/".equals(operator[n])) {
                            if (randomNumber[j + 1] == 0 || randomNumber[j] % randomNumber[j + 1] != 0) {
                                randomNumber[j + 1] = r.nextInt(range);
                                randomNumber[j] = r.nextInt(range);
                            } else {
                                break;
                            }
                        } else {
                            break;
                        }
                    }
                    if (j == i){
                        formula[k] = String.valueOf(randomNumber[j])+operator[n];
                        formula2[k] = String.valueOf(randomNumber[j])+operator[n];
                    } else {
                        formula[k] += String.valueOf(randomNumber[j])+operator[n];
                        formula2[k] += String.valueOf(randomNumber[j])+operator[n];
                    }
                    n++;
                } else if(j == i+operatorNumber-1) {
                    formula[k] += String.valueOf(randomNumber[j]);
                    formula2[k] += String.valueOf(randomNumber[j]);
                }
            }
            if (grade == 4){
                formula[k] = bracket(formula[k]);
            }
            k++;
        }
    }

    public static String bracket(String formula) {
        long seed = System.currentTimeMillis();
        Random r = new Random(seed);
        int leftBracket, rightBracket;
        int a, b;
        String formula2="";
        while(true){
            a = r.nextInt(operatorNumber-2)+1;
            b = r.nextInt(operatorNumber-2)+1;
            if (a>b){
                leftBracket = b;
                rightBracket = a;
                break;
            } else if (a<b){
                leftBracket = a;
                rightBracket = b;
                break;
            } else {
                continue;
            }
        }


        int k=0;
        String temp="";
        String[] numberStack = new String[operatorNumber];
        String[] operatorStack = new String[operatorNumber];
        operatorStack[0] = "#";
        for (int i = 0; i < formula.length(); i++) {
            if (formula.charAt(i) != '+' && formula.charAt(i) != '-' && formula.charAt(i) != '*' && formula.charAt(i) != '/' && i != formula.length() - 1) {
                temp += formula.charAt(i);
                continue;
            } else if (i == formula.length() - 1) {
                temp += formula.charAt(i);
                numberStack[k] = temp;
            } else {
                numberStack[k] = temp;
                operatorStack[k + 1] = String.valueOf(formula.charAt(i));
                temp = "";
                k++;
            }
        }

        formula2 += numberStack[0];
        for (int i = 1; i < operatorNumber; i++) {
            if (i == leftBracket){
                formula2 += operatorStack[i]+"("+numberStack[i];
            } else if (i == rightBracket){
                formula2 += operatorStack[i]+numberStack[i]+")";
            } else {
                formula2 += operatorStack[i]+numberStack[i];
            }
        }
        return formula2;
    }

    //計算
    public static void caculate() {
        if (grade == 4){
            for (int i = 0; i < number; i++) {
                sum[i] = caculateString(formula[i]);
            }

        } else{
            for (int i = 0; i < number; i++) {
                sum[i] = caculateString(formula[i]);
            }
        }

    }
    //計算一個字串算式
    @NotNull
    public static String caculateString(@NotNull String formula) {
        int k=0;
        int n=1;
        String temp="";
        //給定兩個棧,一個存放數字,一個存放運算子
        int[] numberStack = new int[operatorNumber];
        int[] numberStack2 = new int[operatorNumber];
        String[] operatorStack = new String[operatorNumber];
        String[] operatorStack2 = new String[operatorNumber];
        operatorStack[0] = "#";
        for (int i = 0; i < formula.length(); i++) {
            if (formula.charAt(i) != '+' && formula.charAt(i) != '-' && formula.charAt(i) != '*' && formula.charAt(i) != '/' && i != formula.length() - 1 &&formula.charAt(i)!='('&&formula.charAt(i)!=')') {
                temp += formula.charAt(i);
                continue;
            } else if (i == formula.length() - 1) {
                temp += formula.charAt(i);
                numberStack[k] = Integer.parseInt(temp);
            } else {
                numberStack[k] = Integer.parseInt(temp);
                operatorStack[k + 1] = String.valueOf(formula.charAt(i));
                temp = "";
                k++;
            }
        }
        operatorStack2[0] = operatorStack[0];
        numberStack2[0] = numberStack[0];
        for (int i = 1; i < operatorNumber; i++) {
            if ("*".equals(operatorStack[i])||"/".equals(operatorStack[i])) {
                switch (operatorStack[i]) {
                    case "*":
                        numberStack2[n-1] = numberStack[i]*numberStack2[n-1];
                        break;
                    case "/":
                        numberStack2[n-1] = numberStack2[n-1]/numberStack[i];
                        break;
                    default:
                        System.out.println("Error2!");
                        break;
                }
            } else {
                operatorStack2[n] = operatorStack[i];
                numberStack2[n] = numberStack[i];
                n++;
            }
        }
        int i;
            for (i = 1; i < n; i++) {
                switch (operatorStack2[i]) {
                    case "+":
                        numberStack2[i] = numberStack2[i]+numberStack2[i-1];
                        break;
                    case "-":
                        numberStack2[i] = numberStack2[i-1]-numberStack2[i];
                        break;
                    default:
                        System.out.println("Error3!");
                        break;
                }
            }

        return String.valueOf(numberStack2[n-1]);
    }

    public static String caculateString02(String formula){
        String formula2="";
        String temp="";
        String result;
        for (int i = 0; i < formula.length(); i++) {
            if (formula.charAt(i) == '('){
                for (int j = i+1; j < formula.length(); j++) {
                    if (formula.charAt(j) != ')'){
                        formula2 += String.valueOf(formula.charAt(j));
                    } else {
                        i = j;
                        break;
                    }
                }
                System.out.println(formula2);
                formula2 = caculateString(formula2);
                temp += formula2;
            }else {
                temp += String.valueOf(formula.charAt(i));
            }
        }
        result = caculateString(temp);
        return result;
    }

    //線上答題
    public static void answerQuesetion() throws IOException {
        String result;
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < number; i++) {
            System.out.print((i+1)+". "+formula[i]+"=");
            result = sc.nextLine();
            if (result.equals(sum[i])){
                correct++;
            } else {
                /*
                    如果使用者輸入答案不正確,則將題目錄入至錯題庫
                 */
                generateWrongQuestion(formula[i]);
                errorQuestionKey[error] = sum[i];
                error++;
            }
        }
        System.out.println("正確"+correct+",錯誤"+error);
        System.out.println("------------------------------------");
        System.out.println("             正確答案");
        for (int i = 0; i < number; i++) {
            System.out.println("              "+(i+1)+". "+sum[i]);
        }
        System.out.println("------------------------------------");
    }

    //講題目錄入至錯題庫
    public static void generateWrongQuestion(String formula) throws IOException {
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\\WrongTopicSet.txt"));
        osw.write(formula);
        osw.flush();
        osw.close();
    }

    /*
        功能:
        1.將存入粗題庫中的錯題進行再次顯示
        2.重做
     */
    public static void printWrongQuestion() throws IOException {
        String result;
        String line;
        int i = 0;
        Scanner sc = new Scanner(System.in);
        BufferedReader br = new BufferedReader(new FileReader("E:\\WrongTopicSet.txt"));
        while((line = br.readLine()) != null) {
            System.out.println(line);
            result = sc.nextLine();
            if (result.equals(errorQuestionKey[i])) {
                System.out.println("回答正確,你真的太棒了");
            } else {
                System.out.println("回答錯誤,要繼續努力哦");
            }
            i++;
        }
    }
    public static void inputOperatorNumber(int n) {
        Scanner sc = new Scanner(System.in);
        Random r = new Random();
        if (n == 2){
            operatorNumber = 2;
        } else {
            System.out.print("請選擇運算元個數:");
            operatorNumber = sc.nextInt();
        }

    }

    public static void main(String[] args) throws IOException {
        char choice = 'Y';
        boolean bool = true;
        Scanner sc = new Scanner(System.in);
        Initialize();
        System.out.print("請輸入年級:");
        grade = sc.nextInt();

        //選擇運算元量
        inputOperatorNumber(grade);

        //生成計算題
        generateRandomNumber();

        generateOperation();

        combination();

        caculate();//生成計算題後計算答案
        //System.out.println("這裡有沒有問題呢?");
        while(true){
            if (choice == 'Y' || choice == 'y') {
                generateRandomNumber();
                generateOperation();
                combination();
                caculate();
                answerQuesetion();
            } else if(choice == 'n' || choice == 'N') {
                printWrongQuestion();
            } else {
                System.exit(0);
            }
            System.out.println("------------------------------------");
            System.out.println("     Y or y    進行下一套題訓練");
            System.out.println("     N or n    進行錯題訓練");
            System.out.println("     其他任意鍵  退出");
            System.out.println("------------------------------------");
            System.out.print("請選擇:");
            choice = sc.next().charAt(0);
            System.out.println("------------------------------------");
        }

    }
}