一、简介
这是我对队友林怡鹏同学个人项目的代码分析。项目内容是实现一个中小学数学试卷自动生成程序,他所用的编程语言是java。
二、项目需求
- 命令行输入用户名和密码,两者之间用空格隔开(程序预设小学、初中和高中各三个账号,具体见附表),如果用户名和密码都正确,将根据账户类型显示“当前选择为XX出题”,XX为小学、初中和高中三个选项中的一个。否则提示“请输入正确的用户名、密码”,重新输入用户名、密码;
2. 登录后,系统提示“准备生成XX数学题目,请输入生成题目数量(输入-1将退出当前用户,重新登录):”,XX为小学、初中和高中三个选项中的一个,用户输入所需出的卷子的题目数量,系统默认将根据账号类型进行出题。每道题目的操作数在1-5个之间,操作数取值范围为1-100;
3. 题目数量的有效输入范围是“10-30”(含10,30,或-1退出登录),程序根据输入的题目数量生成符合小学、初中和高中难度的题目的卷子(具体要求见附表)。同一个老师的卷子中的题目不能与以前的已生成的卷子中的题目重复(以指定文件夹下存在的文件为准,见5);
4. 在登录状态下,如果用户需要切换类型选项,命令行输入“切换为XX”,XX为小学、初中和高中三个选项中的一个,输入项不符合要求时,程序控制台提示“请输入小学、初中和高中三个选项中的一个”;输入正确后,显示“”系统提示“准备生成XX数学题目,请输入生成题目数量”,用户输入所需出的卷子的题目数量,系统新设置的类型进行出题;
5. 生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行;
三、优缺点分析
1. 优点分析
1.1 代码风格好,符合谷歌编程规范,注释详尽,可读性比较强,便于其他人阅读和理解。下面是一个节选的例子。
// 年级:小学、初中、高中
private final String grade;
// 名字
private final String name;
// 密码
private final String password;
/**
* 构造方法,初始化用户属性
* @param grade 年级
* @param name 名字
* @param password 密码
*/
Account(String grade, String name, String password) {
this.grade = grade;
this.name = name;
this.password = password;
}
1.2 对不合规范的输入有相应的判断,考虑较为周全。
else {
// 判断输入是否为数字
int isDigitFlag = 0;
for (int i = 0; i < input.length(); i++) {
if (!Character.isDigit(input.charAt(i))) {
System.out.println("请输入10-30之间的数字!!!");
isDigitFlag = 1;
break;
}
}
if (isDigitFlag == 1) {
continue;
}
// 判断输入数字范围为10-30
int questionNum = Integer.parseInt(input);
if (questionNum >= 10 && questionNum <= 30) {
// 生成题目
makeQuestions(questionNum);
} else {
System.out.println("请输入10-30之间的数字!!!");
}
如上述代码所示,在输入生成的题目数量时,若输入的不是数字,有处理的过程。
1.3 有readme文档提示其他用户如何部署及使用该项目。
1.4 运行结果较为准确,可以生成相应的试卷,题目数量准确,难度符合要求。
1.5 在生成随机题目的算法方面,他运用了一般与个别的方式,通过改变个性而产生随机的方式独树一帜,让人眼前一亮,思路清晰,易于理解。
1.6 代码较为简洁,清晰明了
2. 缺点分析
2.1 主体的代码是面向过程的,可复用性不高。如果采用面向对象的编程方式,可以提高代码的复用性。
2.2 同时出现根号,平方以及三角函数的时候可能会出现歧义,应当根据具体情况来增加括号
四、 总结
总的来说,虽然林怡鹏同学的代码存在一些可优化的部分,但是符合编程规范,比较完善地实现了要求的功能,对可能出现的意外状况有所预防。对于特殊情况的全面考虑以及生成字符串的算法方面都比较完备,值得我们学习。