二柱子又對本身提出了新的要求:html
咱們只對CT.java文件進行了更改,因此若是有須要,請前往軟件工程做業01中查看剩餘文件源碼!java
CT.javadom
package cn.simo; import java.util.Scanner; /** * 小學生出題系統(30道四則運算題) * @author www.cnsimo.cn * @since 2017-03-07 21:53:14 */ public class CT { public static String str = "";//保存題目的字符串 public static int num = 5;//每題中數的個數 public static int num_i = 0;//題目中已有數的個數 public static int numberRange = 100;//運算中數的最大取值 public static double sum = 0;//記錄結果 public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("注意:結果保留1位小數!"); System.out.println("共30道題目:"); Scanner in = new Scanner(System.in); double answer = 0; double result = 0; String[] question = new String[30]; int questionNumber = 0; int answerTrue = 0; boolean flag; for(;;) { answer = 0; result = 0; flag = true; str=""; if((questionNumber + 1)%5 != 0) { GetQuestion_int(); } else { GetQuestion_div(); } for(int j = questionNumber-1; j >= 0; j --) { if(question[j].equals(str)) { flag = false; break; } } if(!flag) continue; else {question[questionNumber] = new String(str); questionNumber++;} System.out.print("" + questionNumber + ". " + str+" = "); answer = in.nextDouble(); if(!str.isEmpty()) { result = Arithmetic.arithmetic(str); } if(answer == result) { System.out.println(" ✔️"); answerTrue++; } else { System.out.println(" ❌ " + " 正確答案:" + result); } if(questionNumber == 30) break; // 滿30個跳出 } System.out.println("你的正確機率:" + answerTrue + "/30"); in.close(); } private static void GetQuestion_int() { //獲得問題函數,在這裏調用遞歸函數quesGrow()。 str = ""; sum = 0; num_i = num;//用前都清零 quesGrow_int(); } private static void GetQuestion_div() { str = ""; sum = 0; num_i = num;//用前都清零 quesGrow_div(); } private static void quesGrow_int() { // if( num_i > 1 ) { int j = num_i;//記錄這是第幾層調用。 num_i--; quesGrow_int();//遞歸 int w=1+(int)(Math.random()*numberRange);//隨機生成一個數 int t=1+(int)(Math.random()*100);//向左生成,仍是向右生成,相似於樹。 int f=1+(int)(Math.random()*100);//運算符控制 if(t>50)//新數往右加 { if(f>50) { if(f>75) { sum = sum + w; str = str + "+" + String.valueOf( w ); } else { sum *= w; str = str + "*" + String.valueOf(w); } } else { if(f<25) { sum = sum - w; str = str + "-" + String.valueOf( w ); } else { sum = sum / w; str = str + "/" + String.valueOf(w); } } } else//不然 新數往左加 { if(f>50) { if(f>50) { sum = w + sum; str = String.valueOf( w ) + "+" + str; } else { sum = w * sum; str = String.valueOf(w) + "*" + str; } } else { if( j < 3 ) {//3——摸索出的數,不用給本身套上括號。實際上就是j=2 if(f<25) { sum = w - sum; str = String.valueOf( w ) + "-" + str; } else { sum = w / sum; str = String.valueOf( w ) + "/" + str; } } else { if(f<25) { sum = w - sum; str = String.valueOf( w ) + "-" + "(" +str+ ")"; //向左添減法的時候加括號,打破順序計算模式。 } else { sum = w / sum; str = String.valueOf(w) + "/" + "(" + str + ")"; } } } } } else if( num_i == 1 ) { //最後一層,也是輸出的第一層 int w=1+(int)(Math.random()*numberRange); sum = sum + w; str = str + String.valueOf( w ); } } private static void quesGrow_div() { if( num_i > 1 ) { int j = num_i;//記錄這是第幾層調用。 num_i--; quesGrow_div();//遞歸 double w=Math.random();//隨機生成一個數 int t=1+(int)(Math.random()*100);//向左生成,仍是向右生成,相似於樹。 int f=1+(int)(Math.random()*100);//運算符控制 if(t>50)//新數往右加 { if(f>50) { if(f>75) { sum = sum + w; str = str + "+" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)); // +0.01保證w長度不低於4,而且w須要截取到小數點後2位,防止小數點後字符長度過大不能轉化成int型 } else { sum *= w; str = str + "*" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)); } } else { if(f<25) { sum = sum - w; str = str + "-" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)); } else { sum = sum / w; str = str + "/" + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)); } } } else//不然 新數往左加 { if(f>50) { if(f>75){ sum = w + sum; str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "+" + str; } else{ sum = w * sum; str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "*" + str; } } else { if( j < 3 ) {//3——摸索出的數,不用給本身套上括號。實際上就是j=2 sum = w - sum; str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + str; } else { sum = w - sum; str = ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)) + "-" + "(" +str+ ")"; //向左添減法的時候加括號,打破順序計算模式。 } } } } else if( num_i == 1 ) { //最後一層,也是輸出的第一層 double w=Math.random(); sum = sum + w; str = str + ChangeToFenshuDemo.toFenshu((""+(w+0.01)).substring(0, 4)); } } }
對於本程序,可能會出現棧溢出的異常,可是不多狀況纔會出現一次,因此問題所在之處並很差找,只能放棄。經過這個做業咱們須要掌握PSP項目計劃的指定以及把握對時間的掌握!函數