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