三次大作業總結性blog

23201314-郭粮源發表於2024-04-20

目錄
  • 前言:
  • 設計與分析:
  • 踩坑心得:
  • 改進建議:
  • 總結:

前言:

第一次大作業:
1.題量:這次的大作業有五道題,題量較大。
2.難度:第一次大作業的難度適中,前三題難度較為簡單,難度主要是集中在最後一題:答題判題程式-1。
3.知識點的使用:
第一次大作業使用了以下Java知識點:
(1)類與物件:如定義了Fan類,表示風扇,包括風速、開關、半徑和顏色等屬性。透過類的構造方法和各個getter和setter方法來進行屬性的初始化和訪問。
(2)物件導向程式設計:如最後一題程式碼中定義了Question類和Paper類,分別表示試題和試卷(一組題)。
(3)集合類:有程式碼中使用了ArrayList類,用於儲存試題、答案和判題結果等資料。
(4)字串處理:有程式碼中使用了String類的一些方法,如trim()、split()以及replaceAll()等,用於去掉字串中的空格、分割字串和替換字串中的字元等操作。
(5)輸入輸出流:程式碼中使用Scanner類從控制檯讀取使用者輸入,以及使用System.out.println()和System.out.print()等方法輸出資料。
(6)條件語句和迴圈語句:程式碼中使用了if、while和for等語句,用於控制程式流程和實現各種功能。
(7).資料型別:使用基本資料型別,如第一題中int、boolean和double等,來儲存風扇的屬性。使用String型別來儲存風扇的顏色。

第二次大作業:
1.題量:第二次大作業共有四道題,題量適中。
2.難度:第二次大作業的難度適中,相較於第一次大作業難度肯定有所提升,但難度仍然集中於最後一題:答題判題程式-2。該題是由第一次大作業的最後一題迭代而成,增加了亂序輸入,試卷資訊,試卷總分,答卷分值等相關功能。
3.知識點:
第二次大作業使用了以下Java知識點:
(1)類與物件的概念、建構函式、成員變數、成員方法
(2)集合框架的使用,如 List、Map等
(3)字串的處理,包括 split、trim 等方法的使用
(4)輸入輸出流的基本操作,包括 Scanner 和 System.out.println等
(5)條件語句 if 和迴圈語句 for 的使用
(6)異常機制的概念和 try-catch 語句的使用
(7)常用資料型別的轉換,包括 String 到 int、List 到陣列等的轉換
(8) Map 的鍵值對操作,包括 put、get 等方法的使用
(9)物件的比較和篩選,包括 filter、findFirst 等方法的使用。
第三次大作業:
1.題量:第三次大作業共有三道題,題量較少。
2.難度:第三次大作業的難度較大,相較於前兩次大作業的難度大有提升,前兩題的難度也有所提高,難度也還是集中於最後一題:答題判題程式-3。難度迭代提高不少,增加了學生資訊,題目刪除資訊,引用題目錯誤提示等功能。
3.知識點:
第三次大作業使用了以下Java知識點:
(1)類與物件的概念、建構函式、成員變數、成員方法
(2)集合框架的使用,包括 List、Map 等
(3)字串的處理,包括 split、substring 等方法的使用
(4)輸入輸出流的基本操作,包括 Scanner 和 System.out.println 等
(5)條件語句 if 和迴圈語句 for 的使用
(7)異常機制的概念和 try-catch 語句的使用
(8)常用資料型別的轉換,包括 String 到 int、List 到陣列等的轉換
(9)Map 的鍵值對操作,包括 put、get 等方法的使用,例如在處理試卷題目和答案時使用Map來儲存資料,使用put方法向Map中新增資料,使用get方法獲取Map中的資料。
(10)物件的比較和篩選,包括 filter、stream 等方法的使用。 如List中的物件進行篩選和排序。

設計與分析:

一.SourceMontor分析
我對我三次大作業的最後一題的程式碼進行了SourceMontor分析生成報表內容。
第一次大作業報表如下圖:

我們可以看到程式碼總體資訊:
1.總行數(Lines):141
2.語句數目(Statements):80
3.分支語句比例(Percent Branch Statements):13.8%
4.註釋比例(Percent Lines with Comments):8.5%
5.包含的類和介面的總數量:4
6.平均類包含方法:3.5
7.平均每個函式包含的語句數目:3.39
8.函式呼叫語句:39

第二次大作業報表如下:

1.總行數(Lines):205
2.語句數目(Statements):125
3.分支語句比例(Percent Branch Statements):8.8%
4.註釋比例(Percent Lines with Comments):0%
5.包含的類和介面的總數量:4
6.平均類包含方法:6.75
7.平均每個函式包含的語句數目:3.07
8.函式呼叫語句:108

第三次大作業報表如下:

1.總行數(Lines):337
2.語句數目(Statements):210
3.分支語句比例(Percent Branch Statements):20%
4.註釋比例(Percent Lines with Comments):0.3%
5.包含的類和介面的總數量:6
6.平均類包含方法:4.00
7.平均每個函式包含的語句數目:4.57
8.函式呼叫語句:140

二.powerdesigner製作的相應類圖
我對我三次大作業的最後一題的程式碼也進行了powerdesigner設計相應的類圖。
第一次大作業

Question類的作用是儲存題目的相關資訊。Paper類的作用是儲存試卷資訊,也就是題目集。AnswerSheet的作用是儲存答案資訊。其中Paper和與Question是聚合關係。Main則與所有類有關聯依賴。

第二次大作業

Question類的作用是儲存題目的相關資訊。Test類的作用是儲存試卷資訊,也就是題目集。AnswerSheet的作用是儲存答案資訊。其中Test和與Question是聚合關係。AnswerSheet和與Question是聚合關係。Main則與所有類有關聯依賴。

第三次大作業

Question類的作用是儲存題目的相關資訊。Test類的作用是儲存試卷資訊,也就是題目集。AnswerSheet的作用是儲存答案資訊。Student是儲存學生資訊。其中Test和與Question是聚合關係。AnswerSheet和與test是關聯關係。AnswerSheet透過test與Question有間接關係。Main則與所有類有關聯依賴。
三.心得
透過這三次大作業的設計與分析,我明白了每一個類都應該有清晰的職責分配,並且其中部分類之間還有重要的關係。透過分析程式碼產生的類圖,我認識到了程式碼結構清晰的重要性。並且我學到了類圖是將理論轉化為實際操作的有力工具,它既反映了設計思想,也有助於理解和交流實際的系統結構。透過構建類圖,可以更深入地理解系統,併為程式碼的實際編寫提供有價值的指導。

踩坑心得:

一.第一次大作業的踩坑
1.因為是第一次大作業的書寫,對程式碼的類構建,方法呼叫仍不熟悉,發生了類屬性的呼叫錯誤,在對類屬性進行狀態定義為private後,類中的方法構造並未使用public,導致呼叫的錯誤,改進後class Question {
private int number;
private String content;
private String answer;

public Question(int number, String content, String answer) {
   this.number = number;
   this.content = content;
   this.answer = answer;    }

}
2.在做分析讀取試卷題目時,未進行空格符號的去除,導致輸出紊亂,輸出錯誤,導致後來在進行題目提取錯誤,答案錯誤。
後來更改程式碼for (int i = 0; i < numOfQuestions; i++) {
String line = scanner.nextLine().trim(); // 去掉多餘空格符
String[] parts = line.split(" ");
int number = Integer.parseInt(parts[0].substring(3));
String content = parts[1].substring(3).trim(); // 去掉多餘空格符
String answer = parts[2].substring(3).trim(); // 去掉多餘空格符
Question question = new Question(number, content, answer);
paper.addQuestion(question);
}

二.第二次大作業的踩坑
在進行資料判定和輸出時,輸出時的判定出錯,
相關程式碼: for (Question p : test.getQuestions()) {
if(x>= answerSheet.getQuestions().size())
{
System.out.println("answer is null");
continue;
}

        if (p.getAnswer().equals(String.valueOf(answerSheet.getQuestions().get(x)))) {
            p.setinscore(test.getQuestions().get(x).getGetscore());
            System.out.println(p.getStr() + "~" + answerSheet.getQuestions().get(x) + "~" + "true");
        } else {
            p.setinscore(0);
            System.out.println(p.getStr() + "~" + answerSheet.getQuestions().get(x) + "~" + "false");
        }

測試結果:輸入:#N:1 #Q:1+1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#S:1 #A:5 #A:22
End
輸出:alert: full score of test paper1 is not 100 points
1+1 = 5false
answer is null
0 0~0
但樣例輸出是 alert: full score of test paper1 is not 100 points
1+1 = 5false
2+2 = 22false
0 0~0
但由於時間關係,在做此blog前也未能完成修正。

三.第三次大作業的踩坑:
問題所在是在處理 #N: 標記的行時,我期望有三個由空格分隔的部分(分別代表問題編號、問題以及答案),而提供的示例裡問題編號和問題沒有用空格隔開。這就導致了 parts 陣列的長度不等於3,進而觸發 "wrong format" 的輸出導致重複輸出。
輸入:#N:1 +1= #A:2
#N:2 #Q:2+2= #A:4
#T:1 1-5 2-8
#X:20201103 Tom-20201104 Jack-20201105 Www
#S:1 20201103 #A:1-5 #A:2-4
#D:N-2
End
輸出:
wrong format:#N:1 +1= #A:2
wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
the question 2 invalid~0
20201103 Tom: 0 0~0
樣例輸出:
wrong format:#N:1 +1= #A:2
alert: full score of test paper1 is not 100 points
non-existent question~0
the question 2 invalid~0
20201103 Tom: 0 0~0
改進心得:調整程式碼來適應不同的輸入格式:if (line.startsWith("#N:")) { String[] parts = line.split("#Q:| #A:"); if (parts.length != 3) { System.out.println("wrong format:" + line); } else { String numberPart = parts[0].substring(3).trim(); String content = parts[1].trim(); String answer = parts[2].trim(); ... } }

改進建議:

1.處理無效輸入。
2.提高程式碼可讀性:每一個演算法或複雜的操作應該透過方法進行封裝,以簡化 main 方法中的邏輯並提高可讀性。
3.強化錯誤檢查:在新增答案之前,確保它們的編號是有效的,即存在於問題集中。若非如此,給出錯誤提示或採取其他操作。
4.最佳化資料結構:Paper 類中使用線性搜尋去尋找題目是低效的(時間複雜度O(n)),可以考慮將 ArrayList 替換為 HashMap 來改善效能,特別是在大量題目的情境下。
5.避免不必要的操作。
6.持續最佳化。

總結:

這三次的大作業題目集,對於我個人來說是很有難度,我個人的邏輯思維差,而java編碼恰恰就需要複雜的邏輯思維去梳理題目的資訊,我這幾次的大作業是做的很差。但我也希望我能在這一次次大作業中得到提升。
一.學習點:
1.輸入驗證與錯誤處理:
學習到了如何處理和驗證使用者輸入,使程式能夠優雅地處理不可預見的輸入,包括非法格式和意外的資料型別。
2.程式碼的可讀性和可維護性:
從程式碼示例中體會到,清晰和模組化的程式碼結構對於長期維護與讀懂程式碼意圖是多麼重要。
3.資料結構的選擇:
對如何根據需求選擇合適的資料結構有了更深的理解,例如當需要最佳化搜尋操作時使用 HashMap 而不是 ArrayList。
4,異常處理機制:
瞭解了異常處理的原則和在程式碼中實現異常處理的方法,以增強程式碼的健壯性。
5.物件導向設計原則:
學習到了諸如單一職責原則在實際編碼中的應用,並理解了這些原則如何促進了程式碼的整潔與可擴充套件性。
二.進一步學習的方向:
學習如何有效地編寫單元測試,是確保程式碼質量的關鍵。
1.效能最佳化:
程式碼示例中提出了有關效能最佳化的建議,這是一個持續的學習過程,特別是在處理大資料量時。
2.設計模式的運用:
進一步學習和實踐設計模式,理解在何種場景下應用哪種設計模式。
三.改進建議及意見:
1.教材和教學方法:
課堂教學可以更多地包含實際案例,透過實際專案來加深對理論知識的理解。
2.實驗和課下活動:
安排更多實踐性實驗和程式設計練習,為學生提供一個可以立即應用所學知識的平臺。
3.課堂互動:
增加課堂互動,例如透過程式設計競賽或程式碼審查會議來促進學生的積極參與。

相關文章