结对编程队友个人项目互评

一、项目简介

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

 

热门相关:我有一座冒险屋   我成了暴戾帝君的小娇包   嫡嫁千金   实习医生:三种口味   签婚外恋合同的隔壁大婶