结对编程—对OR同学的程序分析及思考
个人项目:中小学数学卷子自动生成程序
项目需求简要概述:
本项目是要做一个能供老师使用,自动生成适应不同年级难度知识的数学试卷的程序。
附表-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)
运行效果展示:



浙公网安备 33010602011771号