【java】个人项目(中小学数学卷子自动生成程序)

用户:
小学、初中和高中数学老师。
功能:
1、命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2、登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3、题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4、在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5、生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
6、个人项目9月26日晚上10点以前提交至创新课程管理系统。提交方式:工程文件打包,压缩包名为“几班+姓名.rar”。迟交2天及以内者扣分,每天扣20%。迟交2天及以上者0分。
附表-1:账户、密码

账户类型 账户 密码 备注
小学 张三1 123
小学 张三2 123
小学 张三3 123
初中 李四1 123
初中 李四2 123
初中 李四3 123
高中 王五1 123
高中 王五2 123
高中 王五3 123
我的项目源代码会在28号彻底截止后上传。
第一次个人项目我感觉难度并不是太大,花费了8个小时左右。按照题目的需求,根据用户与系统的交互,分出模块,一步步就能写出来。在过程中,我也基本上没有遇到很难的bug。
这题目是用程序生成算术题,至于软件开发,我第一次想到的就是用java的GUI。毕竟曾经的五子棋,飞机大战也不在话下。
最开始是把登录界面做好。简单的几个部件摆上去就行(采用的是流式布局)。麻烦的在于,部件一般会挤在一起,这时候就要定义空的JLabel来进行填充。使得界面更好看。
【java】个人项目(中小学数学卷子自动生成程序)
文章图片

然后就是定义张三1,李四2,王五3的那些用户的数据了。因为登录需要进行检测。
首先定义User类。
public class User { //老师的用户名 private String name; //老师的密码 private String password; //老师的类型,"小学","初中","高中" private String type; //....下面是setter getter方法 .... }

有类后,再用列表模拟整个数据库。事先构造后所有数据后装入,然后定义一个检查用户名,和密码的函数。判断数据库里面是否有对应的用户存在。
【java】个人项目(中小学数学卷子自动生成程序)
文章图片

之后点击登录按钮,就能进行判断了。按钮的回调也是毕竟简单的。
之后就是主界面
【java】个人项目(中小学数学卷子自动生成程序)
文章图片

点击《切换类型按钮》,获取小学老师的JLable,然后修改,为初中。获取初中老师的JLable,修改为高中,获取高中老师的JLable,修改为小学。不断点击就能切换老师要出题目的类型。
在输入框中填入题目数量后,点击《生成题目》后进行判断,-1就退出。不在10到30间就重新输入。符号条件后,就到了比较麻烦的生成卷子的步骤了。
我的出卷思路是: 1,随机生成 1-5个操作数,数目用operand_num接收。(如果是小学题目,则为2-5个操作数)。并用字符串数组来装这几个操作数。(理由下面会讲到)
2,①小学题目:
操作数之间随机用加+,减-,乘*,除/进行连接。得到一个表达式formula
②初中题目:
因为操作数里面必须有,平方或者开根号。我就随机1-operand_num。个数目,进行特殊操作。50%概率加 2,50%概率加√。分别加到操作数的后面和前面。
这里有一个问题。如果加了平方,又加了根号怎么办呢?这时候我用了一个标记数组,加了就设为True。这样就不会重复加了
③高中题目:
原理和初中题目类似,不同的是。第一次必须,分别以33%概率加上sin,cos,和tan。之后的剩余0到Randow.next(operand_num)次,再分别以20%概率加上, 2,√,sin,cos,tan。(sin,cos,tan,都是加到操作数的的前面)
同样最后也用了标记数组。防止重复进行添加特殊符号。
3,最后就是加括号的问题了。
如果operand_num>=3才加括号。括号包括的元素个数为至少为
2-operand_num-1。
因此我先随机出括号的长度。1-perand_num-1。然后随机出,左括号的操作数索引,然后加上括号长度就是右括号操作数的索引。【java】个人项目(中小学数学卷子自动生成程序)
文章图片

4,最后加上 “=” ,写入txt文件。
【【java】个人项目(中小学数学卷子自动生成程序)】每次只能产生一个表达式,循环几次就产生几个表达式。
【java】个人项目(中小学数学卷子自动生成程序)
文章图片

    推荐阅读