结对编程队友个人项目互评
一、项目简介
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编码规范要求代码,辅以详细的功能意义注释,大大保障了代码的易读性。如果能修改代码报错路径,将对程序运行环境的要求更加宽容。且若对代码的测试更加详细,便可在输入语境非法时避免落入死循环。