个人项目:中小学数学卷子自动生成程序
项目需求简要概述:
本项目是要做一个能供老师使用,自动生成适应不同年级难度知识的数学试卷的程序。
附表-1:账户、密码
账户类型 | 账户 | 密码 | 备注 |
小学 | 张三1 | 123 |
|
张三2 | 123 |
| |
张三3 | 123 |
| |
初中 | 李四1 | 123 |
|
李四2 | 123 |
| |
李四3 | 123 |
| |
高中 | 王五1 | 123 |
|
王五2 | 123 |
| |
王五3 | 123 |
|
附表-2:小学、初中、高中题目难度要求
| 小学 | 初中 | 高中 |
|
难度要求 | +,-,*./ | 平方,开根号 | sin,cos,tan |
|
备注 | 只能有+,-,*./和() | 题目中至少有一个平方或开根号的运算符 | 题目中至少有一个sin,cos或tan的运算符 |
|
项目设计:根据需求,搭档设计如下
- 设计程序的登录模块:以便输入正确的用户名和密码后能登入账户,读取相关信息。
- 设计登录后用户命令的相应模块:使用户能切换难度,退出登录和生成包含不同题目数量的试卷。
- 设计试卷产生与保存模块:使试卷符合对应难度标准并按格式存储。
所用语言 java jre1.8
分块分享:
1:登录的校验。
需要与已存在的数据库,或内建字符数组,文件等交互,来判断是否匹配,本例采用字符数组。
String userlist[] = {"张三1", "张三2", "张三3", "李四1", "李四2", "李四3", "王五1", "王五2", "王五3"}; String psdlist[] = {"123", "123", "123", "123", "123", "123", "123", "123", "123"}; String typelist[] = {"小学", "小学", "小学", "初中", "初中", "初中", "高中", "高中", "高中"}; for (int i = 0; i < m_actnum; i++) { if (username.equals(m_account[i].GetName()) && password.equals(m_account[i].GetPwd())) { m_user = m_account[i]; flag = true; System.out.println("当前选择为" + m_user.GetType() + "出题"); break; } } if (!flag) { System.out.println("请输入正确的用户名、密码"); }
当两者全部匹配,登录成功,否则需重新输入用户名和密码。
2:登录后相关操作的响应(利用正则表达式匹配字符串)
我们需要能退出登录,切换难度等,其中命令行切换难度本例使用了正则表达式,即java中的string.matches()方法,
相关推荐链接(来自菜鸟驿站):https://www.runoob.com/java/java-regular-expressions.html
正则表达式作为一种处理识别字符串的极其强大的方法,在许多场景下都能发挥其作用,且大部分高级语言均可使用。(c++11.0 版更新regax库,java的string方法以及python的re库)
if (cmd.matches("-?\\d+")) { m_question_num = Integer.parseInt(cmd); flag = true; if (m_question_num != -1 && (m_question_num < 10 || m_question_num > 30)) flag = false; } else { flag = false; if (cmd.length() > 3) { type = cmd.substring(3); if (!type.equals("小学") && !type.equals("初中") && !type.equals("高中")) { System.out.println("请输入小学、初中和高中三个选项中的一个"); }
3:题目生成逻辑
四则运算和数字均采用随机数生成来确定算式,不同的是难度分级下三角函数和开方平方的运算。本例对运算符号集整体定义,顺序排列,并根据不同年级取不同的开始值以便各年级能取到对应的符号。
for (int i = 0; i < m_special_num; i++) { int special_symbol = rd.nextInt(special_max); //临时存储特殊符号并判断是否符合要求 if (!flag) { if (difficult.equals("初中")) { if (i == m_special_num - 1) { special_symbol = rd.nextInt(special_max - 1) + 1; } if (special_symbol > 0 && special_symbol < 3 ) { flag = true; } } else if (difficult.equals("高中")) { if (i == m_special_num - 1) { special_symbol = rd.nextInt(special_max - 3) + 3; } if (special_symbol > 2 && special_symbol < 6 ) { flag = true; } } } m_specials[i] = special_symbol; }
括号则随机插入,并最后检查无意义的括号(如(5)此类),但本例没有排查不改变原运算级的括号。
文件输出采取文件流,要注意的一点是,不同操作系统下字符编码集也许不同,为了使用中文这里推荐编码统一改为utf-8格式。
1 String filename = dirname + "/" + df.format(new Date())+".txt"; 2 3 File file = new File(filename); 4 5 if (!file.exists()) 6 7 file.createNewFile(); 8 9 10 11 FileOutputStream fop = new FileOutputStream(filename); 12 13 OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
总结:
小伙伴使用的编程语言是java语言,可以看出,整体使用还是十分熟练的。下面来说一下我对该工程的看法。
优点:
1:可扩展性好,突出了java语言的特点即面向对象编程。其对java的面向对象的分块设计使得各个部分相对独立,便于修改。
2:代码书写格式规范,严格按照代码规范文档书写,英文释义也比较妥当。
缺点:
1:注释很少,可在部分关键处增加注释,达到原代码可读性与帮助释义的平衡。
2:代码长度较长,可部分精简。
3:缺少部分项目未包含的交互提示,如登录无提示,生成试卷后也无提示(测试时会错认为出了bug)
运行效果展示: