Java自動(dòng)取款機(jī)ATM案例實(shí)現(xiàn)
用戶輸入密碼,如果密碼校驗(yàn)通過,就會(huì)進(jìn)入ATM機(jī)的主操作界面:有查詢、取款、存款、轉(zhuǎn)賬等業(yè)務(wù)功能。
1. 封裝數(shù)據(jù)
首先可以設(shè)計(jì)一個(gè)Account類,來描述賬戶對(duì)象需要封裝哪些數(shù)據(jù)。
public class Account { private String cardId; //卡號(hào) private String userName; //用戶名 private char sex; //性別 private String passWord;//密碼 private double money; //余額 private double limit; // 限額 public String getCardId() { return cardId; } public void setCardId(String cardId) { this.cardId = cardId; } public String getUserName() { return userName + ( sex == '男' ? "先生" : "女士"); } public void setUserName(String userName) { this.userName = userName; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } public double getLimit() { return limit; } public void setLimit(double limit) { this.limit = limit; } }
2. 歡迎界面
編寫一個(gè)ATM類,負(fù)責(zé)對(duì)每一個(gè)賬戶對(duì)象進(jìn)行管理,并編寫歡迎界面
public class ATM { //創(chuàng)建一個(gè)存儲(chǔ)賬戶對(duì)象的集合;后面每開一個(gè)賬戶,就往集合中添加一個(gè)賬戶對(duì)象 private ArrayList<Account> accounts = new ArrayList<>(); private Scanner sc = new Scanner(System.in); /**展示歡迎界面 */ public void start(){ while (true) { System.out.println("===歡迎您進(jìn)入到了ATM系統(tǒng)==="); System.out.println("1、用戶登錄"); System.out.println("2、用戶開戶"); System.out.println("請(qǐng)選擇:"); int command = sc.nextInt(); switch (command){ case 1: // 用戶登錄 System.out.println("進(jìn)入登錄功能"); break; case 2: // 用戶開戶 System.out.println("進(jìn)入開戶功能"); break; default: System.out.println("沒有該操作~~"); } } } }
3. 實(shí)現(xiàn)開戶功能
- 創(chuàng)建一個(gè)賬戶對(duì)象,用于封裝用戶的開戶信息
- 需要用戶輸入自己的開戶信息,賦值給賬戶對(duì)象
- 輸入賬戶名,設(shè)置給賬戶對(duì)象
- 輸入性別,如果性別是’男’或者’女’,將性別設(shè)置給賬戶對(duì)象;否則重新錄入性別知道錄入正確為止。
- 輸入賬戶、并且輸入兩次密碼,只有兩次密碼相同,才將賬戶和密碼設(shè)置給賬戶對(duì)象。
- 輸入提現(xiàn)限額,并且設(shè)置給賬戶對(duì)象
- 輸出開戶成功,的提示語句。
private void createAccount(){ System.out.println("==系統(tǒng)開戶操作=="); // 1、創(chuàng)建一個(gè)賬戶對(duì)象,用于封裝用戶的開戶信息 Account acc = new Account(); // 2、需要用戶輸入自己的開戶信息,賦值給賬戶對(duì)象 System.out.println("請(qǐng)您輸入您的賬戶名稱:"); String name = sc.next(); acc.setUserName(name); while (true) { System.out.println("請(qǐng)您輸入您的性別:"); char sex = sc.next().charAt(0); if(sex == '男' || sex == '女'){ acc.setSex(sex); break; }else { System.out.println("您輸入的性別有誤~只能是男或者女~"); } } while (true) { System.out.println("請(qǐng)您輸入您的賬戶密碼:"); String passWord = sc.next(); System.out.println("請(qǐng)您輸入您的確認(rèn)密碼:"); String okPassWord = sc.next(); // 判斷2次密碼是否一樣。 if(okPassWord.equals(passWord)){ acc.setPassWord(okPassWord); break; }else { System.out.println("您輸入的2次密碼不一致,請(qǐng)您確認(rèn)~~"); } } System.out.println("請(qǐng)您輸入您的取現(xiàn)額度:"); double limit = sc.nextDouble(); acc.setLimit(limit); // 3、把這個(gè)賬戶對(duì)象,存入到賬戶集合中去 accounts.add(acc); System.out.println("恭喜您," + acc.getUserName() + "開戶成功,您的卡號(hào)是:" + acc.getCardId()); }
4. 生成卡號(hào)
- 遍歷存儲(chǔ)Account對(duì)象的集合,得到每一個(gè)Account對(duì)象,獲取對(duì)象的卡號(hào)
- 如果卡號(hào)存在,返回該卡號(hào)對(duì)應(yīng)的Account對(duì)象
- 如果卡號(hào)不存在,返回null
private Account getAccountByCardId(String cardId){ // 遍歷全部的賬戶對(duì)象 for (int i = 0; i < accounts.size(); i++) { Account acc = accounts.get(i); // 判斷這個(gè)賬戶對(duì)象acc中的卡號(hào)是否是我們要找的卡號(hào) if(acc.getCardId().equals(cardId)){ return acc; } } return null; // 查無此賬戶,這個(gè)卡號(hào)不存在的 }
- 生成卡號(hào),先隨機(jī)產(chǎn)生8個(gè)[0,9]范圍內(nèi)的隨機(jī)數(shù),拼接成一個(gè)字符串
- 然后再調(diào)用getAccountByCardId方法,判斷這個(gè)卡號(hào)字符串是否存在
- 判斷生成的卡號(hào)是否存在
- 如果生成的卡號(hào)不存在,說明生成的卡號(hào)是有效的,把卡號(hào)返回,
- 如果生成的卡號(hào)存在,說明生成的卡號(hào)無效,循環(huán)繼續(xù)生產(chǎn)卡號(hào)。
private String createCardId(){ while (true) { // 1、定義一個(gè)String類型的變量記住8位數(shù)字作為一個(gè)卡號(hào) String cardId = ""; // 2、使用循環(huán),循環(huán)8次,每次產(chǎn)生一個(gè)隨機(jī)數(shù)給cardId連接起來 Random r = new Random(); for (int i = 0; i < 8; i++) { int data = r.nextInt(10); // 0 - 9 cardId += data; } // 3、判斷cardId中記住的卡號(hào),是否與其他賬戶的卡號(hào)重復(fù)了,沒有重復(fù),才可以做為一個(gè)新卡號(hào)返回。 Account acc = getAccountByCardId(cardId); if(acc == null){ // 說明cardId沒有找到賬戶對(duì)象,因此cardId沒有與其他賬戶的卡號(hào)重復(fù),可以返回它做為一個(gè)新卡號(hào) return cardId; } } }
5. 登錄功能
- 判斷系統(tǒng)中是否存在賬戶對(duì)象,存在才能登錄,如果不存在,我們直接結(jié)束登錄操作
- 輸入登錄的卡號(hào),并判斷卡號(hào)是否存在
- 如果卡號(hào)不存在,直接給出提示
- 如果卡號(hào)存在,接著輸入用戶密碼,并判斷密碼是否正確
- 如果密碼也正確,則登錄成功,并且記錄當(dāng)前的登錄賬戶
private void login(){ System.out.println("==系統(tǒng)登錄=="); // 1、判斷系統(tǒng)中是否存在賬戶對(duì)象,存在才能登錄,如果不存在,我們直接結(jié)束登錄操作 if(accounts.size() == 0){ System.out.println("當(dāng)前系統(tǒng)中無任何賬戶,請(qǐng)先開戶再來登錄~~"); return; } // 2、系統(tǒng)中存在賬戶對(duì)象,可以開始進(jìn)行登錄操作了 while (true) { System.out.println("請(qǐng)您輸入您的登錄卡號(hào):"); String cardId = sc.next(); // 3、判斷這個(gè)卡號(hào)是否存在??? Account acc = getAccountByCardId(cardId); if(acc == null){ System.out.println("您輸入的登錄卡號(hào)不存在,請(qǐng)確認(rèn)~~"); }else { while (true) { System.out.println("請(qǐng)您輸入登錄密碼:"); String passWord = sc.next(); // 4、判斷密碼是否正確 if(acc.getPassWord().equals(passWord)){ loginAcc = acc; System.out.println("恭喜您," + acc.getUserName() + "成功登錄了系統(tǒng),您的卡號(hào)是:" + acc.getCardId()); return; }else { System.out.println("您輸入的密碼不正確,請(qǐng)確認(rèn)~~"); } } } } }
6. 展示用戶操作界面
private void showUserCommand(){ while (true) { System.out.println(loginAcc.getUserName() + "您可以選擇如下功能進(jìn)行賬戶的處理===="); System.out.println("1、查詢賬戶"); System.out.println("2、存款"); System.out.println("3、取款"); System.out.println("4、轉(zhuǎn)賬"); System.out.println("5、密碼修改"); System.out.println("6、退出"); System.out.println("7、注銷當(dāng)前賬戶"); System.out.println("請(qǐng)選擇:"); int command = sc.nextInt(); switch (command){ case 1: //TODO 查詢當(dāng)前賬戶 break; case 2: //TODO 存款 break; case 3: //TODO取款 break; case 4: //TOD 轉(zhuǎn)賬 break; case 5: //TODO 密碼修改 return;// 跳出并結(jié)束當(dāng)前方法 case 6: //TODO 退出 System.out.println(loginAcc.getUserName() + "您退出系統(tǒng)成功!"); return; // 跳出并結(jié)束當(dāng)前方法 case 7: // 注銷當(dāng)前登錄的賬戶 if(deleteAccount()){ // 銷戶成功了,回到歡迎界面 return; } break; default: System.out.println("您當(dāng)前選擇的操作是不存在的,請(qǐng)確認(rèn)~~"); } } }
7. 查詢賬戶
private void showLoginAccount(){ System.out.println("==當(dāng)前您的賬戶信息如下:=="); System.out.println("卡號(hào):" + loginAcc.getCardId()); System.out.println("戶主:" + loginAcc.getUserName()); System.out.println("性別:" + loginAcc.getSex()); System.out.println("余額:" + loginAcc.getMoney()); System.out.println("每次取現(xiàn)額度:" + loginAcc.getLimit()); }
8. 存款
- 鍵盤錄入要存入的金額
- 在原有余額的基礎(chǔ)上,加上存入金額,得到新的余額
- 再將新的余額設(shè)置給當(dāng)前賬戶對(duì)象
private void depositMoney() { System.out.println("==存錢操作=="); System.out.println("請(qǐng)您輸入存款金額:"); double money = sc.nextDouble(); // 更新當(dāng)前登錄的賬戶的余額。 loginAcc.setMoney(loginAcc.getMoney() + money); System.out.println("恭喜您,您存錢:" + money + "成功,存錢后余額是:" + loginAcc.getMoney()); }
9. 取款
判斷賬戶余額是否達(dá)到了100元,如果不夠100元,就不讓用戶取錢了
讓用戶輸入取款金額
判斷賬戶余額是否足夠
如果余額足夠, 繼續(xù)判斷當(dāng)前取款金額是否超過了每次限額
如果超過限額,提示“每次只能取xxx限額的錢”
如果不超過限額,則在當(dāng)前余額上減去取錢的金額,得到新的余額
并將新的余額設(shè)置給賬戶對(duì)象。
如果余額不足,提示“你的余額不足,你的賬戶余額是xxx元”
private void drawMoney() { System.out.println("==取錢操作=="); // 1、判斷賬戶余額是否達(dá)到了100元,如果不夠100元,就不讓用戶取錢了 if(loginAcc.getMoney() < 100){ System.out.println("您的賬戶余額不足100元,不允許取錢~~"); return; } // 2、讓用戶輸入取款金額 while (true) { System.out.println("請(qǐng)您輸入取款金額:"); double money = sc.nextDouble(); // 3、判斷賬戶余額是否足夠 if(loginAcc.getMoney() >= money){ // 賬戶中的余額是足夠的 // 4、判斷當(dāng)前取款金額是否超過了每次限額 if(money > loginAcc.getLimit()){ System.out.println("您當(dāng)前取款金額超過了每次限額,您每次最多可?。? + loginAcc.getLimit()); }else { // 代表可以開始取錢了。更新當(dāng)前賬戶的余額即可 loginAcc.setMoney(loginAcc.getMoney() - money); System.out.println("您取款:" + money + "成功,取款后您剩余:" + loginAcc.getMoney()); break; } }else { System.out.println("余額不足,您的賬戶中的余額是:" + loginAcc.getMoney()); } } }
10. 轉(zhuǎn)賬
- 判斷系統(tǒng)中是否存在其他賬戶
- 判斷自己的賬戶中是否有錢
- 真正開始轉(zhuǎn)賬了,輸入對(duì)方卡號(hào)
- 判斷對(duì)方卡號(hào)是否正確???
- 如果卡號(hào)正確,就繼續(xù)讓用戶輸入姓氏, 并判斷這個(gè)姓氏是否正確?
- 如果姓氏正確,繼續(xù)判斷這個(gè)轉(zhuǎn)賬金額是否超過自己的余額。
- 果對(duì)方卡號(hào)存在、姓氏匹配、余額足夠,就完成真正的轉(zhuǎn)賬操作
private void transferMoney() { System.out.println("==用戶轉(zhuǎn)賬=="); // 1、判斷系統(tǒng)中是否存在其他賬戶。 if(accounts.size() < 2){ System.out.println("當(dāng)前系統(tǒng)中只有你一個(gè)賬戶,無法為其他賬戶轉(zhuǎn)賬~~"); return; } // 2、判斷自己的賬戶中是否有錢 if(loginAcc.getMoney() == 0){ System.out.println("您自己都沒錢,就別轉(zhuǎn)了~~"); return; } while (true) { // 3、真正開始轉(zhuǎn)賬了 System.out.println("請(qǐng)您輸入對(duì)方的卡號(hào):"); String cardId = sc.next(); // 4、判斷這個(gè)卡號(hào)是否正確?。?? Account acc = getAccountByCardId(cardId); if(acc == null){ System.out.println("您輸入的對(duì)方的卡號(hào)不存在~~"); }else { // 對(duì)方的賬戶存在,繼續(xù)讓用戶認(rèn)證姓氏。 String name = "*" + acc.getUserName().substring(1); // * + 馬劉德華 System.out.println("請(qǐng)您輸入【" + name + "】的姓氏:"); String preName = sc.next(); // 5、判斷這個(gè)姓氏是否正確啊 if(acc.getUserName().startsWith(preName)) { while (true) { // 認(rèn)證通過了:真正轉(zhuǎn)賬了 System.out.println("請(qǐng)您輸入轉(zhuǎn)賬給對(duì)方的金額:"); double money = sc.nextDouble(); // 6、判斷這個(gè)金額是否沒有超過自己的余額。 if(loginAcc.getMoney() >= money){ // 7、轉(zhuǎn)給對(duì)方了 // 更新自己的賬戶余額 loginAcc.setMoney(loginAcc.getMoney() - money); // 更新對(duì)方的賬戶余額 acc.setMoney(acc.getMoney() + money); System.out.println("您轉(zhuǎn)賬成功了~~~"); return; // 跳出轉(zhuǎn)賬方法。。 }else { System.out.println("您余額不足,無法給對(duì)方轉(zhuǎn)這么多錢,最多可轉(zhuǎn):" + loginAcc.getMoney()); } } }else { System.out.println("對(duì)不起,您認(rèn)證的姓氏有問題~~"); } } } }
11. 修改密碼
- 提醒用戶輸入當(dāng)前密碼
- 認(rèn)證當(dāng)前密碼是否正確
- 如果認(rèn)證密碼正確,開始修改密碼,修改密碼時(shí)需要用戶輸入2次新密碼
- 判斷2次 密碼是否一致
private void updatePassWord() { System.out.println("==賬戶密碼修改操作=="); while (true) { // 1、提醒用戶認(rèn)證當(dāng)前密碼 System.out.println("請(qǐng)您輸入當(dāng)前賬戶的密碼:"); String passWord = sc.next(); // 2、認(rèn)證當(dāng)前密碼是否正確啊 if(loginAcc.getPassWord().equals(passWord)){ while (true) { // 3、真正開始修改密碼了 System.out.println("請(qǐng)您輸入新密碼:"); String newPassWord = sc.next(); System.out.println("請(qǐng)您再次輸入密碼:"); String okPassWord = sc.next(); // 4、判斷2次 密碼是否一致 if(okPassWord.equals(newPassWord)){ // 可以真正開始修改密碼了 loginAcc.setPassWord(okPassWord); System.out.println("恭喜您,您的密碼修改成功~~~"); return; }else { System.out.println("您輸入的2次密碼不一致~~"); } } }else { System.out.println("您當(dāng)前輸入的密碼不正確~~"); } } }
12. 注銷
- 先確認(rèn)是否需要注銷賬戶,讓用戶輸入y或者n
- 輸入y后,繼續(xù)判斷當(dāng)前用戶的賬戶是否有錢
private boolean deleteAccount() { System.out.println("==進(jìn)行銷戶操作=="); // 1、問問用戶是否確定要銷戶 System.out.println("請(qǐng)問您確認(rèn)銷戶嗎?y/n"); String command = sc.next(); switch (command) { case "y": // 確實(shí)要銷戶 // 2、判斷用戶的賬戶中是否有錢:loginAcc if(loginAcc.getMoney() == 0) { // 銷戶 accounts.remove(loginAcc); System.out.println("您好,您的賬戶已經(jīng)成功銷戶~~"); return true; }else { System.out.println("對(duì)不起,您的賬戶中存錢金額,不允許銷戶~~"); return false; } default: System.out.println("好的,您的賬戶保留??!"); return false; } }
到此這篇關(guān)于Java自動(dòng)取款機(jī)ATM案例實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Java自動(dòng)取款機(jī)ATM內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java解決同時(shí)出庫(kù)入庫(kù)訂單號(hào)自動(dòng)獲取問題解決
在Java中,處理多線程環(huán)境下的訂單號(hào)生成問題可以采用多種策略,如使用AtomicLong保證線程安全,通過定義訂單號(hào)生成器并利用線程模擬出庫(kù)和入庫(kù)操作,每個(gè)線程從訂單號(hào)生成器中獲取唯一訂單號(hào),感興趣的朋友一起看看吧2024-09-09Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法
很多時(shí)候在javaweb項(xiàng)目中我們需要用到Socket通信來實(shí)現(xiàn)功能,在web中使用Socket我們需要建立一個(gè)監(jiān)聽程序,在程序啟動(dòng)時(shí),啟動(dòng)socket監(jiān)聽。接下來通過本文給大家介紹Java Web項(xiàng)目中使用Socket通信多線程、長(zhǎng)連接的方法,感興趣的朋友一起學(xué)習(xí)2016-04-04簡(jiǎn)單學(xué)習(xí)Java抽象類要點(diǎn)及實(shí)例
這篇文章主要介紹了Java抽象類要點(diǎn)及實(shí)例,有需要的朋友可以參考一下2014-01-01MyBatis-Plus 查詢指定字段的實(shí)現(xiàn)
這篇文章主要介紹了MyBatis-Plus 查詢指定字段的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題
本篇文章主要介紹了spring boot使用RabbitMQ實(shí)現(xiàn)topic 主題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-03-03一段代碼搞懂關(guān)于Java中List、Set集合及Map的使用
這篇文章主要介紹了關(guān)于Java中List、Set集合及Map的使用及l(fā)ist,set和map三者的區(qū)別介紹,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-08-08關(guān)于stream().sorted()以及java中常用的比較器排序
這篇文章主要介紹了關(guān)于stream().sorted()以及java中常用的比較器排序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Java 集合實(shí)現(xiàn)分頁的方法(業(yè)務(wù)代碼實(shí)現(xiàn)分頁)
在Java開發(fā)中,有些場(chǎng)景比較復(fù)雜,受限制,不好在sql查詢層面實(shí)現(xiàn)分頁,需要在查詢的list結(jié)果后,將list分頁返回,如何實(shí)現(xiàn)呢,帶著這個(gè)問題一起通過本文學(xué)習(xí)吧2025-02-02