1. 程式人生 > >自動生成不同難度的數學試卷系統,並輸出到txt文件中,命名為當前時間(java)

自動生成不同難度的數學試卷系統,並輸出到txt文件中,命名為當前時間(java)

註意點 文件中 技術 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)