自动生成不同难度的数学试卷系统,并输出到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]);
	}

}

  

原文地址:https://www.cnblogs.com/chen-song/p/9689672.html

时间: 2024-10-10 12:29:53

自动生成不同难度的数学试卷系统,并输出到txt文件中,命名为当前时间(java)的相关文章

Android内核开发:系统编译输出的镜像文件

本文是<Android内核开发>的第四篇文章,主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的. 1. MLO, u-boot.img 任何操作系统的启动,都离不开"引导程序",比如桌面Windows系统的BIOS.桌面Linux系统常用的是Grub,而在嵌入式系统中,这个引导程序通常叫做"bootloader",它通常由

php下载图片生成原始路径 并将下载过的图片路径保存到txt文件中

<?php //header("content-Type: text/html; charset=utf-8"); @ini_set('date.timezone', 'Asia/Shanghai'); @set_time_limit(0); @ini_set('memory_limit','100M'); $headurl = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]; $headurl

自动生成二年级随机四则运算的系统

主要公式为:VLOOKUP.RANDBETWEEN 1.VLOOKUP函数是Excel中的一个纵向查找函数, 功能:按列查找,最终返回该列所需查询列序所对应的值: 具体使用方法为:VLOOKUP(要查找的值,要查找的区域,返回数据在查找区域的第几列数,模糊匹配/精确匹配(TRUE/FALSE或者不填)) 2.RANDBETWEEN作用为返回位于两个指定数之间的一个随机整数. 每次计算工作表时都将返回一个新的随机整数. 使用方法: RANDBETWEEN(bottom,top) Bottom参数:

自动将mtklog以及trace信息到处到自定的目录文件中

未经允许,请勿转载!!! 在指定的目录中以日期为目录记录,可以在运行的时候在后面添加对用的name,生成的文件目录会加上对用的name. #!/bin/bash#@ echo ***####按格式获取时间信息date_ymd=$(date +%Y%m%d)date_hm=$(date +%Y%m%d_%H_%M)#######设置需要获取的地址mtklog_src_path="/storage/emulated/0/mtklog"mtklog_dst_path="/home/

树莓派 ubuntu 系统下修改config.txt文件调整分辨率记录

参考 https://www.jianshu.com/p/99eea4db21c4 注:操作前最好先备份个 config.txt 文件 防止悲剧 防止悲剧 防止悲剧 终端下 进入boot/config.txt sudo nano /boot/config.txt 找到并把#hdmi_group=1改成 hdmi_group=2 然后把#hdmi_mode=1改成 hdmi_mode=28 注:hdmi_mode=28 根据自己的需要来调整  config.txt文件有列出对应的参数的分辨率  

中小学数学卷子自动生成 - 结对项目wjy的代码分析

[实现思路] 命令行输入用户名和密码,匹配试卷难度,每个类的账号只能生成当前难度下的试卷: 根据试卷难度生成题目,主要是随机生成操作数的个数,每个操作数的形式,两个操作符之间的操作符,最后是随机生成括号,因为设计题目的合理性,所以在写随机生成的时候需要考虑到各种可能的情况: 最后生成的试卷以“年-月-日-时-分-秒.txt”命名方式生成到以用户名命名的文件夹中. [函数结构] public static void main(String[] args) static void init() st

如何根据动态SQL代码自动生成DTO

当前的状况 一般做数据库相关开发, 除非学习, 否则很少有人愿意直接使用JDBC.本来Java代码就比较啰嗦了,而直接用JDBC写代码之啰嗦简直有些令人发狂!所以在实际开发过程中,我们通常都会使用一些框架/库来帮助我们操作数据库.而且开源市场上的选择也比较多,就我个人接触到的有:Hibernate,MyBatis,JdbcTemplate,DbUtils,ActiveRecord,JavaLite等等. 这些框架都能大幅的提高开发效率,对于一些基本CRUD操作来说,虽然各有差异,但总的来说基本是

Makeflie自动生成依赖,自动化编译

在netbeans里开发,有一个重要文件makefile,是用来编译所有的文件. 项目的目录结构如下,扁平的目录结构,如何实现自动化编译,写makefile呢? 第一版 基础版: CC = g++ CFLAGS = -O3 -DNDEBUG SOURCE =AdaBoost.cpp aodeselect.cpp sample.cpp vfan.cpp kdbext2.cpp tan_gen.cpp petal: ${SOURCE} $(CC) -o [email protected] ${SOU

页面自动生成工具设计

页面自动生成工具设计 1功能概述 1.1使用术语 页面自动生成工具:自定义查询条件以及数据显示的一种页面生成工具 1.2功能说明 页面自动生成工具是按照工程人员的需求定义查询条件以及数据显示方式的一种工具,数据显示可以用表格和图表的方式:查询统计以表格的方式显示数据,趋势页面以图表方式显示页面. 1.2.1查询统计页面 查询统计页面的设置如下图: "设置数据集":整个查询统计显示数据的完整sql语句. "查询条件设置":写完sql语句后点击"设置查询条件&