1. 程式人生 > 其它 >題目集7~9的總結性Blog

題目集7~9的總結性Blog

(1)前言

7-1主要考察了類的繼承,多型性的使用方法及介面的應用。難度:中等。

7-2主要考察掌握類的繼承、多型性使用方法以及介面的應用。難度:中等。

8-1主要考察對java綜合能力的考察。難度:中偏上。

9-1主要考察對java綜合能力的考察。難度:偏難。

第九次題目集在第八次題目集的基礎上進行了深入。這次題目集也只有一道題目,需要設計ATM模擬系統,但是比第八次題目集增添了新的內容。和第八次題目集不同,這次題目集不止有借記卡,也加入了信用卡,使用者可以使用信用卡貸款,並且能夠進行跨行存取款,同時需要收取一定的跨行費用。這次題目集的難度更大,演算法更加複雜,同時還新增加了幾個使用者的資訊。

(2)設計與分析

第七次作業

第七次作業主要要求實現圖形卡片的排序,分組,考察類的繼承、多型性使用方法以及介面的應用。由於第二題的程式碼建立在第一題基礎上,故只用第二題程式碼作為論據。

本題我按照題目要求共定義了7個類(Main除外),分別為卡片(Card)、圓形(Circle)、矩形(Rectangle)、三角形(Triangle)、梯形(Trapezoid)、資料處理(DealCardList)及一個抽象類Shape。

本次作業要求對卡片排序時使用 Comparable 介面, 即 Card 類需要實現 Comparable 介面中的 CompareTo()方法。經查詢資料發現,之所以要實現該介面,是為了便於排序,實現該介面的類可以使用合 框架中的一些sort方法,否則強行sort由於編譯器不知如何比較,將會編譯失敗。如果只實現CompareTo()方法,而不實現介面,強行sort依然會報錯,我將此理解為Comparable 介面是對編譯器的一種宣告,沒 有這個宣告,編譯器亦無法知道你設計了比較的功能,從而編譯失敗。

本題設計了一個抽象類shape,圓形(Circle)、矩形(Rectangle)、三角形(Triangle)、梯形(Trapezoid)這些圖形類都繼承該類,這樣做的好處是可以利用多型將實際型別不同的圖形物件變成一張張      卡片,再置於一個Arraylist列表中,進行排序等操作。值得注意的是,對於存入卡片中的子類物件,實際上相當於宣告為父類,由此帶來的一個缺點便是無法呼叫子類中獨有的方法。

類圖

第八次作業

本題要求編寫一個銀行ATM機的模擬程式,能夠完成使用者的存款,取款以及查詢餘額的功能。

本題涉及的類有Bank類、User類、Account類、Card類以及ATM類。

每個使用者對應一張或多張卡號,且每張卡號的密碼都是88888888,如果查詢銀行時輸入的卡號不存在,則輸出“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”。

明確題意後,首先本題需要換行輸入資訊,直到輸入“#”時停止。程式碼如下:

輸入完成後,在使用split函式對輸入字串進行切割存放,然後在一一比對。首先我們先判斷卡號,根據卡號來鎖定銀行使用者,其次我們判斷密碼是否正確,如果正確,我們在進行下一步判斷,否則直接跳出執行的程式。接下來我們在判斷銀行使用者是否在相應的ATM機上進行相關操作,如果不在卡號所對應的ATM機上進行相關操作,則也輸出報錯語句然後跳出程式。最後,在判斷銀行使用者到底時該存款還是該取款,如果輸入金額為大於0則表示銀行使用者將進行取款,否則如果輸入金額小於0則表示銀行使用者將進行存款。下面將給一個銀行使用者的判斷例子:

本題難點在於將輸入的字串切割後存入陣列中,然後用陣列中的元素表示每個需要比較的資料,這就需要靈活巧妙的運用for迴圈語句和if/else語句來進行相關判斷。

類圖如下

第九次作業

  • 這個題目是對上一題的擴充套件,增加了新的業務功能。

    增加了借記卡。銀行賬戶分為借記賬戶和貸記賬戶兩種,其中,借記賬戶不能夠透支 取款,而貸記賬戶可以透支取款,這裡需要支付手續費。

    需要單獨建立一箇中國農業銀行,因為在這題中,借記卡都是這個銀行裡才有的,貸記卡透支取錢需要付5%的手續費,

    此外,如果還要跨行取錢的話,就還需要額外付手續費,這個手續費每個銀行標準都不一樣,

    建立中國農業銀行的時候,也要連帶著把中國農業銀行的基本資料初始化,比如ATM機,這個銀行裡面也有ATM機,

    新加入了三個使用者,:張三丰、令狐沖、喬峰,這些人都是持有中國農業銀行的貸記卡的,業務假定 :系統的測試用例均採用如上資料,

    手續費預設均從銀行卡所對應的賬戶中自動扣除。跨行業務手續費收取比例由 ATM 機隸屬銀行決定,

    例如,使用者手持中國 工商銀行的銀行卡在中國建設銀行的 ATM 上進行取款操作,則手續費收取比例為 中國建設銀行的相應比例,

    按初始化資料中的規定為取款金額的 2%。跨行查詢餘額不收取手續費。透支取款手續費由中國銀聯統一規定為 5%,最大透支金額均為 50000 元。

    其他的就只需要在上次題目的基礎上改進,結果輸出不一樣,大致就是這樣的了。

類圖如下

3踩坑心得

對於題目集7來說的話,採坑的話,自我覺得沒有什麼大地方需要注意,就是要確定自己對於輸入資料是否合法的地方,要注意圖形的是否可以成的地方;對於題目集8和9的話,第一,要注意這個條件 如果檢測為跨行存取款,則輸出Sorry,cross-bank withdrawal is not supported.這個我自己在寫的時候不知道該怎麼樣去在什麼時候判斷,最後發現可以在輸入不存在的ATM機的時候,或者在ATM機對應不到的銀行的時候輸出;還有就我自己的這份程式碼來說,對於重複判斷只是查詢資訊的時候,需要在if的判斷中加一個continue,因為在測試點的時候,有會測試重複查詢的例子;再就是題目集9,也就是加大難度的ATM機,有了兩種卡號,對於我的程式碼來說就會有兩種不同的情況要去判斷,也就是增加了複雜度,這也間接讓自己成功體會了一次因為程式碼情況太多,複雜的後果。因為缺少了一個對應判斷出情況的方法去計算結果,然後就自己一直在測試,最後終於是找到了錯誤的原因——所以一定要減少寫程式碼的時候的複雜度,不要用太多的if-else

4改進建議

經過這幾次題目集,我對於面向物件程式設計這一課程的瞭解也逐漸深入。在題目集九的完成時,老師已經給出了題目集八的原始碼讓我們根據題目集八的原始碼對程式碼進行改進來完成題目集九。我在對老師給出的原始碼研究時,意識到自己之前的程式碼的簡單性,雖然完成了相關的功能,卻沒有任何的複用性,很難在我的程式碼的基礎上進行改進完成題目集九。並且我的程式碼大部分都還停留在面向過程程式設計的思路中,對老師原始碼的研究時,我逐漸理解了面向物件程式設計的內容,對其有了更深的理解,也逐漸開始掌握其中的內容。

5總結

經過這三次題目集的鍛鍊進一步加深了我對類的繼承、多型性使用方法以及介面的理解,明白對實體類的設計要做到單一職責原則,合成複用原則,才能編寫出合格的程式碼。同時對集合框架有了進一步的認識,但由於其類容較多,想要靈活使用,還要在日後不斷學習,反覆使用。