某公司擬設計和開發乙個停車場管理系統,其基本需求陳述如下:
(1) 乙個停車場有n個車位(n>=5),不同停車場包含的車位數目不同。
(2) 一輛車進入停車場,如果該停車場有空車位且其寬度足以容納車的寬度,則可以在此停車。支援自動分配車位和指定停車位兩種分配方式。
(3) 停在停車場裡的車,隨時可以駛離停車場。
(4) 停車場管理員可以隨時檢視停車場的當前占用情況。
我們能夠發現,乙個停車場裡面肯定是包含停車位和車(講課的時候裡面還有收費這種操作,所以應該還有乙個記錄收費的類)。很明顯的,停車位這個類應該包含停車位的編號還有停車位的寬度(寬度是一定要有的,這個是判斷車是否能夠停進停車位的重要指標);車這個類應該包括車牌號和車的寬度。我們發現在大多數時候一旦停車位和車確定了之後就很難再改變了,所以我們可以將這兩個類變成immutable的類,這會大大簡便我們能之後的操作,而且非常的安全。所以我們要把這些量都標記成private final的。
private final int number;
private final int width;
private final string plateno;
private final int width;
之後我們就應該寫一下這兩個類的af、ri和safety from rep exposure:
//af:
//停車位由唯一的編號和寬度值表示
// representation invariant:
// 停車位編號》0
// 寬度》150
// safety from rep exposure:
// 所有的表示都是private和 final的
//af:
//車輛由唯一的車牌號和寬度值表示
// representation invariant:
// 車牌號不為空,長度大於0
// 車輛寬度》100
// safety from rep exposure:
// 所有的表示都是private和 final的
之後,由於這兩個類都是immutable的,所以不能有mutator,所以我們就寫構造方法constructor和get方法(能自動生成)就好了,然後由於比較車和停車位的時候只需要分別比較他們的寬度是否相等就好了(因為這裡面大多數時候只關心寬度,我們不用比較車牌號和停車位編號),所以我們需要重寫equals方法和hashcode方法(這裡面編譯器也能自動生成)
public
lot(int number, int width)
public
car(string plateno, int width)
之後呢我們就來實現記錄資訊這個類,去過停車場停車的人都知道,最後的停車資訊應該是:「某某牌號的車在某某停車位停了某某時間,消費總計某某錢」,所以我們很容易的就能知道這裡面的變數應該是車,停車位,時間和錢。這裡面一看我們就能看出來,這個類肯定不是immutable的,因為時間裡面我們會計算到結束時間,而結束時間是時刻都在變化的,所以那個時間也應該是mutable的,所以這個類是個mutable的類。但是我們應該盡可能的加private final。
private final car car;
private final lot lot;
private localdatetime timein= localdatetime.
now();
private localdatetime timeout =
null
;private double fee=
0.0;
之後又開始寫af、ri和safety from rep exposure:
//abstraction function:
//代表乙個停車記錄record
//車輛record.getcar()在record.gettimein()時刻停到了record.getlot()車位上,
//在record.gettimeout()離開,花費record.getfee()元
// representation invariant:
// timeout為null,或者 timeout>=timein
// safety from rep exposure:
// 所有的表示都是private的,都是不可變資料型別,通過set和get控制安全性
然後我們就應該開始寫這個類的構造方法,我們應該對於這五個量寫get方法(編譯器自動生成),最後我們應該寫乙個tostring方法,為了輸出資訊
public
record
(car car, lot lot)
然後就應該是寫計算費用的方法,我們是每半小時10元,不足半小時按半小時計算,所以我們應該先以當前時間為結束時間設定結束時間然後計算費用
public double calcfee()
最後我們就應該寫停車場這個類了(老師在寫之前先寫乙個介面,然後再實現這個介面)介面中有各種方法:建立乙個停車場(工廠方法)、在某個停車位上停車、 在停車場停車,自動分配空閒停車位、將汽車駛離停車場、返回當前停車場各車位的狀態、 獲得車場中總的車位數目、看車場中是否存在指定車位號和寬度的車位、 當前停車場是否已滿、獲得寬度大於指定寬度的停車位、返回停車場的名字、返回停車場停車位的編號列表、 返回某車位寬度、獲取停車記錄。我們只需要在實現類中挨個重寫前面的非工廠方法就好了。實現類中我們需要有停車場的名字,停車位的集合,停車場現在的狀態,停車記錄的集合。對於裡面的所有屬性,我們都應該使用private final。
private final string name;
private final set lots =
newhashset
<
>()
;private final map status =
newhashmap
<
>()
;private final set records =
newhashset
<
>()
;
然後就是挨著的實現上述方法了,其實就沒啥特別的了。後面有給了乙個,這個的想法很不錯,能夠讓輸出變得規整很多。
//車位比較器,用於tostring方法中按照車位號公升序排序用
class
lotcomparator
implements
comparator
else
}}
B 習題課一
計算導論與程式設計課程要開習題課,由於教室座位有限,所以決定限制參加人數。於是規定 1 最多允許一半的班級裡的同學參加 2 可以參加的班級最多允許一半的同學參加。現請你寫一段程式來計算習題課最多可能有多少個學生參加。輸入為兩行,第一行為乙個整數n 0題課的人數的最大值。當數字為奇數時,一半指的是該數...
B 習題課一
計算導論與程式設計課程要開習題課,由於教室座位有限,所以決定限制參加人數。於是規定 1 最多允許一半的班級裡的同學參加 2 可以參加的班級最多允許一半的同學參加。現請你寫一段程式來計算習題課最多可能有多少個學生參加。輸入為兩行,第一行為乙個整數n 0題課的人數的最大值。當數字為奇數時,一半指的是該數...
習題課3 1 動態規劃
01揹包 完全揹包public class beibaowenti1 3 1 static class task else return f v 實現結束 void solve inputreader in,printwriter out out.println getanswer n,v,t,w,...