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類,來描述賬戶對象需要封裝哪些數(shù)據(jù)。
public class Account {
private String cardId; //卡號
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é)對每一個(gè)賬戶對象進(jìn)行管理,并編寫歡迎界面
public class ATM {
//創(chuàng)建一個(gè)存儲賬戶對象的集合;后面每開一個(gè)賬戶,就往集合中添加一個(gè)賬戶對象
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("請選擇:");
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è)賬戶對象,用于封裝用戶的開戶信息
- 需要用戶輸入自己的開戶信息,賦值給賬戶對象
- 輸入賬戶名,設(shè)置給賬戶對象
- 輸入性別,如果性別是’男’或者’女’,將性別設(shè)置給賬戶對象;否則重新錄入性別知道錄入正確為止。
- 輸入賬戶、并且輸入兩次密碼,只有兩次密碼相同,才將賬戶和密碼設(shè)置給賬戶對象。
- 輸入提現(xiàn)限額,并且設(shè)置給賬戶對象
- 輸出開戶成功,的提示語句。
private void createAccount(){
System.out.println("==系統(tǒng)開戶操作==");
// 1、創(chuàng)建一個(gè)賬戶對象,用于封裝用戶的開戶信息
Account acc = new Account();
// 2、需要用戶輸入自己的開戶信息,賦值給賬戶對象
System.out.println("請您輸入您的賬戶名稱:");
String name = sc.next();
acc.setUserName(name);
while (true) {
System.out.println("請您輸入您的性別:");
char sex = sc.next().charAt(0);
if(sex == '男' || sex == '女'){
acc.setSex(sex);
break;
}else {
System.out.println("您輸入的性別有誤~只能是男或者女~");
}
}
while (true) {
System.out.println("請您輸入您的賬戶密碼:");
String passWord = sc.next();
System.out.println("請您輸入您的確認(rèn)密碼:");
String okPassWord = sc.next();
// 判斷2次密碼是否一樣。
if(okPassWord.equals(passWord)){
acc.setPassWord(okPassWord);
break;
}else {
System.out.println("您輸入的2次密碼不一致,請您確認(rèn)~~");
}
}
System.out.println("請您輸入您的取現(xiàn)額度:");
double limit = sc.nextDouble();
acc.setLimit(limit);
// 3、把這個(gè)賬戶對象,存入到賬戶集合中去
accounts.add(acc);
System.out.println("恭喜您," + acc.getUserName() + "開戶成功,您的卡號是:" + acc.getCardId());
}4. 生成卡號
- 遍歷存儲Account對象的集合,得到每一個(gè)Account對象,獲取對象的卡號
- 如果卡號存在,返回該卡號對應(yīng)的Account對象
- 如果卡號不存在,返回null
private Account getAccountByCardId(String cardId){
// 遍歷全部的賬戶對象
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判斷這個(gè)賬戶對象acc中的卡號是否是我們要找的卡號
if(acc.getCardId().equals(cardId)){
return acc;
}
}
return null; // 查無此賬戶,這個(gè)卡號不存在的
}- 生成卡號,先隨機(jī)產(chǎn)生8個(gè)[0,9]范圍內(nèi)的隨機(jī)數(shù),拼接成一個(gè)字符串
- 然后再調(diào)用getAccountByCardId方法,判斷這個(gè)卡號字符串是否存在
- 判斷生成的卡號是否存在
- 如果生成的卡號不存在,說明生成的卡號是有效的,把卡號返回,
- 如果生成的卡號存在,說明生成的卡號無效,循環(huán)繼續(xù)生產(chǎn)卡號。
private String createCardId(){
while (true) {
// 1、定義一個(gè)String類型的變量記住8位數(shù)字作為一個(gè)卡號
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中記住的卡號,是否與其他賬戶的卡號重復(fù)了,沒有重復(fù),才可以做為一個(gè)新卡號返回。
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 說明cardId沒有找到賬戶對象,因此cardId沒有與其他賬戶的卡號重復(fù),可以返回它做為一個(gè)新卡號
return cardId;
}
}
}5. 登錄功能
- 判斷系統(tǒng)中是否存在賬戶對象,存在才能登錄,如果不存在,我們直接結(jié)束登錄操作
- 輸入登錄的卡號,并判斷卡號是否存在
- 如果卡號不存在,直接給出提示
- 如果卡號存在,接著輸入用戶密碼,并判斷密碼是否正確
- 如果密碼也正確,則登錄成功,并且記錄當(dāng)前的登錄賬戶
private void login(){
System.out.println("==系統(tǒng)登錄==");
// 1、判斷系統(tǒng)中是否存在賬戶對象,存在才能登錄,如果不存在,我們直接結(jié)束登錄操作
if(accounts.size() == 0){
System.out.println("當(dāng)前系統(tǒng)中無任何賬戶,請先開戶再來登錄~~");
return;
}
// 2、系統(tǒng)中存在賬戶對象,可以開始進(jìn)行登錄操作了
while (true) {
System.out.println("請您輸入您的登錄卡號:");
String cardId = sc.next();
// 3、判斷這個(gè)卡號是否存在?。?
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您輸入的登錄卡號不存在,請確認(rèn)~~");
}else {
while (true) {
System.out.println("請您輸入登錄密碼:");
String passWord = sc.next();
// 4、判斷密碼是否正確
if(acc.getPassWord().equals(passWord)){
loginAcc = acc;
System.out.println("恭喜您," + acc.getUserName() + "成功登錄了系統(tǒng),您的卡號是:" + acc.getCardId());
return;
}else {
System.out.println("您輸入的密碼不正確,請確認(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("請選擇:");
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)前選擇的操作是不存在的,請確認(rèn)~~");
}
}
}7. 查詢賬戶
private void showLoginAccount(){
System.out.println("==當(dāng)前您的賬戶信息如下:==");
System.out.println("卡號:" + 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)前賬戶對象
private void depositMoney() {
System.out.println("==存錢操作==");
System.out.println("請您輸入存款金額:");
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è)置給賬戶對象。
如果余額不足,提示“你的余額不足,你的賬戶余額是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("請您輸入取款金額:");
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)賬了,輸入對方卡號
- 判斷對方卡號是否正確???
- 如果卡號正確,就繼續(xù)讓用戶輸入姓氏, 并判斷這個(gè)姓氏是否正確?
- 如果姓氏正確,繼續(xù)判斷這個(gè)轉(zhuǎn)賬金額是否超過自己的余額。
- 果對方卡號存在、姓氏匹配、余額足夠,就完成真正的轉(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("請您輸入對方的卡號:");
String cardId = sc.next();
// 4、判斷這個(gè)卡號是否正確啊??
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您輸入的對方的卡號不存在~~");
}else {
// 對方的賬戶存在,繼續(xù)讓用戶認(rèn)證姓氏。
String name = "*" + acc.getUserName().substring(1); // * + 馬劉德華
System.out.println("請您輸入【" + name + "】的姓氏:");
String preName = sc.next();
// 5、判斷這個(gè)姓氏是否正確啊
if(acc.getUserName().startsWith(preName)) {
while (true) {
// 認(rèn)證通過了:真正轉(zhuǎn)賬了
System.out.println("請您輸入轉(zhuǎn)賬給對方的金額:");
double money = sc.nextDouble();
// 6、判斷這個(gè)金額是否沒有超過自己的余額。
if(loginAcc.getMoney() >= money){
// 7、轉(zhuǎn)給對方了
// 更新自己的賬戶余額
loginAcc.setMoney(loginAcc.getMoney() - money);
// 更新對方的賬戶余額
acc.setMoney(acc.getMoney() + money);
System.out.println("您轉(zhuǎn)賬成功了~~~");
return; // 跳出轉(zhuǎn)賬方法。。
}else {
System.out.println("您余額不足,無法給對方轉(zhuǎn)這么多錢,最多可轉(zhuǎn):" + loginAcc.getMoney());
}
}
}else {
System.out.println("對不起,您認(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("請您輸入當(dāng)前賬戶的密碼:");
String passWord = sc.next();
// 2、認(rèn)證當(dāng)前密碼是否正確啊
if(loginAcc.getPassWord().equals(passWord)){
while (true) {
// 3、真正開始修改密碼了
System.out.println("請您輸入新密碼:");
String newPassWord = sc.next();
System.out.println("請您再次輸入密碼:");
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("請問您確認(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("對不起,您的賬戶中存錢金額,不允許銷戶~~");
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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中使用synchronized關(guān)鍵字實(shí)現(xiàn)簡單同步操作示例
這篇文章主要介紹了Java中使用synchronized關(guān)鍵字實(shí)現(xiàn)簡單同步操作示例,本文起講解了synchronized修飾函數(shù)、synchronized修飾代碼塊、synchronized修飾靜態(tài)方法等內(nèi)容,需要的朋友可以參考下2015-04-04
Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0)
在spring 3.2 及以后版本中增加了對請求的異步處理,這篇文章主要介紹了Spring Boot實(shí)現(xiàn)異步請求(Servlet 3.0),感興趣的小伙伴們可以參考一下。2017-04-04
SpringBoot?隱式參數(shù)注入詳解告別重復(fù)代碼,讓?Controller?更優(yōu)雅
本文介紹了使用SpringBoot的HandlerMethodArgumentResolver實(shí)現(xiàn)隱式參數(shù)注入的技巧,通過自定義注解和解析器,可以簡化Controller中的重復(fù)參數(shù)處理邏輯,提升代碼的可維護(hù)性和可讀性,感興趣的朋友跟隨小編一起看看吧2026-03-03
Java服務(wù)中的大文件上傳和下載優(yōu)化技巧分享
在Java服務(wù)中處理大文件的上傳和下載是一項(xiàng)常見但復(fù)雜的任務(wù),為了提供優(yōu)秀的用戶體驗(yàn)和高效的系統(tǒng)性能,我們將探索多種策略和技術(shù),并在每一點(diǎn)上都提供代碼示例以便實(shí)戰(zhàn)應(yīng)用,需要的朋友可以參考下2023-10-10
阿里資深技術(shù)專家:在各階段中3年經(jīng)驗(yàn)的java程序員應(yīng)該具備哪些技術(shù)能力
這篇文章主要介紹了阿里資深技術(shù)專家:在各階段中3年經(jīng)驗(yàn)的java程序員應(yīng)該具備哪些技術(shù)能力,本文給大家列舉了一些內(nèi)容,大家可以根據(jù)自己需要有方法的掌握,感興趣的朋友跟隨小編一起看看吧2020-07-07
java獲取request中的參數(shù)以及java解析URL問號后的參數(shù)
這篇文章主要介紹了java獲取request中的參數(shù)以及java解析URL問號后的參數(shù)問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12

