2.1、環境搭建 2.1.1、右擊project創建新module 2.1.2、選擇maven 2.1.3、設置module名稱和路徑 2.1.4、module初始狀態 2.1.5、配置打包方式 註意:預設的打包方式為 jar,為了能配置web資源,需要將打包方式設置為 war <packaging ...
一、項目簡介
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編碼規範要求代碼,輔以詳細的功能意義註釋,大大保障了代碼的易讀性。如果能修改代碼報錯路徑,將對程式運行環境的要求更加寬容。且若對代碼的測試更加詳細,便可在輸入語境非法時避免落入死迴圈。