一、项目简介
1.项目名称:中小学数学卷子自动生成程序
2.项目作者:党郑骅霖
3.项目编程语言:Java
二、项目分析
1.类图

2.流程图

3.代码分析
核心方法解析:
1. `main` 方法:
- 程序的入口点,包含主要的程序逻辑。
- 初始化已有用户列表,接收用户输入,允许用户登录,并根据用户的选择生成试卷或重新登录。
2. `InitUser` 方法:
- 用于初始化已有用户列表,包括创建用户对象和设置其登录信息(用户名、密码、年级)。
- 返回一个包含已有用户的列表。
3. `login` 方法:
- 用户登录功能,接收用户输入的用户名和密码,验证其登录信息是否与已有用户匹配。
- 如果匹配成功,将用户状态设置为已登录,返回表示当前登录用户的对象。
4. `ChangeNum` 方法:
- 用于用户登录后输入部分,包括改变年级或输入题数。
- 根据用户输入的内容,判断用户是否要切换年级或输入题数,返回相应的值表示用户的操作。
5. `usedQuestion` 方法:
- 用于记录之前的题目,以避免重复生成相同的题目。
- 创建一个HashSet来存储已生成的题目,并返回该HashSet。
6. `priQuestion` 方法:
- 生成小学数学题目,包括随机生成数字和运算符,可以包含括号。
- 返回生成的数学题目字符串。
7. `senQuestion` 方法:
- 生成初中数学题目,包括随机生成数字、平方、根号和运算符,可以包含括号。
- 返回生成的数学题目字符串。
8. `highQuestion` 方法:
- 生成高中数学题目,包括随机生成数字、三角函数和运算符,可以包含括号。
- 返回生成的数学题目字符串。
9. `producePaper` 方法:
- 生成试卷,根据用户选择的年级和题数,调用相应的生成题目方法。
- 避免重复生成相同的题目,将生成的题目保存到文件中,并在文件名中包含时间戳以确保唯一性。
10. `Teacher` 和 `User` 类:
- `Teacher` 是一个抽象类,定义了抽象方法 `setLogin`、`getName` 和 `getPassword`,用于设置和获取用户登录信息的抽象方法。
- `User` 类继承自 `Teacher`,实现了抽象方法,具体实现了设置和获取用户的用户名、密码和年级。
优点:
①基于面向对象的思想,使用抽象类继承,后期代码更改与扩容都更加容易。- 1 abstract class Teacher{
- 2 abstract void setLogin ( String name, String password, int grade ) ;
- 3 abstract String getName () ;
- 4 abstract String getPassword () ;
- 5 abstract int getGrade () ;
- 6 }
复制代码 ②代码结构清晰,不同功能由单独的方法函数实现,易于阅读与理解。- 1 // 主函数,按步骤进行已有账户初始化、登录、登录后改变或题数、生成试卷
- 2 public static void main ( String[] args );
- 3 // 初始化列表,插入已有账户
- 4 static List<User> InitUser ();
- 5 // 用户登录
- 6 static User login ( List<User> users );
- 7 // 登录后输入部分,即切换或输入题数,年级也用数字表示,此处同一个change方便记录,仅需判断数值就可以知道进行的是什么操作
- 8 static int ChangeNum ( int temp );
复制代码 ③使用哈希表进行查重,查找某个元素的操作通常非常快速。- 1 // 使用哈希表记录之前的题目
- 2 static HashSet<String> usedQuestion ( String name ) {
- 3 File file=new File ( "C: \"+name ) ; // 直接在C盘创建
- 4 HashSet<String> used=new HashSet<String> () ; // 建立哈希表
- 5 file.mkdirs () ; // 若不存在则创建文件夹(一并创建上级目录),存在则使用
- 6 File[] files=file.listFiles () ; // 将文件和目录放在File数组中
- 7 for ( File temp: files ) {
- 8 if ( !temp.isDirectory () ) // 是文件而非文件夹
- 9 {
- 10 try{ // 涉及文件必须try catch
- 11 BufferedReader br=new BufferedReader ( new FileReader ( temp ) ) ; // 读取文件的定义
- 12 while ( br.readLine () !=null ) { // 非空则每次读入一行数据
- 13 used.add ( br.readLine () ) ;
- 14 }
- 15 br.close () ; // 涉及读取文件的要关闭
- 16 }catch ( Exception e ) {
- 17 e.printStackTrace () ;
- 18 }
- 19 }
- 20 }
- 21 return used; // 返回记录已有题目的哈希表
- 22 }
复制代码 ④代码依照Google编码规范编程,可读性和一致性强,简化后期团队合作匹配难度。
缺点:
①输入验证:虽然程序在一定程度上验证了用户的输入,但出现一些不合法的输入,例如“切换为xx”时,程序会陷入死循环。

②保存路径:程序中的文件路径硬编码为"C:\\",这可能导致在不同操作系统或环境下的问题。应该使用相对路径或配置文件来管理文件路径。- 1 // 生成试卷
- 2 static void producePaper ( String name, int temp, int num ) {
- 3 HashSet<String> used=usedQuestion ( name ) ; // 获取之前的题目查重
- 4 long now=System.currentTimeMillis () ; // 获取出来的是当前时间的毫秒值
- 5 Date d=new Date () ;
- 6 d.setTime ( now ) ;
- 7 SimpleDateFormat format=new SimpleDateFormat ( "yyyy-MM-dd-HH-mm-ss" ) ;
- 8 String path="C: \"+name+"\"+format.format ( d ) +".txt"; // 文件名
- 9 ...
- 10 }
复制代码 ③查重逻辑:代码逻辑没有考虑双操作数交换律也属于重复的题目。
4.演示截图


三、总结
总体来说,这位同学的程序编写优秀。代码功能实现完善,逻辑严谨,功能被一一清晰,分解命令行界面输出简洁易懂,有一定的异常捕获与修改能力。同时按照Google编码规范要求代码,辅以详细的功能意义注释,大大保障了代码的易读性。如果能修改代码报错路径,将对程序运行环境的要求更加宽容。且若对代码的测试更加详细,便可在输入语境非法时避免落入死循环。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |