javaOOP项目实战——银行ATM机
银行管理系统项目
1、ATM_Machine
package Bnk;import javax.naming.Name;
import javax.smartcardio.Card;
import java.io.BufferedReader;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Scanner;
import java.util.function.BinaryOperator;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.out.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);}//取款:withdrawalpublic 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);//一次最多取3千withdrawal(card,amount);//执行存款操作System.out.println("取款成功,您当前卡内余额为:"+card.getBalance());showOperation(card);}//销户public void closeAccount(BankCard card ){Scanner input = new Scanner(System.in);System.err.println("销户是一个危险操作,你的所有余额将被清空,卡号将会回收,您确定要继续吗?");System.out.println("1.是的,继续\t\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);}}//转账:transferpublic 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 = false;break;}}if (isExist == true){System.err.println("您输入的银行卡号不存在,请重新输入");showTransfer(myCard);}int amount = checkAmountInput("转账",5000);//转账每次只能转5000if (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;}
}
2、bank_card
package Bnk;import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Random;
public class BankCard {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 = 1;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;}
}
3、BankSystem
package Bnk;import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;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.err.println("您慢走,感谢你的到来,欢迎下次再来办理业务");}else {System.err.println("您输入了不合法的字符");start();}}
}
4、Customer
package Bnk;import java.util.InputMismatchException;
import java.util.Scanner;public class Customer {private IdentityCard identityCard;//身份证private String phoneNum;//手机号private String name;//客户的姓名private int age;//年龄private double Balance;{GenerateRandomString g = new GenerateRandomString();phoneNum = "1"+ g.generateIntString(10);//第一个数是1,后面10位随机的电话号码}public double getBalance() {return Balance;}public void setBalance(double balance) {Balance = balance;}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.print("顾客"+this.getName()+"身份证号:"+this.getIdentityCard().getIDNum()+"电话号码:"+this.getPhoneNum()+"\n正在申请银行卡···\n请设置您的银行卡密码(规则:密码必须是6位纯数字):");int password;while (true) {try {password = input.nextInt();break;} catch (InputMismatchException e) { //InputMismatchExceptioninput.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;}
}
5、GenerateRandomString
package Bnk;import java.util.Random;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但不包括2021String month = String.valueOf((int)(Math.random()*12)+1);//1到13但不包括13month = this.complement(month);String day = String.valueOf((int)(Math.random()*30)+1);//1到31但不包括31day = 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;}
}
6、IdentityCard
package Bnk;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;}
}
7、IdentityMangeSystem
package Bnk;import java.util.HashMap;
import java.util.Map;public class IdentityManageSystem {private static Map<String,Customer> identityMsg = new HashMap<>();public static Map<String,Customer> getIdentifyMsg(){return identityMsg;}
}
8、Test
package Bnk;public class Test {public static void main(String[] args) {BankSystem.start();}
}
javaOOP项目实战——银行ATM机相关推荐
- python项目实战——银行取款机系统(七)
项目实战目录 python项目实战--银行取款机系统(一) python项目实战--银行取款机系统(二) python项目实战--银行取款机系统(三) python项目实战--银行取款机系统(四) p ...
- python项目实战——银行取款机系统(六)
项目实战目录 python项目实战--银行取款机系统(一) python项目实战--银行取款机系统(二) python项目实战--银行取款机系统(三) python项目实战--银行取款机系统(四) p ...
- java程序模拟atm机_Java项目实现模拟ATM机
本文实例为大家分享了Java实现模拟ATM机的具体代码,供大家参考,具体内容如下 项目名称 模拟ATM机 项目描述 简单实现ATM机功能 代码实现 测试类 public class Test { // ...
- java web atm机_Java项目实现模拟ATM机
本文实例为大家分享了Java实现模拟ATM机的具体代码,供大家参考,具体内容如下 项目名称 模拟ATM机 项目描述 简单实现ATM机功能 代码实现 测试类 public class Test { // ...
- python实现模仿银行ATM机
python实现模仿银行ATM机 学习了一个星期,分享一下自己的学习成果.本星期实现的是银行ATM机的功能. 实现效果如下: 开始界面,输入用户名密码之后到达主界面. 选择账户信息效果: 打印了个人的 ...
- python项目实战——银行取款机系统(一)
项目实战目录 python项目实战--银行取款机系统(一) 前言 今天我们将通过python完成简易银行提款机系统的实战,我们一步步实现我们的要求.话不多说,看操作. 环境使用 python 3.9 ...
- 面向对象程序设计——银行ATM机系统
文章目录 针对于面向对象设计--做一个简单的银行ATM机系统 ATM机需求分析 用户类 ATM机类 银行类 注册操作的大概流程 登录操作的大概流程 用户类代码 ATM机类代码 bank类代码(主类) ...
- 用Java程序模拟银行ATM机,实现包括存款、取款、查询、转账功能的简单应用
(1)想象现实世界中的相关操作沙及哪些实体呢?一个是储户,一个是ATM机.因 此根据面向对象中的抽象原则,可将其抽象为两个类:代表储户的账户信息类,代表银行 ATM机的ATM类.外加一个主类(负责实例 ...
- java模拟atm_Java项目实现模拟ATM机
本文实例为大家分享了Java实现模拟ATM机的具体代码,供大家参考,具体内容如下 项目名称 模拟ATM机 项目描述 简单实现ATM机功能 代码实现 测试类 public class Test { // ...
最新文章
- 和java通信_[源码和文档分享]基于JAVA的即时通信软件
- 生活的花环:看雷加对文学的回顾
- python 装饰器 继承_Python设计模式之装饰器模式
- 自然语言处理 —— 困惑度
- JavaScript 删除Cookie
- 浪潮云海OS C位出道,融合开放基础设施呼之欲出
- CefSharp 知道这些就完事了
- 最小二乘法曲线拟合原理
- 关于恢复synaptics触摸板手势
- 华为ensp——企业网络的设计与实现【方案测试验证】
- 联想凌拓“开业大吉” 是试水还是全面变革的前兆?
- .c文件如何一步步变成.exe文件
- 专升本管理学知识点总结——目标管理
- 1267 'Illegal mix of collations (latin1_swedish_ci,IMPLICIT) and (utf8_gener
- 谷歌浏览器adobe flash过期解决办法
- 技术分享 | MySQL 巡检
- 什么是2.5D 点云?
- Android Weekly - 42 : 打铁还需自身硬
- C语言88案例,经典案例带你绝对入门C编程!
- poi操作excel,复制sheet,复制行,复制单元格
热门文章
- AI一分钟|腾讯与三星结盟,以对抗苹果和谷歌;亚马逊回应“AI误将国会议员标记为罪犯”...
- 面试官问:服务的心跳机制与断线重连,Netty底层是怎么实现的?懵了
- SpringBoot项目,如何优雅的把接口参数中的空白值替换为null值?
- 新技能 MyBatis 千万数据表,快速分页!
- 高可用的Spring FTP上传下载工具类(已解决上传过程常见问题)
- 源码解析Spring Cloud Zuul
- 论机器学习领域的内卷
- 3D建模复原汤加火山爆发!1000颗原子弹当量,人在英国刚被「震」到
- 程序员加班崩溃,过路外卖小哥主动帮忙改代码,网友直呼太暖了!
- AI 博士生获201万最高档年薪,华科学子连续三年入选华为“天才少年”!