/**
* Atm机系统的实现
*
* 1、本文档为银行自动柜员机ATM模拟系统说明。
* 2、需求规定
* 主要功能包括新开账户和客户服务。
* 客户服务包括:存款服务、取款服务、转账、打印清单
* 3、数据结构
* 用户信息包括:账号、姓名、密码和账户总金额
* 4、新开帐户
* 新开账户主要包括设置新用户信息并把用户信息存储到变长数组中。
*
* 设计的起点:现实世界的模拟
* 1、阅读《需求分析书》,搞清楚软件功能定界,不要做出幻影需求
* 2、查找需求说明中的名词,并区分名词之间的关系---类和属性
* 3、查找需求说明中的动词---方法,最麻烦的是职责划分
* 4、额外要求:不是强制要求,可以绘制UML类图---可以识图但是不要求绘图实现步骤
*
* 1、制作atm包
* 2、编写账户类,其中包括卡号、金额等属性以及存款,取款,查看余额,转帐四个方法
* 3、编写ATM应用主函数实例化一个长度为10的数组,用来保存多个账户对象。插卡提示后用户输入信息登录系统(卡号和密码),
* 如果失败三次将执行吞卡处理提示用户选择要进行的操作(1:修改密码2:存款3:取款4:查余额5:转账0:退卡),重复过程,直到用户输入0结束循环
* 用户输入1,那么可以修改当前登录用户的密码
* 用户输入2,那么提示用户输入存入的金额,然后在数组中查找到这个账户对象,并调用这张卡对象的存款方法进行存款
* 用户输入3,那么提示用户要取出的金额,然后在数组中查找到这个账户对象,并调用这张卡对象的取款方法进行存款
* 用户输入4,那么在数组中查找到这张卡对象,并调用这张卡对象的查余额方法得到余额,并输出给用户看
* 用户输入5,那么提示用户输入转账目标卡的卡号,然后在数组中查找到这个目标卡对象,并调用卡类的转账函数,执行转账操作
* 要求:不允许面向过程,每个方法中所包含语句不得大于30行,每个方法需要有对应的文档注释
*
*/
1.用户类
package atm;
//用户信息包括:账号、姓名、密码和账户总金额
public class User {
private String idNum;// 账号19位
private String name;// 姓名
private int password;// 密码
private int account;// 账户余额
// 存款
public boolean deposit(int saveMoney) {
boolean flag = false;
while (true) {
if (saveMoney % 100 == 0) {
this.account += saveMoney;
flag = true;
break;
} else {
System.out.println("请放入一百面值的钞票!!!");
break;
}
}
return flag;
}
// 取款
public boolean withdrawMoney(int borrowMoney) {
boolean flag = false;
if (this.account > borrowMoney) {
if (borrowMoney % 100 == 0) {
this.account -= borrowMoney;
flag = true;
}
} else
System.out.println("账户余额不足");
return flag;
}
// 查看余额
public void showAccount(User p) {
System.out.println("当前账户余额为:" + p.getAccount());
}
// ============================================================================
public User(String idNum, String name, int password, int account) {
super();
this.idNum = idNum;
this.name = name;
this.password = password;
this.account = account;
}
public User() {
}
public String getIdNum() {
return idNum;
}
public void setIdNum(String idNum) {
this.idNum = idNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPassword() {
return password;
}
public void setPassword(int password) {
this.password = password;
}
// 获取账户总金额
public int getAccount() {
return account;
}
public void setAccount(int account) {
this.account = account;
}
@Override
public String toString() {
return "User [idNum=" + idNum + ", name=" + name + ", password=" + password + ", account=" + account + "]";
}
}
2.用户账户类(工具类)
package atm;
public class UserAccount {
private User[] user;// 存用户信息的数组
private static int count = 0;// 实际用户的个数
private static boolean flag = false;
public UserAccount() {
this(10);
}
public UserAccount(int len) {
if (len < 0)
throw new IllegalArgumentException("数组长度异常");
user = new User[len];
}
// 添加新用户
public void add(User p) {
if (count == user.length)
dilatation();
user[count++] = p;
}
public void show() {
for (int i = 0; i < count; i++) {
System.out.println(user[i]);
}
}
// 如果数组长度不够,则增加数组长度
private void dilatation() {
int len = user.length * 3 / 2;
User[] perArr = new User[len];
for (int i = 0; i < count; i++)
perArr[i] = user[i];
this.user = perArr;
}
// 判断此账户是否存在
public boolean isExists(String idNum) {
// System.out.println(idNum);
for (int i = 0; i < count; i++) {
// System.out.println(user[i].getIdNum());
if (idNum.equals(user[i].getIdNum())) {
flag = true;
break;
}
}
return flag;
}
// 登录
public boolean login(String idNum, int password) {
for (int i = 0; i < count; i++) {
if (idNum.equals(user[i].getIdNum()) && password == user[i].getPassword()) {
flag = true;
break;
}
}
return flag;
}
// 转账
public boolean transferAccount(User user1, String aimIdNum, int money) {
User aimUser = null;// 创建一个目标账户
for (int i = 0; i < count; i++) {
if (aimIdNum.equals(user[i].getIdNum()) && !aimIdNum.equals(user1.getIdNum())) {
aimUser = findUser(aimIdNum);
if (user1.withdrawMoney(money)) {
if (aimUser.deposit(money)) {
flag = true;
break;
}
}
} else
flag = false;
}
return flag;
}
// 根据账号查找用户
public User findUser(String idNum) {
User user1 = null;
boolean flag = false;
for (int i = 0; i < count; i++) {
if (idNum.equals(user[i].getIdNum())) {
user1 = user[i];
flag = true;
break;
}
}
if (!flag)
System.out.println("没有此账户");
// System.out.println(user1);
return user1;
}
}
3.Atm机类
package atm;
import java.util.Scanner;
//atm端
public class Atm {
// private static int atmAccount = 100000;// atm账户余额
private String idNum;// 账号
private String name;// 姓名
private int password;// 密码
private int account;// 账户余额
private User user;
private UserAccount userAc;
private static Scanner sc = new Scanner(System.in);
public Atm() {
userAc = new UserAccount(10);
User u1 = new User("888888", "张三", 123456, 5000);
User u2 = new User("88888", "李四", 123456, 5000);
User u3 = new User("8888", "王五", 123456, 5000);
userAc.add(u1);
userAc.add(u2);
userAc.add(u3);
// userAc.show();
}
// 主窗口
public void mainMenu() {
System.out.println("欢迎使用本系统~~");
int choose;
while (true) {
try {
System.out.println("请输入:1->注册,2->登录,0->退出");
choose = sc.nextInt();
switch (choose) {
case 1:
System.out.println("请输入您的账号:");
idNum = sc.next();
System.out.println("请输入您的姓名:");
name = sc.next();
System.out.println("请输入您的密码:");
password = sc.nextInt();
System.out.println("请输入您的余额:");
account = sc.nextInt();
regist(idNum, name, password, account);
userAc.show();
break;
case 2:
for (int i = 0; i < 3; i++) {
// User user1 = new User();
System.out.println("输错三次将会被冻结,这是第" + (i + 1) + "次登录");
System.out.println("请输入您的账号:");
idNum = sc.next();
// user1.setIdNum(sc.next());
System.out.println("请输入您的密码:");
password = sc.nextInt();
login(idNum, password);
// user1.setPassword(sc.nextInt());
// login(user1);
if (i == 2)
System.out.println("输错三次,密码已被冻结");
}
System.out.println("-----------------");
break;
case 0:
System.exit(0);
break;
default:
break;
}
} catch (Exception e) {
System.out.println("输入有误");
sc = new Scanner(System.in);
}
}
}
// 注册
public void regist(String idNum, String name, int password, int account) {
if (userAc.isExists(idNum))
System.out.println("账号已存在");
else {
user = new User(idNum, name, password, account);
userAc.add(user);
System.out.println("注册完成");
}
}
// 登录
public void login(String idNum, int password) {
if (userAc.isExists(idNum)) {
if (userAc.login(idNum, password)) {
System.out.println("登录成功");
user = userAc.findUser(idNum);
secondaryMenu(user);
} else
System.out.println("密码错误");
} else
System.out.println("账号不存在");
}
// 副菜单
public void secondaryMenu(User user) {
int choose;
int money;
while (true) {
try {
System.out.println("请输入:1->修改密码,2->存款,3->取款,4->查余额,5->转账,0->退出");
choose = sc.nextInt();
switch (choose) {
case 1:
System.out.println("请输入新密码:");
int pas = sc.nextInt();
user.setPassword(pas);
System.out.println("密码修改成功");
mainMenu();
break;
case 2:
System.out.println("请输入您要存的金额:");
money = sc.nextInt();
user.deposit(money);
System.out.println("存款成功");
user.showAccount(user);
break;
case 3:
System.out.println("请输入您要取的金额:");
money = sc.nextInt();
user.withdrawMoney(money);
System.out.println("取款成功");
user.showAccount(user);
break;
case 4:
user.showAccount(user);
break;
case 5:
System.out.println("请输入要转账的账号:");
String aimIdNum = sc.next();
User user11 = userAc.findUser(aimIdNum);
// System.out.println("请输入要转账的姓名:");
// String name = sc.next();
System.out.println("请输入要转账的金额:");
money = sc.nextInt();
boolean res = userAc.transferAccount(user, aimIdNum, money);
if (res) {
System.out.println("转账成功");
System.out.println(user.getName() + "现有金额为:" + user.getAccount());
System.out.println(user11.getName() + "现有金额为:" + user11.getAccount());
} else {
System.out.println("转账失败");
System.out.println(user.getName() + "现有金额为:" + user.getAccount());
System.out.println(user11.getName() + "现有金额为:" + user11.getAccount());//
}
break;
case 0:
mainMenu();
break;
default:
break;
}
} catch (Exception e) {
System.out.println("输入不合法");
sc = new Scanner(System.in);
}
}
}
}
4.测试类
package atm;
public class AtmSystem {
public static void main(String[] args) {
Atm atm = new Atm();
atm.mainMenu();
}
}