Java實現銀行ATM系統
阿新 • • 發佈:2020-04-22
用Java模擬一個銀行ATM系統,供大家參考,具體內容如下
系統功能介紹:
使用面向物件的程式設計思想,儘可能模擬真實世界中的銀行ATM業務流程。
main方法裡通過呼叫一行程式碼,完成整個業務流程的順序呼叫。
加入了身份證號,手機號等元素,雖然他們不涉及銀行卡的業務處理,但它們是真實世界中辦理銀行卡的必需條件,這些在程式碼中也有所體現。
為了儘可能使得隨機生成的身份證號碼和手機號碼和銀行卡號切合實際,還手動設計了一個工具類,用來生成隨機的號碼。
其中涉及到的知識,包括但不限於static修飾符的使用,集合的使用,許可權修飾符的控制,類與類之間關係的設計,類構建的屬性初始化控制,Scanner輸入控制,工具類BigDecimal和DecimalFormat的使用,隨機數的生成等。
編寫這個程式相對來講還是很有挑戰性的,雖然用到的知識不多,但也很考究你的設計能力和思維能力。
全部程式碼
銀行系統類BankSystem:
public class BankSystem { private static ATM_Machine atm = new ATM_Machine(); private static Set<BankCard> allBankCard = new HashSet<>(); public static void addBanCard(BankCard card){ allBankCard.add(card); } public static Set getAllBanCard(){ return allBankCard; } public static boolean loginATM(ATM_Machine atm){ Scanner input = new Scanner(System.in); String cardNum; System.out.println("請輸入您的銀行卡號:(誤操作,按#號鍵敲回車可再次回到系統主頁面)"); cardNum = input.nextLine(); if (cardNum.equals("#")){ start(); } ArrayList<BankCard> allBankCard = new ArrayList<>(BankSystem.getAllBanCard()); BankCard card = null; boolean isExist = false; for (int i = 0;i<allBankCard.size();i++){ if(allBankCard.get(i).getCARDNUM().equals(cardNum)){ card = allBankCard.get(i);//卡號存在,例項化該銀行卡 isExist = true; } } if (isExist == false){ System.err.println("您輸入的銀行卡號不存在,請重新輸入"); loginATM(atm);//遞迴呼叫 } String name = card.getHolder().getName(); System.out.println("歡迎"+name+"使用本公司智慧提示ATM系統\n請輸入您的銀行卡密碼:"); int password = input.nextInt(); int n = 3;//3次輸入密碼的機會 while (n>0) { if (!atm.loginCheck(card,password)) { n--; System.err.println("您輸入的密碼錯入,請重新輸入,您還有" + n + "次輸入機會!"); if(n==0){ atm.exit(); return false; } password = input.nextInt(); }else{ System.out.println("密碼正確,正在啟動系統···"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } atm.showOperation(card); return true; } } atm.exit(); return false; } public static void start(){ System.out.println("\t=============歡迎進入我們的銀行系統=============\t"); System.out.println("1.沒有銀行卡,我要辦理\t\t\t2.已有銀行卡,我要通過ATM辦理一些業務"); System.out.println("3.退出整個銀行系統"); System.out.println("請選擇您的操作:"); Scanner input = new Scanner(System.in); //只需要輸入名字,即可辦理銀行卡。身份證號,手機號,銀行卡號,自動隨機生成(只是為了最大限度模擬現實情景的同時,又不讓測試時輸入太多繁瑣的東西) String option = input.nextLine(); if (option.equals("1")){ Customer customer = new Customer(); customer.registerIdentify(); BankCard card = customer.applyBankCard(customer.getIdentityCard(),customer.getPhoneNum()); //allBankCard.add(card);//將新辦理的銀行卡存入系統中 //辦理完銀行卡會在applyBankCard方法內自動存入系統中 System.out.println("您的銀行卡已經辦理完畢,即將再次進入系統···"); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } start(); }else if(option.equals("2")){ loginATM(atm); }else if (option.equals("3")){ System.out.println("您慢走,感謝你的到來,歡迎下次再來辦理業務"); }else { System.err.println("您輸入了不合法的字元"); start(); } } }
ATM_Machine類:
public class ATM_Machine { private boolean isFirstShow = true; public boolean loginCheck(BankCard card,int password){ int truePassword = card.getPassword(); if (truePassword == password){ return true; } return false; } public void showTitle(){ System.out.println("------------ATM系統------------"); } //登入成功後,系統開始工作 public void showOperation(BankCard card){ //登入,查詢餘額,存款,取款,轉賬,銷戶,開戶,退出 Scanner input = new Scanner(System.in); if(isFirstShow) { this.showTitle(); isFirstShow = false; } System.out.println("1.查詢餘額\t\t\t2.存款"); System.out.println("3.轉賬 \t\t\t4.取款"); System.out.println("5.銷戶 \t\t\t6.退出"); System.out.println("請輸入您要進行的操作:"); int option = input.nextInt(); input.nextLine(); switch (option){ case 6:exit(); BankSystem.start(); break; case 1:showBalance(card); break; case 2:showDeposit(card); break; case 3:showTransfer(card); break; case 4:showWithdrawal(card); break; case 5:closeAccount(card); break; default: System.err.println("您輸入了不合法字元,建議您重新輸入!"); showOperation(card);//遞迴呼叫 } } //退出系統,密碼輸入錯誤3次,或者交易完成後,應該退出系統 public void exit(){ System.out.println("ATM系統關閉"); } public static void main(String[] args) { ATM_Machine a = new ATM_Machine(); } public BigDecimal queryBalance(BankCard card){ return card.getBalance(); } public void showBalance(BankCard card){ this.showTitle(); System.out.println("您的餘額為:"+queryBalance(card)); this.showOperation(card); } //deposit存款 public void deposit(BankCard card,int amount){ card.setBalance(card.getBalance().add(new BigDecimal(amount))); } public void showDeposit(BankCard card){ this.showTitle(); int amount = checkAmountInput("存款",20000);//一次最多存2萬 deposit(card,amount);//執行存款操作 System.out.println("存款成功,您當前卡內餘額為:"+card.getBalance()); showOperation(card); } //取款:withdrawal public void withdrawal(BankCard card,int amount){ card.setBalance(card.getBalance().subtract(new BigDecimal(amount))); } public void showWithdrawal(BankCard card){ this.showTitle(); int amount = checkAmountInput("取款",3000);//一次最多存2萬 withdrawal(card,amount);//執行存款操作 System.out.println("取款成功,您當前卡內餘額為:"+card.getBalance()); showOperation(card); } //銷戶:closing an account public void closeAccount(BankCard card ){ Scanner input = new Scanner(System.in); System.err.println("銷戶是一個危險操作,你的所有餘額將被清空,卡號將會回收,您確定要繼續嗎?"); System.out.println("1.是的,繼續\t2.取消該操作"); String s = input.nextLine(); if (s.equals("1")){ BankSystem.getAllBanCard().remove(card); card = null; System.out.println("您已經成功銷戶"); exit(); BankSystem.start(); }else if (s.equals("2")){ showOperation(card); }else{ System.err.println("您輸入了不合法字元!!!\n麻煩您重複確認您的操作:"); closeAccount(card);//遞迴呼叫 } } //轉賬:transfer public void transfer(BankCard myCard,BankCard anotherCard,int amount){ myCard.setBalance(myCard.getBalance().subtract(new BigDecimal(amount))); anotherCard.setBalance(anotherCard.getBalance().add(new BigDecimal(amount))); } public void showTransfer(BankCard myCard){ Scanner input = new Scanner(System.in); System.out.println("請輸入對方的銀行卡號:"); String cardNum = input.nextLine(); ArrayList<BankCard> allBankCard = new ArrayList<>(BankSystem.getAllBanCard()); BankCard anotherCard = null; boolean isExist = false; for (int i = 0;i<allBankCard.size();i++){ if(allBankCard.get(i).getCARDNUM().equals(cardNum)){ anotherCard = allBankCard.get(i);//卡號存在,例項化該銀行卡 isExist = true; break; } } if (isExist == false){ System.err.println("您輸入的銀行卡號不存在,請重新輸入"); showTransfer(myCard);//遞迴呼叫 } int amount = checkAmountInput("轉賬",5000);//轉賬每次只能轉5000 if (myCard.getBalance().compareTo(new BigDecimal(amount)) == -1){ System.err.println("對不起,您的餘額不足"); System.out.println(); showOperation(myCard); } transfer(myCard,anotherCard,amount); System.out.println("轉賬成功!請繼續您的操作"); showOperation(myCard); } //==================================== private int checkAmountInput(String operation,int maxAmount){ Scanner input = new Scanner(System.in); int amount; System.out.println("請輸入您要"+operation+"的金額(一次不得超過"+maxAmount+"):"); while (true) { try { amount = input.nextInt(); input.nextLine(); if (amount % 100 != 0) { System.err.println(operation+"數目必須是100的整數倍,請重新輸入:"); continue; } if (amount > maxAmount) { System.err.println(operation+"數目一次不得超過"+maxAmount+",請重新輸入:"); continue; } break; } catch (InputMismatchException e) { input.nextLine();//當用戶輸入的型別不匹配,清空輸入棧 System.err.println(operation+"數額必須是整數,請重新輸入:"); } } return amount; } //=================================================== }
銀行卡BankCard類:
public class BankCard { /*對於static關鍵字的理解:如果某一個屬性,設定了static修飾符,就意味著,不管建立多少個物件,該屬性卻只有一份,被所有物件所共享 一旦某一個物件修改了這個屬性,其他物件的這個屬性都會改變,因為這個屬性是公共的。 所以: 千萬要注意:static修飾符不可以濫用!! */ private BigDecimal balance = new BigDecimal("0");//餘額 private String CARDNUM;//卡號,一般是19位的,純數字的 private Customer holder;//持有者 private int password;//密碼 public static boolean checkIsExistThisBankCardNum(String bankCardNum){ boolean flag = false; ArrayList<BankCard> allBanCard = new ArrayList<>(BankSystem.getAllBanCard()); for (int i = 0;i<allBanCard.size();i++){ while (allBanCard.get(i).getCARDNUM().equals(bankCardNum)){ flag = true;//存在這個銀行卡號了,需要重新生成,雖然概率很低。 } } return flag; } public BankCard(String IDNum,String phoneNum,int password){ //需要一個身份證號,和一個手機號碼 this.holder = IdentityManageSystem.getIdentifyMsg().get(IDNum); String cardNum = new GenerateRandomString().generateIntString(19);//19位隨機數字 while (checkIsExistThisBankCardNum(cardNum)){ //存在這個銀行卡號了,需要重新生成,雖然概率很低。 cardNum = new GenerateRandomString().generateIntString(19);//19位隨機數字 } this.CARDNUM = cardNum; this.password = password; //設定開戶隨機金額(模擬一下) Double money = new Random().nextDouble()*100+1; DecimalFormat df = new DecimalFormat("#.00"); String bd = df.format(money); this.balance = new BigDecimal(bd); } public boolean equals(Object obj){ if (this==obj){ return true; } if (obj instanceof BankCard){ BankCard newCard = (BankCard)obj; if (newCard.getCARDNUM().equals(this.CARDNUM)) //只要卡號相同,就認為是同一張銀行卡 return true; } return false; } public int hashCode(){ return this.CARDNUM.hashCode(); } public BigDecimal getBalance() { return balance; } public String getCARDNUM() { return CARDNUM; } public Customer getHolder() { return holder; } public void setBalance(BigDecimal balance) { this.balance = balance; } public void setPassword(int password) { this.password = password; } public int getPassword() { return password; } }
顧客Customer類:
public class Customer { private IdentityCard identityCard;//身份證 private String phoneNum;//手機號 private String name;//客戶的姓名 private int age;//年齡 { GenerateRandomString g = new GenerateRandomString(); phoneNum = "1"+ g.generateIntString(10);//第一個數是1,後面10位隨機的電話號碼 } public Customer(){ Scanner input = new Scanner(System.in); System.out.println("您好,請問您叫什麼名字?:"); String name = input.nextLine(); this.name = name; } public Customer(String IDNum){ //判斷身份證號對不對,不是在這裡判斷! } //註冊身份證 public IdentityCard registerIdentify(){ if (this.getName()!=null){ IdentityCard card = new IdentityCard(this); this.identityCard = card; IdentityManageSystem.getIdentifyMsg().put(card.getIDNum(),this);//註冊完身份證,把鍵值對身份證號-姓名放入身份管理系統 return this.identityCard; } System.err.println("您還沒有名字呢"); return null; } public BankCard applyBankCard(IdentityCard card,String phoneNum){ Scanner input = new Scanner(System.in); System.out.println("顧客"+this.getName()+"身份證號:"+this.getIdentityCard().getIDNum()+ "電話號碼:"+this.getPhoneNum()+"\n正在申請銀行卡···\n請設定您的銀行卡密碼(規則:密碼必須是6位純數字):"); int password; while (true) { try { password = input.nextInt(); break; } catch (InputMismatchException e) { input.nextLine();//把多餘的回車讀取走 System.err.println("您輸入的密碼不合法,請重新輸入:"); } } String pswStr = String.valueOf(password); while (pswStr.length()!=6) { System.err.println("您輸入的密碼長度不是6位,請重新輸入:"); password = input.nextInt(); pswStr = String.valueOf(password); } //需要一個身份證(而不是號碼),和一個手機號碼 BankCard bankCard = new BankCard(card.getIDNum(),phoneNum,password); // BankSystem.getAllBanCard().add(bankCard);//辦理完後自動新增到系統庫中 BankSystem.addBanCard(bankCard); System.out.println("銀行卡辦理完畢,您的卡號是:"+bankCard.getCARDNUM()+"\n請妥善保管您的銀行卡,牢記密碼!!!"); return bankCard; } public IdentityCard getIdentityCard() { if(this.identityCard==null){ System.err.println("您還沒有註冊身份證,趕快申領一個吧!"); } return identityCard; } public String getPhoneNum() { return phoneNum; } public String getName() { return name; } }
身份證類IdentityCard:
/** * 這個類用來描述身份證 */ public class IdentityCard { private String IDNum;//身份證號,一般是18位的,最後一位可以是字母 private Customer holder;//持有者 public IdentityCard(Customer holder) { //構建一個身份證,必須有持有者才行 //身份證號,我幫你隨機生成 GenerateRandomString g = new GenerateRandomString(); this.IDNum = g.generateIDNum(); this.holder = holder; } public String getIDNum() { return IDNum; } public Customer getHolder() { return holder; } }
身份管理系統類IdentityManageSystem :
public class IdentityManageSystem { private static Map<String,Customer> identityMsg = new HashMap<>(); public static Map<String,Customer> getIdentifyMsg(){ return identityMsg; } }
自設計的工具類GenerateRandomString:
public class GenerateRandomString { private char[] str = "qwertyuiopasdfghjklzxcvbnm147258369".toCharArray(); private String[] head = new String []{"140829","142732"};//兩種常見的身份證號頭部 public String generateIntString(int length){ StringBuilder intString = new StringBuilder(); for (int i = 0;i<length;i++){ intString.append(new Random().nextInt(10)); } return intString.toString(); } public String generateIDNum(){ String idHead = head[new Random().nextInt(2)];//身份證號頭部 String year = String.valueOf((int)(Math.random()*121)+1900);//1900--2020,1900到2021但不包括2021 String month = String.valueOf((int)(Math.random()*12)+1);//1到13但不包括13 month = this.complement(month); String day = String.valueOf((int)(Math.random()*30)+1);//1到31但不包括31 day = this.complement(day); String randomstr = generateIntString(3);//身份證的後4位的前3位隨機數字 String last = String.valueOf(str[new Random().nextInt(str.length)]);//身份證的最後一位,隨機字母或數字 StringBuilder builder = new StringBuilder(); builder.append(idHead).append(year).append(month).append(day).append(randomstr).append(last); return builder.toString(); } private String complement(String monthOrDay){ //補全月份或日期,如果字串長度小於2,就往前面加個0補全 if (monthOrDay.length()==1){ String result = "0".concat(monthOrDay); return result; } return monthOrDay; } }
測試類:
public class MyTest { public static void main(String[] args) { BankSystem.start(); } }
示例截圖
更多學習資料請關注專題《管理系統開發》。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。