Java 中 ATM 系统开发
目录
ATM 系统开发
一、 系统准备
1、 简介
内容分析:
- 每个用户的账户信息都是一个对象,需要提供账户类
- 需要准备一个容器,用于存储系统全部账户对象信息
- 首页只需要包含;登录和注册两个功能
实现步骤:
- 定义账户类,用于后期创建账户对象封装用户的账户信息
- 账户类中的信息至少需要包含(卡号、姓名、密码、余额、取现额度)
- 需要准备一个集合,用于存储系统用户的账户对象
- 需要展示欢迎页面,包括两个功能:开户功能和登录功能
2、 定义账户类
package ATM; public class Account { // 成员变量私有化 private String m_Id; // 卡号 private String m_Name; // 姓名 private String m_Pwd; // 密码 private double m_Money; // 账户余额 private double m_GetMoney; // 每次取现额度 public String getM_Id() { return m_Id; } public void setM_Id(String m_Id) { this.m_Id = m_Id; } public String getM_Name() { return m_Name; } public void setM_Name(String m_Name) { this.m_Name = m_Name; } public String getM_Pwd() { return m_Pwd; } public void setM_Pwd(String m_Pwd) { this.m_Pwd = m_Pwd; } public double getM_Money() { return m_Money; } public void setM_Money(double m_Money) { this.m_Money = m_Money; } public double getM_GetMoney() { return m_GetMoney; } public void setM_GetMoney(double m_GetMoney) { this.m_GetMoney = m_GetMoney; } }
3、 欢迎页面
package ATM; import java.util.ArrayList; import java.util.Scanner; public class ATMSystem { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 1、 定义账户类 // 2、 定义集合容器 ArrayList<Account> accounts = new ArrayList<>(); // 3、 展示系统的首页 show(sc); } private static void show(Scanner sc) { OUT: while (true) { System.out.println("0、 退出系统"); System.out.println("1、 账户登录"); System.out.println("2、 账户开户"); System.out.println("请选择要进行的操作:"); int command = sc.nextInt(); switch (command) { case 0: // 退出 break OUT; case 1: // 用户登录 loginAccount(accounts, sc); break; case 2: // 账户开户 createAccount(sc, accounts); break; default: System.out.println("请按照要求输入哦!!!"); } } } }
二、 开户功能
1、 简介
分析:
- 开户功能其实就是往系统的集合容器中存入一个新账户对象的信息
实现步骤:
- 开户应该定义一个方法,并传入账户集合
- 创建一个 Acount 账户类的对象用于封装账户信息(姓名、密码、卡号)
- 键盘录入姓名、密码、确认密码
- 生成账户卡号,卡号必须由系统自动生成8位数字
- 把账户对象存入到集合中去
2、 代码实现
private static void createAccount(Scanner sc, ArrayList<Account> accounts) { // 开户 System.out.println("================开户系统====================="); // 创建一个对象,用于封装账户信息 Account at = new Account(); // 录入信息,把账户信息添加到集合中去 System.out.println("请输入用户名:"); String name = sc.next(); at.setM_Name(name); String pwd = null; while (true) { System.out.println("请输入密码:"); pwd = sc.next(); System.out.println("请再次输入密码:"); String pwd_s = sc.next(); if (pwd.equals(pwd_s)) { System.out.println("密码认证通过"); break; // 密码录入成功 } else { System.out.println("两次密码不一样,请重新输入!"); } } at.setM_Pwd(pwd); at.setM_GetMoney(10000.0); // 限额默认为 1w String id = getRandomOnlyId(accounts); at.setM_Id(id); // 创建卡号 at.setM_Money(0.0); // 余额为0 accounts.add(at); System.out.printf("恭喜您,创建成功,卡号为%s!!\n", id); } private static String getRandomOnlyId(ArrayList<Account> accounts) { // 得到卡号 Random r = new Random(); while (true) { String id = ""; for (int i = 0; i < 8; i++) { id += r.nextInt(10); } Account acc = getAccountById(id, accounts); if (acc == null) { // 不重复 return id; } } } private static Account getAccountById(String id, ArrayList<Account> accounts) { // 判断 id 是否重复 for (int i = 0; i < accounts.size(); i++) { Account acc = accounts.get(i); if (id.equals(acc.getM_Id())) { return acc; } } return null; }
三、 登录功能
1、 简介
2、 代码实现
private static void loginAccount(ArrayList<Account> accounts, Scanner sc) { System.out.println("================登录系统====================="); if (accounts.size() == 0) { System.out.println("请先注册账户!"); return; } int j = 0; while (j < 6) { System.out.println("请输入卡号:"); String id = sc.next(); System.out.println("请输入密码:"); String pwd = sc.next(); for (int i = 0; i < accounts.size(); i++) { if (accounts.get(i).getM_Id().equals(id) && accounts.get(i).getM_Pwd().equals(pwd)) { System.out.println("登录成功"); show2(accounts, sc, accounts.get(i)); return; } } System.out.println("账号或密码错误,请重新输入!!!"); j++; } System.out.println("6次机会已过,请与管理员联系!!"); }
四、 登录成功
1、 界面
功能分析:
- 用户登录成功后,需要进入用户操作页
- 查询就是直接展示当前登录成功的账户对象的信息
- 退出账户是需要回到首页
代码实现:
private static void show2(ArrayList<Account> accounts, Scanner sc, Account acc) { while (true) { System.out.println("================操作页面====================="); System.out.println("0、 退出"); 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("请输入要进行的操作:"); int choice = sc.nextInt(); switch (choice) { case 0: // 退出 return; case 1: // 查询 searchAccount(acc); break; case 2: // 存款 saveMoney(acc, sc); break; case 3: // 取款 getMoney(acc, sc); break; case 4: // 转账 moveMoney(accounts, sc, acc); break; case 5: // 修改密码 changePwd(accounts, acc, sc); break; case 6: // 注销账户 delAccount(accounts, acc); return; default: System.out.println("请按照要求输入哦!!!"); } } }
2、 查询功能
private static void searchAccount(Account acc) { System.out.println("================信息如下====================="); System.out.println("用户名:" + acc.getM_Name()); System.out.println("卡号:" + acc.getM_Id()); System.out.println("本日剩余额度:" + acc.getM_GetMoney()); System.out.println("余额:" + acc.getM_Money()); System.out.println("输出完成!!!"); }
3、 注销账户
private static void delAccount(ArrayList<Account> accounts, Account acc) { accounts.remove(acc); System.out.println("注销成功"); }
4、 存款功能
功能分析:
- 存款就是拿到当前账户对象
- 然后让用户输入存款的金额
- 调用账户对象的赋值方法,将账户余额修改成存钱后的余额
代码实现:
private static void saveMoney(Account acc, Scanner sc) { System.out.println("请输入要存入的金额:"); double money = sc.nextDouble(); acc.setM_Money(acc.getM_Money() + money); // 余额加存入的钱 System.out.println("存款成功,余额为:" + acc.getM_Money()); }
5、 取款功能
功能分析:
- 取款就是拿到当前对象
- 然后让用户输入取款金额,同时判断是否小于余额,,大于100
- 调用账户对象的赋值方法,将账户余额修改为取钱后的余额,同时修改限额
代码实现:
private static void getMoney(Account acc, Scanner sc) { if (acc.getM_Money() < 100) { // 判断余额是否大于100元 System.out.println("余额小于100"); return; } System.out.println("请输入要取款的金额:"); double money = sc.nextDouble(); if (money > acc.getM_Money()) { // 如果取款金额大于余额 System.out.println("余额不足!!!"); return; } else if (money > acc.getM_GetMoney()) { // 如果取款金额大于限额 System.out.println("抱歉,取款金额大于限额!"); return; } // 更新余额 acc.setM_Money(acc.getM_Money() - money); acc.setM_GetMoney(acc.getM_GetMoney() - money); System.out.println("取款成功!"); searchAccount(acc); }
6、 转账功能
功能分析:
- 转账功能需要判断系统中是否有2个账户对象,及以上
- 同时还要判断自己账户是否有钱
- 接下来需要输入对方卡号,判断对方账户是否存在
- 对方账户存在还需要认证对方户主的形式
- 满足要求则可以把自己账户对象的金额修改到对方账户对象中去
代码实现:
private static void moveMoney(ArrayList<Account> accounts, Scanner sc, Account acc) { if (accounts.size() == 1) { System.out.println("一个账户不能转账"); return; } System.out.println("请输入要转账的卡号:"); String id = sc.next(); Account acc_c = getAccountById(id, accounts); if (acc_c == null) { System.out.println("该用户不存在,转账失败!"); return; } System.out.println("请输入转账金额:"); double money = sc.nextDouble(); if (money > acc.getM_Money()) { System.out.println("余额不足!"); return; } else if (money > acc.getM_GetMoney()) { System.out.println("限额不足!"); return; } System.out.println("请输入对方账户用户名:"); // 用户名认证 String name = sc.next(); if (!name.equals(acc_c.getM_Name())) { return; } // 更新金额 acc_c.setM_Money(acc_c.getM_Money() + money); acc.setM_Money(acc.getM_Money() - money); acc.setM_GetMoney(acc.getM_GetMoney() - money); // 更新额度 System.out.println("转账完成!"); searchAccount(acc); }
7、 密码修改
功能分析:
- 输入一次旧密码,输入两次新密码
- 重新登陆
代码实现:
private static void changePwd(ArrayList<Account> accounts, Account acc, Scanner sc) { System.out.println("请输入旧密码:"); String pwd_o = sc.next(); if (!pwd_o.equals(acc.getM_Pwd())) { System.out.println("密码输入错误!"); return; } String pwd_n = null; while (true) { System.out.println("请输入新密码:"); pwd_n = sc.next(); if (pwd_n.equals(pwd_o)) { System.out.println("修改密码要和原密码不一样!"); continue; } System.out.println("请再输入一次新密码:"); String pwd_ne = sc.next(); if (!pwd_n.equals(pwd_ne)) { System.out.println("两次密码输入不相同,请重新输入!"); continue; } break; } acc.setM_Pwd(pwd_n); System.out.println("修改成功,请重新登陆"); show(sc, accounts); }
五、 总代码
1、 主运行文件
package ATM; import java.util.ArrayList; import java.util.Random; import java.util.Scanner; public class ATMSystem { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 1、 定义账户类 // 2、 定义集合容器 ArrayList<Account> accounts = new ArrayList<>(); // 3、 展示系统的首页 show(sc, accounts); } private static void show(Scanner sc, ArrayList<Account> accounts) { OUT: while (true) { System.out.println("================ATM系统====================="); System.out.println("0、 退出系统"); System.out.println("1、 账户登录"); System.out.println("2、 账户开户"); System.out.println("请选择要进行的操作:"); int command = sc.nextInt(); switch (command) { case 0: // 退出 break OUT; case 1: // 用户登录 loginAccount(accounts, sc); break; case 2: // 账户开户 createAccount(sc, accounts); break; default: System.out.println("请按照要求输入哦!!!"); } } } private static void loginAccount(ArrayList<Account> accounts, Scanner sc) { System.out.println("================登录系统====================="); if (accounts.size() == 0) { System.out.println("请先注册账户!"); return; } int j = 0; while (j < 6) { System.out.println("请输入卡号:"); String id = sc.next(); System.out.println("请输入密码:"); String pwd = sc.next(); for (int i = 0; i < accounts.size(); i++) { if (accounts.get(i).getM_Id().equals(id) && accounts.get(i).getM_Pwd().equals(pwd)) { System.out.println("登录成功"); show2(accounts, sc, accounts.get(i)); return; } } System.out.println("账号或密码错误,请重新输入!!!"); j++; } System.out.println("6次机会已过,请与管理员联系!!"); } private static void show2(ArrayList<Account> accounts, Scanner sc, Account acc) { while (true) { System.out.println("================操作页面====================="); System.out.println("0、 退出"); 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("请输入要进行的操作:"); int choice = sc.nextInt(); switch (choice) { case 0: // 退出 return; case 1: // 查询 searchAccount(acc); break; case 2: // 存款 saveMoney(acc, sc); break; case 3: // 取款 getMoney(acc, sc); break; case 4: // 转账 moveMoney(accounts, sc, acc); break; case 5: // 修改密码 changePwd(accounts, acc, sc); break; case 6: // 注销账户 delAccount(accounts, acc); return; default: System.out.println("请按照要求输入哦!!!"); } } } private static void delAccount(ArrayList<Account> accounts, Account acc) { accounts.remove(acc); System.out.println("注销成功"); } private static void changePwd(ArrayList<Account> accounts, Account acc, Scanner sc) { System.out.println("请输入旧密码:"); String pwd_o = sc.next(); if (!pwd_o.equals(acc.getM_Pwd())) { System.out.println("密码输入错误!"); return; } String pwd_n = null; while (true) { System.out.println("请输入新密码:"); pwd_n = sc.next(); if (pwd_n.equals(pwd_o)) { System.out.println("修改密码要和原密码不一样!"); continue; } System.out.println("请再输入一次新密码:"); String pwd_ne = sc.next(); if (!pwd_n.equals(pwd_ne)) { System.out.println("两次密码输入不相同,请重新输入!"); continue; } break; } acc.setM_Pwd(pwd_n); System.out.println("修改成功,请重新登陆"); show(sc, accounts); } private static void moveMoney(ArrayList<Account> accounts, Scanner sc, Account acc) { if (accounts.size() == 1) { System.out.println("一个账户不能转账"); return; } System.out.println("请输入要转账的卡号:"); String id = sc.next(); Account acc_c = getAccountById(id, accounts); if (acc_c == null) { System.out.println("该用户不存在,转账失败!"); return; } System.out.println("请输入转账金额:"); double money = sc.nextDouble(); if (money > acc.getM_Money()) { System.out.println("余额不足!"); return; } else if (money > acc.getM_GetMoney()) { System.out.println("限额不足!"); return; } System.out.println("请输入对方账户用户名:"); // 用户名认证 String name = sc.next(); if (!name.equals(acc_c.getM_Name())) { return; } // 更新金额 acc_c.setM_Money(acc_c.getM_Money() + money); acc.setM_Money(acc.getM_Money() - money); acc.setM_GetMoney(acc.getM_GetMoney() - money); // 更新额度 System.out.println("转账完成!"); searchAccount(acc); } private static void getMoney(Account acc, Scanner sc) { if (acc.getM_Money() < 100) { // 判断余额是否大于100元 System.out.println("余额小于100"); return; } System.out.println("请输入要取款的金额:"); double money = sc.nextDouble(); if (money > acc.getM_Money()) { // 如果取款金额大于余额 System.out.println("余额不足!!!"); return; } else if (money > acc.getM_GetMoney()) { // 如果取款金额大于限额 System.out.println("抱歉,取款金额大于限额!"); return; } // 更新余额 acc.setM_Money(acc.getM_Money() - money); acc.setM_GetMoney(acc.getM_GetMoney() - money); System.out.println("取款成功!"); searchAccount(acc); } private static void saveMoney(Account acc, Scanner sc) { System.out.println("请输入要存入的金额:"); double money = sc.nextDouble(); acc.setM_Money(acc.getM_Money() + money); // 余额加存入的钱 System.out.println("存款成功,余额为:" + acc.getM_Money()); } private static void searchAccount(Account acc) { System.out.println("================信息如下====================="); System.out.println("用户名:" + acc.getM_Name()); System.out.println("卡号:" + acc.getM_Id()); System.out.println("本日剩余额度:" + acc.getM_GetMoney()); System.out.println("余额:" + acc.getM_Money()); System.out.println("输出完成!!!"); } private static void createAccount(Scanner sc, ArrayList<Account> accounts) { // 开户 System.out.println("================开户系统====================="); // 创建一个对象,用于封装账户信息 Account at = new Account(); // 录入信息,把账户信息添加到集合中去 System.out.println("请输入用户名:"); String name = sc.next(); at.setM_Name(name); String pwd = null; while (true) { System.out.println("请输入密码:"); pwd = sc.next(); System.out.println("请再次输入密码:"); String pwd_s = sc.next(); if (pwd.equals(pwd_s)) { System.out.println("密码认证通过"); break; // 密码录入成功 } else { System.out.println("两次密码不一样,请重新输入!"); } } at.setM_Pwd(pwd); at.setM_GetMoney(10000.0); // 限额默认为 1w String id = getRandomOnlyId(accounts); at.setM_Id(id); // 创建卡号 at.setM_Money(0.0); // 余额为0 accounts.add(at); System.out.printf("恭喜您,创建成功,卡号为:\n%s\n", id); } private static String getRandomOnlyId(ArrayList<Account> accounts) { // 得到卡号 Random r = new Random(); while (true) { String id = ""; for (int i = 0; i < 8; i++) { id += r.nextInt(10); } Account acc = getAccountById(id, accounts); if (acc == null) { // 不重复 return id; } } } private static Account getAccountById(String id, ArrayList<Account> accounts) { // 判断 id 是否重复 for (int i = 0; i < accounts.size(); i++) { Account acc = accounts.get(i); if (id.equals(acc.getM_Id())) { return acc; } } return null; } }
2、 账户类文件
package ATM; public class Account { // 成员变量私有化 private String m_Id; // 卡号 private String m_Name; // 姓名 private String m_Pwd; // 密码 private double m_Money; // 账户余额 private double m_GetMoney; // 每次取现额度 public String getM_Id() { return m_Id; } public void setM_Id(String m_Id) { this.m_Id = m_Id; } public String getM_Name() { return m_Name; } public void setM_Name(String m_Name) { this.m_Name = m_Name; } public String getM_Pwd() { return m_Pwd; } public void setM_Pwd(String m_Pwd) { this.m_Pwd = m_Pwd; } public double getM_Money() { return m_Money; } public void setM_Money(double m_Money) { this.m_Money = m_Money; } public double getM_GetMoney() { return m_GetMoney; } public void setM_GetMoney(double m_GetMoney) { this.m_GetMoney = m_GetMoney; } }
整个项目在:【 https://download.csdn.net/download/qq_62789540/85045248 】免费哦!!
本文来自博客园,作者:Kenny_LZK,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/16064347.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?