当前位置:网站首页>ATM系统
ATM系统
2022-08-02 05:07:00 【千寻~~】
技术点分析:
程序流程控制:需要结合分支、循环、跳转关键字等相关操作控制程序的业务逻辑。
面对对象编辑:每个用户账户都是一个对象:所以需要设计账户类Account用于创建账户对象封装 账户信息。
使用集合容器:系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合。
使用常见API:登录信息的内容比较,业务数据的分析,处理等都需要用到String等常用API来解 决。
实现功能目录:
系统准备、首页设计
用户开户功能实现
用户登录功能实现
用户操作页设计、查询账户、退出账户功能实现
用户存款功能实现
用户取款功能实现
用户转账功能实现
用户密码修改、销户功能实现
完整代码:
实体类:
public class Account {
private String cardId; //卡号
private String userName; //用户名
private String password; //密码
private double money; //账户余额
private double quoteMoney; //每次曲线额度
private String sex;
public Account(String cardId, String userName, String password, double money, double quoteMoney, String sex) {
this.cardId = cardId;
this.userName = userName;
this.password = password;
this.money = money;
this.quoteMoney = quoteMoney;
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Account() {
}
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
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 getQuoteMoney() {
return quoteMoney;
}
public void setQuoteMoney(double quoteMoney) {
this.quoteMoney = quoteMoney;
}
}
测试类:
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATMSystem {
public static void main(String[] args) {
// 1、定义账户类
// 2、定义一个集合容器,负责以后存储全部的账户对象,进行相关的业务操作
ArrayList<Account> accounts =new ArrayList<>();
// 3、展示系统的首页
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("==============ATM==============");
System.out.println("1、账户登录");
System.out.println("2、账户开户");
System.out.println("3、退出");
System.out.print("请你选择操作:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录操作
login(accounts , sc );
break;
case 2:
// 开户
register(accounts,sc);
break;
case 3:
return;
default:
System.out.println("对不起!您输入的操作命令不存在!!!");
}
}
}
private static void login(ArrayList<Account> accounts, Scanner sc) {
System.out.println("================系统登录操作==================");
// 1、判断账户集合中是否存在账户,如果不存在账户 则登录功能不能进行
if(accounts.size()==0){
System.out.println("对不起,当前系统中没有任何账户,请先开户,再来登录");
return; //卫语言风格,解决方法的执行
}
// 2、正式进入登录系统
while (true) {
System.out.print("请您输入登录卡号:");
String cardId = sc.next();
// 3、判断卡号是否存在,根据卡号去账户集合中查询账户对象。
Account acc =getAccountByCardId(cardId , accounts);
if(acc!=null){
// 卡号存在
// 4、让用户输入密码 认证密码
while (true) {
System.out.print("请你输入密码:");
String password = sc.next();
// 判断当前账户对象的密码是否与用户输入密码一致
if(acc.getPassword().equals(password)){
// 登录成功了
System.out.println("恭喜您," + acc.getUserName() + (acc.getSex().equals("男") ? "先生" : "女士")+
" 您已经成功进入系统了." +" 您的卡号是" +acc.getCardId());
// .....查询 转账 取款.....
// 展示操作页
showUserCommand(sc,acc,accounts);
return;
}else{
System.out.println("对不起,您输入的密码有误!!!");
}
}
}else {
System.out.println("对不起,系统中不存在该账户卡号");
}
}
}
private static void showUserCommand( Scanner sc ,Account acc,ArrayList<Account> accounts) {
while (true) {
System.out.println("==============用户操作页================");
System.out.println("1、查询账户");
System.out.println("2、存款");
System.out.println("3、取款");
System.out.println("4、转账");
System.out.println("5、修改密码");
System.out.println("6、退出");
System.out.println("7、注销账户");
System.out.print("请选择命令:");
int command =sc.nextInt();
switch (command){
case 1:
// 查询账户
showAccount(acc);
break;
case 2:
// 存款
depositMoney(acc, sc);
break;
case 3:
// 取款
drawMoney(acc,sc);
break;
case 4:
// 转账
transferMoney(sc,acc,accounts);
break;
case 5:
// 修改密码
updatePassword(sc,acc);
return;
case 6:
// 退出
System.out.println("退出成功,欢迎下次光亮");
return; // 让当前方法停止执行 跳出去
case 7:
// 注销账户
if(deleteAccount(acc,sc,accounts)){
// 销户成功了 回到首页
return;
}else {
// 没有销户成功 还在操作页玩
break;
}
default:
System.out.println("您输入的操作命令不正确");
}
}
}
private static boolean deleteAccount(Account acc, Scanner sc, ArrayList<Account> accounts) {
// 从当前账户集合中 删除当前账户对象
System.out.println("==============用户销户==================");
System.out.println("您真的要跑路? y/n");
String rs = sc.next();
switch (rs) {
case "y":
// 真要销户
if (acc.getMoney() > 0) {
System.out.println("您账户中还有钱没有取完,不允许销户!!");
} else {
accounts.remove(acc);
System.out.println("您的账户销户完成");
return true;
}
break;
default:
System.out.println("好的,当前账户继续保留!");
}
return false;
}
private static void updatePassword(Scanner sc, Account acc) {
System.out.println("==============用户密码修改==================");
while (true) {
System.out.print("输入当前密码:");
String password = sc.next();
// 1、 判断输入的密码是否正确
if(acc.getPassword().equals(password)){
// 密码正确
while (true) {
System.out.print("请您输入新密码:");
String newPassword = sc.next();
System.out.print("请你再次输入密码");
String okPassword = sc.next();
if ((newPassword.equals(okPassword))){
// 两次输入的密码一致 可以修改
acc.setPassword(okPassword);
System.out.println("恭喜您,密码修改成功了!!");
return;
}else {
System.out.println("两次输入的密码不一致,请重新输入!!");
}
}
}else {
System.out.println("您输入的密码不正确!!");
}
}
}
private static void transferMoney(Scanner sc, Account acc, ArrayList<Account> accounts) {
System.out.println("===================用户转账操作=====================");
// 1、判断是否最少有两个账户
if(accounts.size()<2){
System.out.println("当前系统中不足两个用户,不能进行转账。请去开户吧!!!");
return;
}
// 2、 判断自己的账户是否有钱
if(acc.getMoney() == 0){
System.out.println("对不起,你自己都没钱,就别转账了!!!");
return;
}
// 3、说明够两个账户 而且有钱 开始真正转账
while (true) {
System.out.print("输入对方的卡号:");
String cardId = sc.next();
// 这个卡号不能是自己的卡号
if(cardId.equals(acc.getCardId())){
System.out.println("对不起,您不能给自己进行转账!!");
continue; //结束当次执行
}
// 判断这个卡号是否存在 :根据这个卡号去查询对方账户,若查到则存在
Account account = getAccountByCardId(cardId,accounts);
if(account == null){
System.out.println("对不起,您输入的这个账号不存在!!");
}else {
// 这个账户存在了,继续认证他的姓氏
String userName = account.getUserName(); //要把姓氏变成*
String tip = "*"+userName.substring(1);
System.out.println("请您输入["+ tip +"]的姓氏");
String preName = sc.next();
// 认证这个姓氏是正确的
if(userName.startsWith(preName)){
// 姓氏认证通过 可以转账了
while (true) {
System.out.print("请你输入转账金额:");
double money = sc.nextDouble();
// 判断余额是否足够
if(money>acc.getMoney()){
System.out.println("对不起,余额不足。 您最多可以转账:" +acc.getMoney());
}else {
// 余额足够
acc.setMoney(acc.getMoney()-money);
account.setMoney(account.getMoney()+money);
System.out.println("转账成功! 您的账户余额为:" +acc.getMoney());
return; //直接干掉转账方法
}
}
}else {
System.out.println("对不起,您输入的信息有误!!!");
}
}
}
}
private static void drawMoney(Account acc, Scanner sc) {
// 1、判断是否足够一百元
System.out.println("===============用户取款操作==============");
if (acc.getMoney()<100){
System.out.println("对不起,当前账户中余额不够100元,不能取款!!!");
return;
}
while (true) {
// 2、提示用户输入取款金额
System.out.print("请您输入取款金额:");
double money = sc.nextDouble();
// 3、判断这个金额是否满足要求
if (money>acc.getQuoteMoney()){
System.out.println("对不起,你当前取款金额超过每次取款限额。每次最多可取:"+ acc.getQuoteMoney());
}else {
// 没有超过限额
// 4、判断是否超过余额
if (money > acc.getMoney()){
System.out.println("余额不足!! 您账户目前余额为:" +acc.getMoney());
}else {
// 可以取款了
System.out.println("恭喜您,取款"+money+"元。成功!!!");
// 更新余额
acc.setMoney(acc.getMoney() - money);
// 取款结束了 展示账户信息
showAccount(acc);
return;
}
}
}
}
private static void depositMoney(Account acc, Scanner sc) {
System.out.println("===================用户存款操作================");
System.out.print("请您输入存款金额:");
double money = sc.nextDouble();
// 更新账户金额, 原来的钱+新存入的钱
acc.setMoney(acc.getMoney()+money);
System.out.println("恭喜您,存钱成功! 当前账户信息如下");
showAccount(acc);
}
private static void showAccount(Account acc) {
System.out.println("=============当前账户信息如下=============");
System.out.println("卡号:" + acc.getCardId());
System.out.println("户主:" + acc.getUserName());
System.out.println("性别:" + acc.getSex());
System.out.println("余额:" + acc.getMoney());
System.out.println("限额:" + acc.getQuoteMoney());
}
private static void register(ArrayList<Account> accounts ,Scanner sc) {
System.out.println("==================系统开户操作==============");
// 1、创建一个账户对象 ,用于后期封装账户信息
Account account = new Account();
// 2、录入当前这个账户的信息,注入到账户对象中去
System.out.print("请您输入账户用户名:");
String userName = sc.next();
account.setUserName(userName);
System.out.print("请您输入您的性别:");
String sex = sc.next();
account.setSex(sex);
while (true) {
System.out.print("请您输入账户密码:");
String password = sc.next();
System.out.print("请您输入确认密码:");
String okPassword = sc.next();
if(password.equals(okPassword)){
// 密码认证通过,可以注入给账户对象了
account.setPassword(password);
break; //密码已经录入成功,死循环没有必要继续了
}else {
System.out.println("对不起您两次输入的密码不一致,请重新输入!!");
}
}
System.out.print("请您输入账户当次限额:");
double quoteMoney = sc.nextDouble();
account.setQuoteMoney(quoteMoney);
// 为账户随机一个八位且与其他账户卡号不同的号码作为卡号 (独立功能)
String cardId = getRandomCardId(accounts);
account.setCardId(cardId);
// 3、把账户对象添加到集合中去
accounts.add(account);
System.out.println("恭喜您,"+userName + (sex.equals("男") ? "先生" :"女士" )+ ",您开户成功。 您的卡号是:"+cardId+" 请你妥善保管!!!!!");
}
private static String getRandomCardId( ArrayList<Account> accounts) {
// 1、先生成八位数字
Random r = new Random();
while (true) {
String cardId = "";
for (int i = 0; i < 8; i++) {
cardId += r.nextInt(10);
}
// 2、判断这个八位卡号是否与其他账户卡号重复
// 根据这个卡号查询这个对象
Account acc = getAccountByCardId(cardId ,accounts);
if (acc == null){
// 说明根据这个卡号并没有查询出对象,即这个卡号没有重复
return cardId;
}
}
}
private static Account getAccountByCardId(String cardId , ArrayList<Account> accounts){
for (Account acc : accounts) {
if (acc.getCardId().equals(cardId)) {
return acc;
}
}
return null; //查无此账号
}
}
效果实现截图:
、
边栏推荐
猜你喜欢
随机推荐
MySQL 8.0.29 set and modify the default password
navicat新建数据库
Detailed explanation of the software testing process (mind map) of the first-tier manufacturers
H5接入支付流程-微信支付&支付宝支付
golang环境详细安装、配置
MySQL 多表关联一对多查询实现取最新一条数据
Matlab论文插图绘制模板第41期—气泡图(bubblechart)
MySQL夺命10问,你能坚持到第几问?
Go language study notes - grpc serverclient protobuf Go language from scratch
leetcode 204. Count Primes 计数质数 (Easy)
18 years of programmer career, read more than 200 programming books, pick out some essence to share with you
MySQL multi-table association one-to-many query to get the latest data
MySQL 字符串拼接 - 多种字符串拼接实战案例
2022年7月学习计划完成情况
Mycat2.0搭建教程
Go语言中定时任务库Cron使用详解
关于web应用的目录结构
提高软件测试能力的方法有哪些?看完这篇文章让你提升一个档次
Mysql 回表
MySQL安装教程