zoukankan      html  css  js  c++  java
  • 自动生成不同难度的数学试卷系统,并输出到txt文件中,命名为当前时间(java)

    前言:

    花了一整天时间修修补补写完代码,现在写篇博客,一是希望后来的人有个参考,二是记录下自己的所获方便以后查阅,三是趁众大佬还没做,混点访问量

    以前做项目都是自己做,这次是真切的体会到了为别人做事多么麻烦,这次还好,提需求的客户比较专业

    设置:

    根号为√,如果里面是多项式用括号括起来

    平方为^,因为并没有说可以更多次方

     输入为

    输出

     这里有一个小歧义,需求中说的题目至少有一个三角函数到底是一道题还是一套题,从经验上看,应该是一套题

    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]);
    	}
    
    	
    }
    

      

  • 相关阅读:
    C++实现高斯滤波器
    移动通信
    最简单的DLL
    C/C++ 编译和链接过程
    Servlet 详解
    对 Java 集合的巧妙利用
    Java 泛型
    Java 字符编码与解码
    HTTP 400 错误
    a 标签的四种样式
  • 原文地址:https://www.cnblogs.com/chen-song/p/9689672.html
Copyright © 2011-2022 走看看