題目集7-9總結
一.前言
經過了題目集7-9的訓練,我感覺收穫頗多,讓我的編碼能力有了很大的提升。題目集7-9的題量並不是很多,但是題目精而且對我來說練習的效果很好,每個題目的解決都是需要花費一些時間,需要我認真的思考,在實現題目要求的過程中和在遇到困難問題去努力解決的過程我鍛鍊了好多,每次看到通過測試點的時候就會特別開心,特別有成就感,想要一下把要求全部實現。
題目集7-9包含了很多知識點,在完成這些題目的時候我也學習到了或者鞏固了相關知識。題目7加強了我對繼承和多型的理解,各種圖形具有一些相同的屬性和方法,可以寫一個Shape類來讓各個圖形類繼承,這樣就實現了程式碼的複用性,減小程式碼和資料的冗餘度,大大增加程式的重用性,繼承通過增強一致性來減少模組間的介面和介面,大大增加了程式的易維護性。同時題目7讓我學會了ArrayList泛型的應用方法,Comparable介面及泛型的應用方法,這樣就可以把一個物件存進列表裡,然後按照物件中某個屬性使用sort()方法排序。題目集8是一個生活中的例項,包含了對ArrayList的使用,包含了繼承和多型,同時需要仔細思考實體類之間的關係,還有類和屬性之間的關係,比如剛開始解題時,我沒有思考清楚,搞錯了餘額屬性和類的關係,把餘額屬性放在了銀行卡實體類中,這導致後面解題錯誤,其實餘額是和銀行賬號繫結在一起的,一個銀行賬號可以對應多個銀行卡,不同的銀行卡只能對應一個銀行賬號,當對銀行卡進行操作的時候是對應銀行賬號的餘額資訊變化。
二.設計與分析
(一)題目集7
(1)類圖
題目7-1和題目7-2的類圖是一樣的
(2)分析總結
在題目集7中,程式碼共有四個實體類,分別為Circle類,Rectangle類,Trapezoid類,Triangle類,它們都繼承了Shape類,擁有了Shape中的getArea()方法來求圖形的面積,擁有validate()方法來判斷輸入的圖形屬性是否合法,擁有toString()方法。通過使用繼承實現了程式碼的複用性,減小程式碼和資料的冗餘度,大大增加程式的重用性。然後main方法通過建立Card物件,把所有每個Card物件儲存在ArrayList中,然後通過sort()方法對Card物件排序即可以得到排序後的卡片,題目7-2和題目7-1不同的地方在於可以按照卡片型別分組輸出卡片,而實現該要求的方法就是把不同型別的Card物件儲存在不同的ArrayList中,然後再對不同的List進行Sort()排序即可實現該進階要求。這次題目集主要是讓我學會了ArrayList泛型的應用方法,Comparable介面及泛型的應用方法。
Card類實現Comparable介面,然後重寫CompareTo()方法
(二)題目集8,9
(1)類圖
題目集8和題目集9的類圖是差不多一樣的,題目集9的類圖BankAccount中增加了一個賬戶型別屬性,分為貸記賬戶和借記賬戶,main方法裡的邏輯不一樣
(2)題目集8和9分析和總結
(1)題目集8
一共有三個實體類,分別是ATM類,銀行賬戶類,銀行卡類,在mian方法中建立各個物件,然後把物件資訊儲存在ArrayList中,最後就能在main方法中編寫相關邏輯程式碼實現銀行的存款,取款,查詢餘額等操作。
圖.儲存物件資訊程式碼
該題目的難點是理清實體類之間的關係,一個銀行賬戶可以對應多張銀行卡,所以不同的銀行卡進行存取款操作時其實是對銀行賬戶的餘額資訊進行操作。銀行賬戶資訊列表中應該儲存銀行卡號資訊的陣列,這樣就能實現一個銀行賬戶可以對應多張銀行卡了。
通過輸入資料的長度判斷執行的操作,長度為1是進行查詢餘額操作,長度為4時則進行存取款操作
當輸入長度不符合格式時報錯
存取款操作後設置新的餘額資訊,這樣就實現了題目要求
出錯提示
(2)題目集9
題目集9時8的進一步迭代要求可以實現跨行取款和透支取款,貸記賬號可以透支,借記賬戶不能透支,跨行取款和透支取款都需要手續費。要實現透支取款則需要在銀行賬戶的屬性中增加賬戶型別,判斷該賬號能否透支。
當借記賬戶取款超出餘額時,提示餘額不足
需要注意的是當為貸記賬戶但透支取款金額大於透支限額時也會提示餘額不足
然後則按題目要求進行操作,如果是透支取款收取手續費,跨行取款也要收取手續費
特別要注意的是如果是借記賬戶但是跨行取款且餘額減去手續費為負數的話則取款失敗
三.採坑心得
(一)題目集7
題目集七中主要收穫是學會了如何實現ArrayList通過某個屬性進行排序,大部分時候ArrayList中儲存的不止一個屬性,這時候排序就需要通過ArrayList中某個屬性進行排序。通過重寫Compare中的CompareTo()方法可以實現升序或降序排序
(二)題目集8,9
題目集8中的採坑主要是沒有理清楚實體類之間的關係,一個銀行賬戶應該要對應多張銀行卡,還有剛開始解題時,我沒有思考清楚,搞錯了餘額屬性和類的關係,把餘額屬性放在了銀行卡實體類中,這導致後面解題錯誤,其實餘額是和銀行賬號繫結在一起的,一個銀行賬號可以對應多個銀行卡,不同的銀行卡只能對應一個銀行賬號,當對銀行卡進行操作的時候是對應銀行賬號的餘額資訊變化
題目集9中的採坑主要是沒有思考清楚邏輯關係,如果是借記賬戶但是跨行取款且餘額減去手續費為負數的話則取款失敗,解題的時候沒有考慮到該情況,導致有一個測試點一直過不了,經過仔細思考後發現了該問題。
四.改進建議
主方法中邏輯語句太多,太過於複雜,不利於程式碼的閱讀和改進,可以新建一個類,把主方法中的一些邏輯語句放到該類當中,讓程式碼看起來更為簡潔,清晰。
五.總結
通過這幾次題目集的訓練,加強了我對繼承和多型的理解,各種圖形具有一些相同的屬性和方法,可以寫一個Shape類來讓各個圖形類繼承,這樣就實現了程式碼的複用性,減小程式碼和資料的冗餘度,大大增加程式的重用性,繼承通過增強一致性來減少模組間的介面和介面,大大增加了程式的易維護性。同時題目7讓我學會了ArrayList泛型的應用方法,Comparable介面及泛型的應用方法,這樣就可以把一個物件存進列表裡,然後按照物件中某個屬性使用sort()方法排序。題目集8,9加強了我的邏輯思維能力,讓我能夠更全面更仔細的去思考問題,考慮每一種可能發生的情況,並對其給出相應的操作。同時,我需要進一步學習ArrayList的使用,加深對繼承和多型的理解,實現面對物件程式設計。我覺得這些題目集訓練效果很好,之後希望可以繼續按這樣的題目型別出題,既不算太容易,也不會太難,經過自己的思考和努力就可以解決這些問題,在這個過程中可以鍛鍊很多。