OOP-題目集7-9
目錄
1.前言
2.設計與分析
3.踩坑心得
4.改進建議
5.總結
一、前言
題目集7:
知識點:考察類的繼承、多型性使用方法以及介面的應用,Comparable 介面的使用、java集合工具類(如ArrayList的使用)等等。
題量:少
難度:一般,但題目程式碼量大,但本集題目2通過題目1修改後實現
題目集8:
知識點:考察類的繼承、多型性使用方法以及介面的應用,正則表示式的應用以及類之間的設計關係應用,字串的處理,java集合工具類(如ArrayList的使用)等等。
題量:少
難度:一般,但題目程式碼量大
題目集9:
知識點:考察類的繼承、多型性使用方法,抽象類的使用以及介面的應用,正則表示式的應用以及類之間的設計關係應用,物件屬性的處理,java集合工具類(如ArrayList、HashSet的使用)以及迭代器的使用等等
題量:少
難度:一般,但題目程式碼量大
二、設計與分析
1.分析題目集7(7-1)、(7-2)的遞進式設計分析
題目:題目集7(7-1)
考慮一款適合於小學生的卡片(Card)排序遊戲,其規則為隨機發放一些卡片給學生,卡片分為 四種形狀:圓形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid),並給出各種 卡片的相應引數,要求學生能夠迅速求出各卡片的面積大小然後將卡片按照其面積值從大到小進行排 序,同時求出所有卡片的面積之和。設計類圖如下:
輸入格式:
- 首先,在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:
1 3 4 2 1 3 4 2 1 3 0
- 然後根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。
輸出格式:
- 如果圖形數量非法(小於0)或圖形屬性值非法(數值小於0以及三角形三邊不能組成三角形),則輸出
Wrong Format
。 - 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
- 排序前的各圖形型別及面積,格式為
圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n
,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格; - 排序後的各圖形型別及面積,格式同排序前的輸出;
- 所有圖形的面積總和,格式為
Sum of area:總面積值
。
設計分析:本題實現形狀的判斷、判斷輸入資料的正確性、面積的計算以及按面積對圖形物件進行排序。設計思路:用ArrayList作為Card集合,包含一個個Card物件(代表卡片集中的一張張卡片),Card類中關聯一個Shape物件,四種具體的形狀繼承Shape類。本題難度一般般,但要合理利用好ArrayList集合對資料進行處理,關聯好各類之間的關係即可。
部分程式碼展示:
class Circle extends Shape{ double radius; Circle(){ } Circle(double radius){ this.radius=radius; } public double getRadius() { return radius; } public void setRadius(double radius) { this.radius = radius; } public double getArea(){ return Math.PI*radius*radius; } public boolean validate() { if(radius<=0) { return false; } return true; } public String toString() { String str ="Circle: "; System.out.printf("Circle:%.2f ",getArea()); return str; } } class Rectangle extends Shape{ double width,length; Rectangle(){ } Rectangle(double width,double length){ this.width = width; this.length = length; } public double getWidth() { return width; } public void setWidth(double width) { this.width = width; } public double getLength() { return length; } public void setLength(double length) { this.length = length; } public double getArea(){ return width*length; } public boolean validate() { if(width<=0||length<=0) return false; else return true; } public String toString() { String str ="Rectangle: "; System.out.printf("Rectangle:%.2f ",getArea()); return str; } }
生成報表展示:(使用SourceMonitor)
類圖展示:(使用PowerDesigner)
題目:題目集7(7-2)
沿襲作業 7-1,本次作業主要對卡片(Card)進行分組遊戲,其規則為隨機發放一些卡片給學生, 卡片仍然分為四種形狀:圓形(Circle)、矩形(Rectangle)、三角形(Triangle)及梯形(Trapezoid), 並給出各種卡片的相應引數,要求學生首先根據卡片型別將所有卡片進行分組(一個型別分為一組, 所以最多四組),然後能夠對每組內的卡片根據面積值從大到小進行排序,同時求出該組內所有卡片 的面積之和,最後求出每組卡片面積之和中的最大值。
輸入格式:
- 在一行上輸入一串數字(1~4,整數),其中,1代表圓形卡片,2代表矩形卡片,3代表三角形卡片,4代表梯形卡片。各數字之間以一個或多個空格分隔,以“0”結束。例如:
1 3 4 2 1 3 4 2 1 3 0
- 根據第一行數字所代表的卡片圖形型別,依次輸入各圖形的相關引數,例如:圓形卡片需要輸入圓的半徑,矩形卡片需要輸入矩形的寬和長,三角形卡片需要輸入三角形的三條邊長,梯形需要輸入梯形的上底、下底以及高。各資料之間用一個或多個空格分隔。
輸出格式:
- 如果圖形數量非法(<=0)或圖形屬性值非法(數值<0以及三角形三邊不能組成三角形),則輸出
Wrong Format
。 - 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
- 排序前的各圖形型別及面積,格式為
[圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n ]
,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格,在結束符“]”之前; - 輸出分組後的圖形型別及面積,格式為
[圓形分組各圖形型別及面積][矩形分組各圖形型別及面積][三角形分組各圖形型別及面積][梯形分組各圖形型別及面積]
,各組內格式為圖形名稱:面積值
。按照“Circle、Rectangle、Triangle、Trapezoid”的順序依次輸出; - 各組內圖形排序後的各圖形型別及面積,格式同排序前各組圖形的輸出;
- 各組中面積之和的最大值輸出,格式為
The max area:面積值
。
設計分析:本題在題目7-1的基礎上進行修改,在針對物件屬性排序的基礎上增加對同一種圖形物件的分類,需要把握好如何處理類的屬性以及重寫compareTo方法。
這道題就不展示程式碼了~~~
生成報表展示:(使用SourceMonitor)
類圖展示:(使用PowerDesigner)
2.題目集8和題目集9設計思路分析總結
題目:題目集8(8-1)
編寫一個銀行 ATM 機的模擬程式,能夠完成使用者的存款、取款以及查詢餘額功能。
輸入格式:
每一行輸入一次業務操作,可以輸入多行,最終以字元#終止。具體每種業務操作輸入格式如下:
- 存款、取款功能輸入資料格式:
卡號 密碼 ATM機編號 金額
(由一個或多個空格分隔), 其中,當金額大於0時,代表取款,否則代表存款。 - 查詢餘額功能輸入資料格式:
卡號
輸出格式:
①輸入錯誤處理
- 如果輸入卡號不存在,則輸出
Sorry,this card does not exist.
。 - 如果輸入ATM機編號不存在,則輸出
Sorry,the ATM's id is wrong.
。 - 如果輸入銀行卡密碼錯誤,則輸出
Sorry,your password is wrong.
。 - 如果輸入取款金額大於賬戶餘額,則輸出
Sorry,your account balance is insufficient.
。 - 如果檢測為跨行存取款,則輸出
Sorry,cross-bank withdrawal is not supported.
。
②取款業務輸出
輸出共兩行,格式分別為:
[使用者姓名]在[銀行名稱]的[ATM編號]上取款¥[金額]
當前餘額為¥[金額]
其中,[]說明括起來的部分為輸出屬性或變數,金額均保留兩位小數。
③存款業務輸出
輸出共兩行,格式分別為:
[使用者姓名]在[銀行名稱]的[ATM編號]上存款¥[金額]
當前餘額為¥[金額]
其中,[]說明括起來的部分為輸出屬性或變數,金額均保留兩位小數。
④查詢餘額業務輸出
¥[金額]
金額保留兩位小數。
設計分析:此題沒有參考實驗提供類圖而編碼,因此導致程式碼冗長複雜。設計思路:將題目提供的賬戶資訊分別建立成不同類,對輸入的內容進行正則匹配判斷正誤後,去修改物件屬性並顯示於控制檯介面。
生成報表展示:(使用SourceMonitor)
類圖展示:(使用PowerDesigner)
題目:題目集9(9-1)
略,相比於8-1增加信用卡類
設計分析:相比於8-1,重新構造類圖設計,使用多重從大及小的關聯設計,使得程式程式碼更加簡潔並且提高了程式的複用性,程式整體結構清晰良好。
生成報表展示:(使用SourceMonitor)
類圖展示:(使用PowerDesigner)
三、踩坑心得
編寫程式碼之前應構造設計好合適的類圖,java不是面向過程,不能為了得到某個結果而去編寫程式碼,應設計好類之間的關係,否則程式碼將會太過於冗長繁雜且難懂。
四、改進建議
1.提前設計好類圖,確保類之間結構清晰
2.寫程式碼需要加上必要的註釋並保證程式碼編寫的規範性
3.編寫程式碼時,保證java語言的抽象、繼承、封裝和多型性
4.編寫方法時要從物件的身上多去考慮,提高程式的簡潔性、建立各個物件之間的鬆耦合關係
五、總結
通過這三次題目集的訓練,使我進一步對java語言有了更深的理解,意識到了編寫java程式碼時需要注意的細節,例如:優先將java物件資料初始化、將職責過多的類進行分解等等,特別在本次將題目集8、9中,使我明白了設計一個好的類圖的重要性。通過這段時間的學習,能更好地使用繼承和介面,提高程式碼的拓展性、適應性。未來將繼續學習java,按時回顧知識內容,進一步提升自己對java語言使用的能力!