自動生成不同難度的數學試卷系統,並輸出到txt文件中,命名為當前時間(java)
阿新 • • 發佈:2018-09-22
註意點 文件中 技術 alt 賬號 希望 http 遞歸 重要
前言:
花了一整天時間修修補補寫完代碼,現在寫篇博客,一是希望後來的人有個參考,二是記錄下自己的所獲方便以後查閱,三是趁眾大佬還沒做,混點訪問量
以前做項目都是自己做,這次是真切的體會到了為別人做事多麽麻煩,這次還好,提需求的客戶比較專業
設置:
根號為√,如果裏面是多項式用括號括起來
平方為^,因為並沒有說可以更多次方
輸入為
輸出
這裏有一個小歧義,需求中說的題目至少有一個三角函數到底是一道題還是一套題,從經驗上看,應該是一套題
11:03:17
註意點:
構造輸出到文件的流
file=new File("D:/java/calculate/"+un+"/"+title+".txt"); FileOutputStream out=new FileOutputStream(file) ; PrintStream printToFile=new PrintStream(out);
PrintStream printToConsole=System.out;
將各種難度的功能拆分
public void sqrt() { System.out.print(sign2[0]); } public void square() { System.out.print(sign2[1]); } public void trigonometric() { int temp=random.nextInt(3); System.out.print(sign3[temp]); }
對輸出到文件的執行
public void result(FirestProjct f,int n,String g,PrintStream printToFile,PrintStream printToConsole) throws IOException { System.out.println("開始輸出到文件"); System.setOut(printToFile); f.calculate(4,n,g); System.setOut(printToConsole); System.out.println("輸出成功"); }
其他的就是邊寫邊做,對照著需求來,但是弄了幾個小時感覺有一些的需求又費時又學不到東西,so~我選擇忽略
因為還有一些更重要的事情做,這種任務只能盡快做完並消化
以下是源代碼
package zuoye; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintStream; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; import java.util.Scanner; public class FirestProjct { public static Random random=new Random(); private char[] sign1= {‘+‘,‘-‘,‘*‘,‘/‘};//符號 private char[] sign2= {‘√‘,‘^‘,‘%‘};//根號,平方和,取余(可加可不加) private String[] sign3= {"sin","cos","tan"};//三角函數 private static String [] grade={"小學","初中","高中"}; int p=3;//算式符號出現的概率1/3 //主方法主要負責密碼驗證,傳入參數,遞歸調用 public static void main(String [] args) throws IOException{ Scanner scanner=new Scanner(System.in); String [] username= {"張三1","張三2","張三3","李四1","李四2","李四3","王五1","王五2","王五3"};//賬號 String password="123"; String un,pwd; System.out.println("請輸入用戶名和密碼"); while(true) {//判定密碼 boolean input=false; un=scanner.nextLine(); pwd=scanner.nextLine(); for(int i=0;i<9;i++) { if(username[i].equals(un)&&password.equals(pwd))input=true; } if(input)break; else System.out.println("請輸入正確的用戶名、密碼"); } System.out.println("請輸入小學、初中和高中三個選項中的一個"); String g=scanner.nextLine(); work(un,pwd,g); } //work方法用以執行整個過程 public static void work(String un,String pwd,String g) throws IOException { Scanner scanner=new Scanner(System.in); FirestProjct f=new FirestProjct(); int n=0;//題目數量 //做計算 while(true) { //創建文件 SimpleDateFormat dFormat=new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); String title=dFormat.format(new Date()).toString(); File file=new File("D:/java/calculate/"+un+"/"); if(!file.exists()) { file.mkdirs(); } file=new File("D:/java/calculate/"+un+"/"+title+".txt"); FileOutputStream out=new FileOutputStream(file) ; PrintStream printToFile=new PrintStream(out); PrintStream printToConsole=System.out; f.prepare(g); while(true) { n=scanner.nextInt(); if(!f.judgeover(n)) System.out.println("數量應在10~30,請重新輸入"); else break; } //第一次題目的輸出 f.result(f, n, g, printToFile, printToConsole); System.out.println("請輸入“切換為xx”或者“繼續輸入”"); String command=scanner.next();//nextline不能把式子停下來~ String gra=command.substring(0,3); String de=command.substring(3,5); //切換為後面的輸入錯誤則重新輸入 while(command.length()>3&&gra.equals("切換為")&&!(de.equals("小學")||de.equals("初中")||de.equals("高中"))) { System.out.println("請輸入小學、初中和高中三個選項中的一個"); command=scanner.next(); gra=command.substring(0,3); de=command.substring(3,5); } if(command=="繼續輸入")work(un,pwd,g) ; else { for(int i=0;i<3;i++) { if(("切換為"+grade[i]).equals(command)) { g=grade[i]; work(un,pwd,g); } } } } } public void result(FirestProjct f,int n,String g,PrintStream printToFile,PrintStream printToConsole) throws IOException { System.out.println("開始輸出到文件"); System.setOut(printToFile); f.calculate(4,n,g); System.setOut(printToConsole); System.out.println("輸出成功"); } public void prepare(String g) { Scanner scanner=new Scanner(System.in); System.out.println("當前選擇為"+g+"出題"); System.out.println("準備生成"+g+"數學題目,請輸入生成題目數量:"); } public boolean judgeover(int n) {//判定題數是否合適 if(n<10||n>30) { return false; } return true; } public void calculate(int si,int n,String g) {//計算過程 si表示sign1用到的符號個數,n表示數字個數 System.out.println(g+"試卷"); boolean [] cou= {false,false,false};//用以判定直到最後是否出現了根號,三角函數,如果沒有,就讓最後一個數帶上 for(int i=0;i<n;i++) { int count=random.nextInt(2)+3; System.out.print(i+1+"、"); for(int j=0;j<count;j++) { int number=random.nextInt(100)+1; int number2=random.nextInt(100)+1; int temp=0; int bracket=random.nextInt(p);//隨機出現括號,概率為1/3 int sqrt=random.nextInt(p); int square=random.nextInt(p); int tri=random.nextInt(p); if(bracket==2) {//加括號的情況輸出類似於(x+y)- bracket(number, number2, temp, si); System.out.print(sign1[temp]); } if(g.equals(grade[1])&&(sqrt==2)){//只輸出根號 sqrt(); cou[1]=true; } if(g.equals(grade[2])&&tri==2) {//只輸出三角函數符號 trigonometric(); cou[2]=true; } if(j==count-1&&g.equals(grade[2])&&!cou[2])trigonometric(); System.out.print(number); if(g.equals(grade[1])&&(square==2)){//只輸出平方 square(); cou[3]=true; } temp=random.nextInt(si); if(j<count-1) System.out.print(sign1[temp]);//保證最後一個符號是數字 if(j==count-1&&g.equals(grade[1])&&!cou[1]&&!cou[3])square(); } System.out.println("="); System.out.println(); } } public void bracket(int number,int number2,int temp,int sig) { System.out.print("("); System.out.print(number); temp=random.nextInt(sig); System.out.print(sign1[temp]); System.out.print(number2); System.out.print(")"); } //根號和平方位置不同,只能分開,目前不知道怎麽辦,難受 public void sqrt() { System.out.print(sign2[0]); } public void square() { System.out.print(sign2[1]); } public void trigonometric() { int temp=random.nextInt(3); System.out.print(sign3[temp]); } }
自動生成不同難度的數學試卷系統,並輸出到txt文件中,命名為當前時間(java)