oo習題總結3
前言:
最近一段時間學習的習題均意在讓我們加深瞭解類的繼承、多型性使用方法等等面對物件程式設計的特性。並且通過試題還了解到了一些程式設計的基本原則與java中的集合框架,通過習題的實踐還讓我瞭解到了合理設計類與合理設計類的功能的重要性。
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:面積值
參考類圖:
不同形狀均繼承Shape,在card類中依賴了一個Shape型別的物件,由於各種形狀都繼承Shape於是該變數可以表示任意一個形狀,體現了多型性。
做為抽象類的shape類,其中定義了得到面積getarea方法的,用來檢驗輸入資料是否正確的validate方法,還有重寫了object類的就是tostring方法,繼承了他的子類,就可以利用這些方法來檢測自身資料是否合理,或者重寫方法得到面積,卡類依賴了一個shape類,通過實現介面可以使得它可以簡單排序。
由題目可知要求依據面積對幾個形狀的 進行排序,可以用collections的sort方法對一個列表的元素進行快速排序,為了讓列表中的元素依照指定的方式進行排序使Card類實現comparable介面並重寫介面方法,依據面積進行排序。
@Override public int compareTo(Card o) { // TODO 自動生成的方法存根 if(shape.getArea()>o.getShape().getArea()) return -1; if(shape.getArea()==o.getShape().getArea()) return 0; if(shape.getArea()<o.getShape().getArea()) return 1; return 0; } }
在習題7-2中要求
輸入的圖形按照圖形型別進行分組並輸出
輸出格式:
- 如果圖形數量非法(<=0)或圖形屬性值非法(數值<0以及三角形三邊不能組成三角形),則輸出
Wrong Format
。 - 如果輸入合法,則正常輸出,所有數值計算後均保留小數點後兩位即可。輸出內容如下:
- 排序前的各圖形型別及面積,格式為
[圖形名稱1:面積值1圖形名稱2:面積值2 …圖形名稱n:面積值n ]
,注意,各圖形輸出之間用空格分開,且輸出最後存在一個用於分隔的空格,在結束符“]”之前; - 輸出分組後的圖形型別及面積,格式為
[圓形分組各圖形型別及面積][矩形分組各圖形型別及面積][三角形分組各圖形型別及面積][梯形分組各圖形型別及面積]
,各組內格式為圖形名稱:面積值
。按照“Circle、Rectangle、Triangle、Trapezoid”的順序依次輸出; - 各組內圖形排序後的各圖形型別及面積,格式同排序前各組圖形的輸出;
- 各組中面積之和的最大值輸出,格式為
The max area:面積值
。
可知只需要在對各個相同的圖形類做一個合併就可以,可以格外設立多個列表裝入相同形狀的物件如何利用sort方法就可以做到快速排序。
1 ArrayList<Card> carlist=new ArrayList<>(); 2 ArrayList<Card> listOfci=new ArrayList<>(); 3 ArrayList<Card> listOfjuxing=new ArrayList<>(); 4 ArrayList<Card> listOfsjx=new ArrayList<>(); 5 ArrayList<Card> listOftixing=new ArrayList<>(); 6 DealCardList(ArrayList<Integer> list){ 7 for(int i=0;i<list.size();i++) { 8 if(list.get(i)==1) { 9 Circle ci=new Circle(Main.input.nextDouble()); 10 carlist.add(new Card(ci)); 11 listOfci.add(carlist.get(i)); 12 } 13 if(list.get(i)==2) { 14 cfx cf=new cfx(Main.input.nextDouble(), Main.input.nextDouble()); 15 carlist.add(new Card(cf)); 16 listOfjuxing.add(carlist.get(i)); 17 } 18 if(list.get(i)==3) { 19 carlist.add(new Card(new sjx(Main.input.nextDouble(), Main.input.nextDouble(),Main.input.nextDouble()))); 20 listOfsjx.add(carlist.get(i));} 21 if(list.get(i)==4) { 22 23 carlist.add(new Card(new tixing(Main.input.nextDouble(), Main.input.nextDouble(), Main.input.nextDouble()))); 24 listOftixing.add(carlist.get(i)); 25 } 26 } 27
7-1 7-2 Atm類設計
1.作業目標編寫一個銀行ATM機的模擬程式,能夠完成使用者的存款、取款以及查詢餘額功能。
輸入格式:
每一行輸入一次業務操作,可以輸入多行,最終以字元#終止。具體每種業務操作輸入格式如下:
- 存款、取款功能輸入資料格式:
卡號 密碼 ATM機編號 金額
(由一個或多個空格分隔), 其中,當金額大於0時,代表取款,否則代表存款。 - 查詢餘額功能輸入資料格式:
卡號
本次作業中銀行卡包含借記卡和信用卡兩類,且允許跨行辦理相關業務,借記業務與跨行取款業務均需要手續費。
手續費預設均從銀行卡所對應的賬戶中自動扣除。
跨行業務手續費收取比例由ATM機隸屬銀行決定,例如,使用者手持中國工商銀行的銀行卡在中國建設銀行的ATM上進行取款操作,則手續費收取比例為中國建設銀行的相應比例,按初始化資料中的規定為取款金額的2%。
跨行查詢餘額不收取手續費。
透支取款手續費由中國銀聯統一規定為5%,最大透支金額均為50000元
類圖:
可知程式的一切功能都由UnionPay進入,程式的資料初始化由InitDate類來完成,模擬的借記操作由Withdraw類來完成,下面放上程式碼。
1 package Ptatext; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.Scanner; 6 import java.util.regex.Matcher; 7 import java.util.regex.Pattern; 8 9 /** 10 * 賬戶抽象類 11 * 12 * @author Administrator 13 * @date 14 */ 15 abstract class AbstractAccount { 16 private String accountNO;// 賬號 17 private double balance = 0;// 餘額 18 private User user = null;// 使用者 19 private Bank bank = null;// 所屬銀行 20 private double ratio = 0;// 透支取款手續費 21 private double overdrawAmount = 0;// 可透支金額 22 private static ArrayList<Card> list = new ArrayList<Card>(); 23 24 public AbstractAccount() { 25 super(); 26 // TODO Auto-generated constructor stub 27 } 28 29 public AbstractAccount(String accountNO, double balance, User user, Bank bank, double ratio, 30 double overdrawAmount) { 31 super(); 32 this.accountNO = accountNO; 33 this.balance = balance; 34 this.user = user; 35 this.bank = bank; 36 this.ratio = ratio; 37 this.overdrawAmount = overdrawAmount; 38 } 39 40 public String getAccountNO() { 41 return accountNO; 42 } 43 44 public void setAccountNO(String accountNO) { 45 this.accountNO = accountNO; 46 } 47 48 public double getBalance() { 49 return balance; 50 } 51 52 public void setBalance(double balance) { 53 this.balance = balance; 54 } 55 56 public User getUser() { 57 return user; 58 } 59 60 public void setUser(User user) { 61 this.user = user; 62 } 63 64 public double getOverdrawAmount() { 65 return overdrawAmount; 66 } 67 68 public void setOverdrawAmount(double overdrawAmount) { 69 this.overdrawAmount = overdrawAmount; 70 } 71 72 public Bank getBank() { 73 return bank; 74 } 75 76 public void setBank(Bank bank) { 77 this.bank = bank; 78 } 79 80 public double getRatio() { 81 return ratio; 82 } 83 84 public void setRatio(double ratio) { 85 this.ratio = ratio; 86 } 87 88 public static ArrayList<Card> getList() { 89 return list; 90 } 91 92 public static void setList(ArrayList<Card> list) { 93 AbstractAccount.list = list; 94 } 95 96 public void addCard(Card card) { 97 list.add(card); 98 } 99 100 public void removeCard(Card card) { 101 list.remove(card); 102 } 103 } 104 105 /** 106 * ATM機類 107 * 108 * @author Administrator 109 * @date 110 */ 111 class ATM { 112 private String ATMID; 113 private Bank bank = null;// ATM所隸屬銀行 114 115 public ATM() { 116 super(); 117 // TODO Auto-generated constructor stub 118 } 119 120 public ATM(String aTMID, Bank bank) { 121 super(); 122 ATMID = aTMID; 123 this.bank = bank; 124 } 125 126 public String getATMID() { 127 return ATMID; 128 } 129 130 public void setATMID(String aTMID) { 131 ATMID = aTMID; 132 } 133 134 public Bank getBank() { 135 return bank; 136 } 137 138 public void setBank(Bank bank) { 139 this.bank = bank; 140 } 141 } 142 143 /** 144 * 工具類,和上次程式不同處之一,希望大家思考下該類的作用 145 * 146 * @author Administrator 147 * @date 148 */ 149 class ATMUtil { 150 /** 151 * 根據卡號獲取銀行卡,卡號正確則返回卡物件,否則返回null 152 * 153 * @param unionPay 154 * @param cardNO 155 * @return 156 */ 157 public static Card getCardbyCardNO(UnionPay unionPay, String cardNO) { 158 Card card = null; 159 Iterator<Bank> bankItr = unionPay.getBankList().iterator(); 160 161 while (bankItr.hasNext()) { 162 ArrayList<AbstractAccount> accountList = bankItr.next().getAccountList(); 163 Iterator<AbstractAccount> accountItr = accountList.iterator(); 164 while (accountItr.hasNext()) { 165 ArrayList<Card> cardList = accountItr.next().getList(); 166 Iterator<Card> cardItr = cardList.iterator(); 167 while (cardItr.hasNext()) { 168 card = cardItr.next(); 169 if (card.getCardNO().equals(cardNO)) { 170 return card; 171 } 172 } 173 } 174 } 175 return null; 176 } 177 178 /** 179 * 根據ATM ID求得ATM物件,如果ID正確則返回ATM物件,否則返回null 180 * 181 * @param unionPay 182 * @param ATMID 183 * @return 184 */ 185 public static ATM getATMbyATMID(UnionPay unionPay, String ATMID) { 186 Iterator<Bank> bankItr = unionPay.getBankList().iterator(); 187 Bank bank = null; 188 ATM aTM = null; 189 190 while (bankItr.hasNext()) { 191 bank = bankItr.next(); 192 Iterator<ATM> aTMItr = bank.getATMList().iterator(); 193 194 while (aTMItr.hasNext()) { 195 aTM = aTMItr.next(); 196 if (aTM.getATMID().equals(ATMID)) { 197 return aTM; 198 } 199 } 200 } 201 return null; 202 } 203 204 /** 205 * 根據卡號獲取改卡所隸屬的賬號,若卡號正確,則返回賬號物件,否則返回null 206 * 207 * @param cardNO 208 * @return 209 */ 210 public static AbstractAccount getAccountbyCardNO(String cardNO) { 211 Iterator<Card> cardItr = AbstractAccount.getList().iterator(); 212 Card card = null; 213 214 while (cardItr.hasNext()) { 215 card = cardItr.next(); 216 if (card.getCardNO().equals(cardNO)) { 217 return card.getAccount(); 218 } 219 } 220 return null; 221 } 222 } 223 224 /** 225 * 銀行類 226 * 227 * @author Administrator 228 * @date 229 */ 230 class Bank { 231 private String bankNO;// 銀行編號 232 private String bankName;// 銀行名稱 233 private double commission;// 跨行業務收取的手續費 234 // 銀行擁有的賬戶列表 235 private ArrayList<AbstractAccount> accountList = new ArrayList<AbstractAccount>(); 236 // 銀行擁有的ATM機列表 237 private ArrayList<ATM> ATMList = new ArrayList<ATM>(); 238 239 public Bank() { 240 super(); 241 // TODO Auto-generated constructor stub 242 } 243 244 public Bank(String bankNO, String bankName, double commission) { 245 super(); 246 this.bankNO = bankNO; 247 this.bankName = bankName; 248 this.commission = commission; 249 } 250 251 public String getBankNO() { 252 return bankNO; 253 } 254 255 public void setBankNO(String bankNO) { 256 this.bankNO = bankNO; 257 } 258 259 public String getBankName() { 260 return bankName; 261 } 262 263 public void setBankName(String bankName) { 264 this.bankName = bankName; 265 } 266 267 public double getCommission() { 268 return commission; 269 } 270 271 public void setCommission(double commission) { 272 this.commission = commission; 273 } 274 275 public void addAccount(AbstractAccount account) { 276 this.accountList.add(account); 277 } 278 279 public void removeAccount(AbstractAccount account) { 280 this.accountList.remove(account); 281 } 282 283 public void addATM(ATM aTM) { 284 this.ATMList.add(aTM); 285 } 286 287 public void removeATM(ATM aTM) { 288 this.ATMList.remove(aTM); 289 } 290 291 public ArrayList<AbstractAccount> getAccountList() { 292 return accountList; 293 } 294 295 public void setAccountList(ArrayList<AbstractAccount> accountList) { 296 this.accountList = accountList; 297 } 298 299 public ArrayList<ATM> getATMList() { 300 return ATMList; 301 } 302 303 public void setATMList(ArrayList<ATM> aTMList) { 304 ATMList = aTMList; 305 } 306 } 307 308 /** 309 * 銀行卡類,大家思考下該類與賬戶類的關係,例如使用者的餘額為什麼不是設定在Card類中 310 * 311 * @author Administrator 312 * @date 313 */ 314 class Card { 315 private String cardNO;// 卡號 316 private String cardPassword;// 密碼 317 private AbstractAccount account = null;// 該卡所屬賬號 318 319 public Card() { 320 super(); 321 // TODO Auto-generated constructor stub 322 } 323 324 public Card(String cardNO, String cardPassword, AbstractAccount account) { 325 super(); 326 this.cardNO = cardNO; 327 this.cardPassword = cardPassword; 328 this.account = account; 329 } 330 331 public String getCardNO() { 332 return cardNO; 333 } 334 335 public void setCardNO(String cardNO) { 336 this.cardNO = cardNO; 337 } 338 339 public String getCardPassword() { 340 return cardPassword; 341 } 342 343 public AbstractAccount getAccount() { 344 return account; 345 } 346 347 public void setAccount(AbstractAccount account) { 348 this.account = account; 349 } 350 351 public void setCardPassword(String cardPassword) { 352 this.cardPassword = cardPassword; 353 } 354 355 public boolean checkCard() { 356 Pattern p = Pattern.compile("\\d{16}+"); 357 Matcher m = p.matcher(this.cardNO); 358 return m.matches(); 359 } 360 361 public boolean checkPassword(String password) { 362 return this.cardPassword.equals(password); 363 } 364 365 } 366 367 /** 368 * 信用卡類,繼承自抽象賬戶類 369 * 370 * @author Administrator 371 * @date 372 */ 373 class CreditAccount extends AbstractAccount { 374 375 public CreditAccount() {// 貸記賬戶 376 super(); 377 // TODO Auto-generated constructor stub 378 this.setRatio(0.05); 379 } 380 381 public CreditAccount(String accountNO, double balance, User user, Bank bank, double ratio, double overdrawAmount) { 382 super(accountNO, balance, user, bank, 0.05, 50000.00);// 這是取巧但並不好的一種設計,大家思考下 383 // TODO Auto-generated constructor stub 384 } 385 } 386 387 /** 388 * 借記卡類,繼承自抽象賬戶類 389 * 390 * @author Administrator 391 * @date 2021/06/12 392 */ 393 class DebitAccount extends AbstractAccount {// 借記賬戶 394 395 public DebitAccount() { 396 super(); 397 this.setRatio(0); 398 // TODO Auto-generated constructor stub 399 } 400 401 public DebitAccount(String accountNO, double balance, User user, Bank bank, double ratio, double overdrawAmount) { 402 super(accountNO, balance, user, bank, 0, 0.00);// 同信用卡類的設計 403 // TODO Auto-generated constructor stub 404 } 405 } 406 407 /** 408 * 業務類,查詢餘額 409 * 410 * @author Administrator 411 * @date 412 */ 413 class GetBalance { 414 private UnionPay unionPay;// UnionPay類為一切業務類的入口 415 416 public GetBalance() { 417 super(); 418 // TODO Auto-generated constructor stub 419 } 420 421 public GetBalance(UnionPay unionPay) { 422 super(); 423 this.unionPay = unionPay; 424 } 425 426 public double getBalance(String cardNO) { 427 return ATMUtil.getCardbyCardNO(unionPay, cardNO).getAccount().getBalance(); 428 } 429 } 430 431 /** 432 * 資料初始化類 433 * 434 * @author Administrator 435 * @date 436 */ 437 class InitData { 438 439 public InitData() { 440 // TODO Auto-generated constructor stub 441 } 442 443 public static UnionPay initData() { 444 UnionPay unionPay = new UnionPay(); 445 446 Bank ccb = new Bank("1001", "中國建設銀行", 0.02); 447 Bank icbc = new Bank("1002", "中國工商銀行", 0.03); 448 Bank abc = new Bank("1003", "中國農業銀行", 0.04);// new 449 unionPay.addBank(ccb); 450 unionPay.addBank(icbc); 451 unionPay.addBank(abc);// new 452 453 ATM aTM1 = new ATM("01", ccb); 454 ATM aTM2 = new ATM("02", ccb); 455 ATM aTM3 = new ATM("03", ccb); 456 ATM aTM4 = new ATM("04", ccb); 457 ATM aTM5 = new ATM("05", icbc); 458 ATM aTM6 = new ATM("06", icbc); 459 ATM aTM7 = new ATM("07", abc);// new 460 ATM aTM8 = new ATM("08", abc);// new 461 ATM aTM9 = new ATM("09", abc);// new 462 ATM aTM10 = new ATM("10", abc);// new 463 ATM aTM11 = new ATM("11", abc);// new 464 465 ccb.addATM(aTM1); 466 ccb.addATM(aTM2); 467 ccb.addATM(aTM3); 468 ccb.addATM(aTM4); 469 icbc.addATM(aTM5); 470 icbc.addATM(aTM6); 471 abc.addATM(aTM7);// new 472 abc.addATM(aTM8);// new 473 abc.addATM(aTM9);// new 474 abc.addATM(aTM10);// new 475 abc.addATM(aTM11);// new 476 477 User Yangguo = new User("360101200102122324", "楊過", "13856223254"); 478 User Guojing = new User("360101200012302552", "郭靖", "13800021124"); 479 User Zhangwuji = new User("360502199805163221", "張無忌", "13952110011"); 480 User Weixiaobao = new User("360201200513243326", "韋小寶", "13025996587"); 481 User Zhangsanfeng = new User("360102199713459810", "張三丰", "13677871290");// new 482 User Linghuchong = new User("360503190299878473", "令狐沖", "13609899238");// new 483 User Qiaofeng = new User("360607194313666711", "喬峰", "13677871290");// new 484 User Hongqigong = new User("363220987809872234", "洪七公", "13609009454");// new 485 486 AbstractAccount ccbAcc1 = new DebitAccount("3217000010041315709", 10000.00, Yangguo, ccb, 0, 0); 487 AbstractAccount ccbAcc2 = new DebitAccount("3217000010041315715", 10000.00, Yangguo, ccb, 0, 0); 488 AbstractAccount ccbAcc3 = new DebitAccount("3217000010051320007", 10000.00, Guojing, ccb, 0, 0); 489 AbstractAccount ccbAcc4 = new CreditAccount("3640000010045442002", 10000.00, Zhangsanfeng, ccb, 0.05, 50000.00);// new 490 491 AbstractAccount icbcAcc1 = new DebitAccount("3222081502001312389", 10000.00, Zhangwuji, icbc, 0, 0); 492 AbstractAccount icbcAcc2 = new DebitAccount("3222081502001312390", 10000.00, Zhangwuji, icbc, 0, 0); 493 AbstractAccount icbcAcc3 = new DebitAccount("3222081502001312399", 10000.00, Zhangwuji, icbc, 0, 0); 494 AbstractAccount icbcAcc4 = new DebitAccount("3222081502051320785", 10000.00, Weixiaobao, icbc, 0, 0); 495 AbstractAccount icbcAcc5 = new DebitAccount("3222081502051320786", 10000.00, Weixiaobao, icbc, 0, 0); 496 AbstractAccount icbcAcc6 = 497 new CreditAccount("3640000010045441009", 10000.00, Linghuchong, icbc, 0.05, 50000.00);// new 498 499 AbstractAccount abcAcc1 = new CreditAccount("3630000010033431001", 10000.00, Qiaofeng, abc, 0.05, 50000.00);// new 500 AbstractAccount abcAcc2 = new CreditAccount("3630000010033431008", 10000.00, Hongqigong, abc, 0.05, 50000.00);// new 501 502 ccb.addAccount(ccbAcc1); 503 ccb.addAccount(ccbAcc2); 504 ccb.addAccount(ccbAcc3); 505 ccb.addAccount(ccbAcc4);// new 506 507 icbc.addAccount(icbcAcc1); 508 icbc.addAccount(icbcAcc2); 509 icbc.addAccount(icbcAcc3); 510 icbc.addAccount(icbcAcc4); 511 icbc.addAccount(icbcAcc5); 512 icbc.addAccount(icbcAcc6);// new 513 514 abc.addAccount(abcAcc1);// new 515 abc.addAccount(abcAcc2);// new 516 517 Yangguo.addAccount(ccbAcc1); 518 Yangguo.addAccount(ccbAcc2); 519 Guojing.addAccount(ccbAcc3); 520 Zhangsanfeng.addAccount(ccbAcc4);// new 521 522 Zhangwuji.addAccount(icbcAcc1); 523 Zhangwuji.addAccount(icbcAcc2); 524 Zhangwuji.addAccount(icbcAcc3); 525 Weixiaobao.addAccount(icbcAcc4); 526 Weixiaobao.addAccount(icbcAcc5); 527 Linghuchong.addAccount(icbcAcc6);// new 528 529 Qiaofeng.addAccount(abcAcc1);// new 530 Hongqigong.addAccount(abcAcc2);// new 531 532 Card ccbCard1 = new Card("6217000010041315709", "88888888", ccbAcc1); 533 Card ccbCard2 = new Card("6217000010041315715", "88888888", ccbAcc1); 534 Card ccbCard3 = new Card("6217000010041315718", "88888888", ccbAcc2); 535 Card ccbCard4 = new Card("6217000010051320007", "88888888", ccbAcc3); 536 537 Card icbcCard5 = new Card("6222081502001312389", "88888888", icbcAcc1); 538 Card icbcCard6 = new Card("6222081502001312390", "88888888", icbcAcc2); 539 Card icbcCard7 = new Card("6222081502001312399", "88888888", icbcAcc3); 540 Card icbcCard8 = new Card("6222081502001312400", "88888888", icbcAcc3); 541 Card icbcCard9 = new Card("6222081502051320785", "88888888", icbcAcc4); 542 Card icbcCard10 = new Card("6222081502051320786", "88888888", icbcAcc5); 543 544 Card ccbCard11 = new Card("6640000010045442002", "88888888", ccbAcc4);// new 545 Card ccbCard12 = new Card("6640000010045442003", "88888888", ccbAcc4);// new 546 547 Card icbcCard13 = new Card("6640000010045441009", "88888888", icbcAcc6);// new 548 549 Card abcCard14 = new Card("6630000010033431001", "88888888", abcAcc1);// new 550 Card abcCard15 = new Card("6630000010033431008", "88888888", abcAcc2);// new 551 552 ccbAcc1.addCard(ccbCard1); 553 ccbAcc1.addCard(ccbCard2); 554 ccbAcc2.addCard(ccbCard3); 555 ccbAcc3.addCard(ccbCard4); 556 ccbAcc4.addCard(ccbCard11);// new 557 ccbAcc4.addCard(ccbCard12);// new 558 559 icbcAcc1.addCard(icbcCard5); 560 icbcAcc2.addCard(icbcCard6); 561 icbcAcc3.addCard(icbcCard7); 562 icbcAcc3.addCard(icbcCard8); 563 icbcAcc4.addCard(icbcCard9); 564 icbcAcc5.addCard(icbcCard10); 565 icbcAcc6.addCard(icbcCard13);// new 566 567 abcAcc1.addCard(abcCard14);// new 568 abcAcc2.addCard(abcCard15);// new 569 570 return unionPay; 571 } 572 } 573 574 /** 575 * 銀聯類 576 * 577 * @author Administrator 578 * @date 579 */ 580 class UnionPay { 581 private ArrayList<Bank> bankList = new ArrayList<Bank>();// 銀聯包含的銀行列表 582 583 public UnionPay() { 584 super(); 585 // TODO Auto-generated constructor stub 586 } 587 588 public UnionPay(ArrayList<Bank> bankList) { 589 super(); 590 this.bankList = bankList; 591 } 592 593 public ArrayList<Bank> getBankList() { 594 return bankList; 595 } 596 597 public void setBankList(ArrayList<Bank> bankList) { 598 this.bankList = bankList; 599 } 600 601 public void addBank(Bank bank) { 602 this.bankList.add(bank); 603 } 604 605 public void removeBank(Bank bank) { 606 this.bankList.remove(bank); 607 } 608 } 609 610 /** 611 * 使用者類 612 * 613 * @author Administrator 614 * @date 615 */ 616 class User { 617 private String ID;// 身份證號 618 private String name;// 姓名 619 private String Phone;// 電話號碼 620 ArrayList<AbstractAccount> list = new ArrayList<AbstractAccount>();// 該使用者擁有的賬戶列表(注意,賬戶可能隸屬於不同銀行 621 622 public User() { 623 super(); 624 // TODO Auto-generated constructor stub 625 } 626 627 public User(String iD, String name, String phone) { 628 super(); 629 ID = iD; 630 this.name = name; 631 Phone = phone; 632 } 633 634 public String getID() { 635 return ID; 636 } 637 638 public void setID(String iD) { 639 ID = iD; 640 } 641 642 public String getPhone() { 643 return Phone; 644 } 645 646 public void setPhone(String phone) { 647 Phone = phone; 648 } 649 650 public String getName() { 651 return name; 652 } 653 654 public void setName(String name) { 655 this.name = name; 656 } 657 658 public void addAccount(AbstractAccount ccbAcc1) { 659 this.list.add(ccbAcc1); 660 } 661 662 public void removeAccount(DebitAccount account) { 663 this.list.remove(account); 664 } 665 } 666 667 /** 668 * 業務類,取款類 669 * 670 * @author Administrator 671 * @date 672 */ 673 class Withdraw { 674 // 以下屬性為取款需要輸入的資訊 675 private UnionPay unionPay;// 銀聯,一切業務操作的入口 676 private String cardNO;// 卡號 677 private String cardPassword;// 密碼 678 private String ATMID;// ATM編號 679 private double amount;// 取款金額 680 681 // 根據卡號獲取卡物件 682 private Card card = null; 683 // 根據ATM編號獲取ATM物件 684 private ATM aTM = null; 685 // 根據卡號獲取對應賬號 686 private AbstractAccount account = null; 687 // 根據ATM或ATM所屬銀行物件 688 private Bank bank = null; 689 690 public Withdraw() { 691 super(); 692 // TODO Auto-generated constructor stub 693 } 694 695 /** 696 * 697 * @param unionPay 698 * @param cardNO 699 * @param cardPassword 700 * @param aTMID 701 * @param amount 702 */ 703 public Withdraw(UnionPay unionPay, String cardNO, String cardPassword, String aTMID, double amount) { 704 super(); 705 this.unionPay = unionPay; 706 this.cardNO = cardNO; 707 this.cardPassword = cardPassword; 708 ATMID = aTMID; 709 this.amount = amount; 710 } 711 712 /** 713 * 求跨行業務手續費 714 * 715 * @return 716 */ 717 public double getCrossBankCommission(double amount) { 718 return amount * bank.getCommission(); 719 } 720 721 /** 722 * 求透支取款手續費 723 * 724 * @param amount 725 * @return 726 */ 727 public double getOverdrawCommission(double amount) { 728 return amount * account.getRatio(); 729 } 730 731 /** 732 * 校驗是否為跨行取款 733 */ 734 public boolean isCrossBank() { 735 if (account.getBank().getBankNO() != aTM.getBank().getBankNO()) { 736 return true; 737 } 738 return false; 739 } 740 741 /** 742 * 判斷是否為信用卡 743 * 744 * @return 745 */ 746 public boolean isCreditAccount() { 747 if (account instanceof CreditAccount) { 748 return true; 749 } 750 return false; 751 } 752 753 /** 754 * 校驗輸入的資料是否正確 注意:該方法不支援開閉原則,大家可以思考如何設計才能針對各種銀行卡均能夠實現開閉原則 755 * 756 * @return 757 */ 758 public boolean checkData() { 759 760 // 獲取銀行卡物件 761 card = ATMUtil.getCardbyCardNO(unionPay, cardNO); 762 763 // 銀行卡不存在(卡號錯誤) 764 if (card == null) { 765 System.out.println("Sorry,this card does not exist."); 766 return false; 767 } 768 769 // 獲取ATM機物件 770 aTM = ATMUtil.getATMbyATMID(unionPay, ATMID); 771 772 // ATM機不存在(ATM ID錯誤) 773 if (aTM == null) { 774 System.out.println("Sorry,the ATM's id is wrong."); 775 return false; 776 } 777 778 // 獲取ATM機所隸屬銀行物件 779 bank = aTM.getBank(); 780 781 // 使用者密碼錯誤 782 if (!card.getCardPassword().equals(cardPassword)) { 783 System.out.println("Sorry,your password is wrong."); 784 return false; 785 } 786 787 // 根據卡號獲取使用者賬號 788 account = ATMUtil.getAccountbyCardNO(cardNO); 789 790 // 如果為借記卡 791 if (!isCreditAccount()) { 792 double commission = 0; 793 794 // 如果為跨行業務,則收取跨行費用 795 if (this.isCrossBank()) { 796 commission += this.getCrossBankCommission(amount); 797 } 798 // 取款超出餘額 799 if (amount + commission > account.getBalance()) { 800 System.out.println("Sorry,your account balance is insufficient."); 801 return false; 802 } 803 } 804 805 // 如果為信用卡 806 if (isCreditAccount()) { 807 double commission = 0; // 手續費總額 808 double overdrawAmount = 0; // 透支金額 809 double balance = 0; // 當前卡上餘額 810 811 balance = account.getBalance(); // 獲取當前卡餘額 812 813 // 有餘額,則透支金額為取款金額與餘額的差值 814 if (balance >= 0) { 815 overdrawAmount = amount - account.getBalance(); 816 } else {// 餘額為負值(已經透支),則透支金額為取款金額 817 overdrawAmount = amount; 818 } 819 820 // 收取跨行業務費用 821 if (this.isCrossBank()) { 822 commission += this.getCrossBankCommission(amount); 823 } 824 // 收取透支費用 825 if (overdrawAmount > 0) { 826 commission += this.getOverdrawCommission(overdrawAmount); 827 } 828 829 // 如果取款金額與手續費金額之和大於卡片餘額與可透支最大金額之和,無法取款 830 if (commission + amount > account.getBalance() + account.getOverdrawAmount()) { 831 System.out.println("Sorry,your account balance is insufficient."); 832 return false; 833 } 834 } 835 836 return true; 837 } 838 839 /** 840 * 該方法支援開閉原則 841 */ 842 public void withdraw() { 843 double commission = 0; 844 double overdrawAmount = 0; 845 double balance = 0; 846 847 balance = account.getBalance(); 848 849 if (balance >= 0) { 850 overdrawAmount = amount - account.getBalance(); 851 } else { 852 overdrawAmount = amount; 853 } 854 855 // 收取跨行費用 856 if (this.isCrossBank()) { 857 commission += this.getCrossBankCommission(amount); 858 } 859 // 收取透支費用 860 if (overdrawAmount > 0) { 861 commission += this.getOverdrawCommission(overdrawAmount); 862 } 863 864 if (commission + amount > balance + account.getOverdrawAmount()) { 865 System.out.println("Sorry,your account balance is insufficient."); 866 System.exit(0); 867 } 868 869 this.account.setBalance(balance - amount - commission); 870 showResult(this.account); 871 } 872 873 /** 874 * 顯示 875 * 876 * @param account 877 */ 878 public void showResult(AbstractAccount account) { 879 String userName = account.getUser().getName(); 880 String bankName = aTM.getBank().getBankName(); 881 System.out 882 .println("業務:取款 " + userName + "在" + bankName + "的" + ATMID + "號ATM機上取款" + String.format("¥%.2f", amount)); 883 884 System.out.println("當前餘額為" + String.format("¥%.2f", account.getBalance())); 885 } 886 } 887 888 public class Atm類設計 { 889 public static void main(String[] args) { 890 Scanner input = new Scanner(System.in); 891 892 UnionPay unionPay = InitData.initData();// 初始化程式資料 893 894 StringBuilder sb = new StringBuilder();// 用於接收輸入資料 895 896 String data; 897 898 // 解析輸入各行資料 899 while (!((data = input.nextLine()).equals("#"))) { 900 sb.append(data + "\n"); 901 } 902 903 String[] dt = sb.toString().split("\n"); 904 for (int i = 0; i < dt.length; i++) { 905 String[] dataLine = dt[i].toString().split("\\s+"); 906 907 if (dataLine.length == 1) {// 查詢餘額功能 908 GetBalance gb = new GetBalance(unionPay); 909 System.out.println("業務:查詢餘額 " + String.format("¥%.2f", gb.getBalance(dataLine[0]))); 910 } else {// 取款功能 911 Withdraw wd = 912 new Withdraw(unionPay, dataLine[0], dataLine[1], dataLine[2], Double.parseDouble(dataLine[3])); 913 if (wd.checkData()) { 914 wd.withdraw(); 915 } else { 916 System.exit(0); 917 } 918 } 919 } 920 } 921 }View Code
在寫這題的難處就在於各個功能如何去實現以及各個類如何去設計以及各個類之間的關係。就拿我之前的設計來說
class user{ String name; ArrayList<BankCount> mycount=new ArrayList<>();//我的銀行賬號 public user(String name) { this.name = name; } } class Yanguo extends user{ Yanguo(){ super("楊過"); BankCount one=new BankCount("中國建設銀行","3217000010041315709"); one.cardnumb.add("6217000010041315709"); one.cardnumb.add("6217000010041315715"); BankCount two=new BankCount("中國建設銀行", "3217000010041315715"); two.cardnumb.add("6217000010041315718"); mycount.add(one); mycount.add(two); } } class Guojin extends user{ public Guojin() { super("郭靖"); // TODO 自動生成的建構函式存根 BankCount one =new BankCount("中國建設銀行","3217000010051320007"); one.cardnumb.add("6217000010051320007"); } } class ZhanWuji extends user{ public ZhanWuji() { super("張無忌"); // TODO 自動生成的建構函式存根 BankCount one=new BankCount("中國工商銀行", "3222081502001312389"); one.cardnumb.add("6222081502001312389"); BankCount two=new BankCount("中國工商銀行","3222081502001312390"); two.cardnumb.add("6222081502001312390"); BankCount three=new BankCount("中國工商銀行", "3222081502001312399"); three.cardnumb.add("6222081502001312399"); three.cardnumb.add("6222081502001312400"); mycount.add(one); mycount.add(two); mycount.add(three); } }
每個人(user)設計為一個類,明顯不符合類的設計標準,以及設計功能時以簡略為主,沒有考慮到類的設計原則,導致程式碼看起來雜亂難以看懂。
總結:
通過在這幾次的作業和課堂中我更加了解了java中類設計的原則,如
1、內聚性
類應該被描述為一個單一的實體,而所有的類操作應該在邏輯上相互配合,支援一個一致的目的。
2、一致性
遵循標準java程式設計風格和命名習慣,為類、資料域和方法選取具有資訊的名字,通常風格是將資料域的宣告置於構造方法之前,將構造方法置於方法之前,而對於在多個類中執行相同工作的方法,應該用同一個名字。
3、封裝性
一個類應該用private修飾符隱藏資料域,以免使用者直接訪問它,這使得類更易於維護,只有在希望資料可讀的情況下才提供get方法,希望資料可更新的情況下才提供set方法。
4、清晰性
使用者可以以各種不同組合、順序、以及在各種環境中結合使用多個類,因此在設計一個類時,這個類不應該限制使用者如何以及何時使用該類,方法應在不產生混淆的情況下直觀定義,不應該宣告一個來自其他資料域的資料域。
5、要用類名來引用靜態變數和方法。
6、不要從構造方法中直接傳引數初始化靜態資料域。最好使用靜態的set方法改變靜態資料域。
以及部分java程式設計的基本原則就比如:單一職責原則。
在上述Atm類設計中還對 lterator進行了一個基本瞭解
Iterator(迭代器)
java Iterator(迭代器)不是一個集合,它是一種用於訪問集合的方法,可用於迭代ArrayList和HashSet等集合。
Iterator 是 Java 迭代器最簡單的實現,ListIterator 是 Collection API 中的介面, 它擴充套件了 Iterator 介面
Java中的Iterator功能比較簡單,並且只能單向移動:
(1) 使用方法iterator()要求容器返回一個Iterator。第一次呼叫Iterator的next()方法時,它返回序列的第一個元素。注意:iterator()方法是java.lang.Iterable介面,被Collection繼承。
(2) 使用next()獲得序列中的下一個元素。
(3) 使用hasNext()檢查序列中是否還有元素。
(4) 使用remove()將迭代器新返回的元素刪除。
Listlterator
而ListIterator是一個功能更加強大的, 它繼承於Iterator介面,只能用於各種List型別的訪問
相較於上面的迭代器,listlterator可以實現雙向移動遍歷,也可以實現增加或替換元素。