2020.10.13二柱子與他的計算題
阿新 • • 發佈:2020-12-19
程式碼:
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("------------------------------------"); } } }