这两天晚上都在写这个项目,虽然在写之前已经看了教学视频,但是自己动手写还是会遇到许多问题。
上代码:
首先要定义一个账户类:
package com.zhongying.atm;
public class Account {
private String userName;//户主姓名//
private String userID;//身份证号//
private String sex;//性别//
private String cardID;//卡号//
private byte accountLevel;//账户等级(1、2、3级,分别对应5000、10000、50000的限额)//
private double balance;//余额
private double quota;//限额//
private String passWord;//密码
public String getUserName() {
return userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getCardID() {
return cardID;
}
public void setCardID(String cardID) {
this.cardID = cardID;
}
public byte getAccountLevel() {
return accountLevel;
}
public void setAccountLevel(byte accountLevel) {
this.accountLevel = accountLevel;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public double getQuota() {
return quota;
}
public void setQuota(double quota) {
this.quota = quota;
}
}
然后就是主体部分:
package com.zhongying.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);//创建输入对象,以后要用的话直接传参
ArrayList<Account> accounts = new ArrayList<>();//创建账户类型的集合
welcomeInterface(sc, accounts);
}
/**
* 用于登录或注册的一级界面
*
* @param sc 输入对象
* @param accounts 具有装载账户对象的集合
*/
public static void welcomeInterface(Scanner sc, ArrayList<Account> accounts) {
while (true) {
System.out.println("===========中印银行ATM系统==========");
System.out.println("1、账户登录");
System.out.println("2、注册账户");
System.out.println("请输入你要的操作:");
int select = sc.nextInt();
switch (select) {
case 1:
login(accounts, sc);//登录界面
break;
case 2:
register(accounts, sc);//注册界面
break;
default:
System.out.println("输入有误~~");
}
}
}
/**
* 用于登录的界面
*
* @param accounts 具有装载账户对象的集合
* @param sc 输入对象
*/
private static void login(ArrayList<Account> accounts, Scanner sc) {
if (accounts.size() != 0) {
System.out.println("===========登录界面===========");
System.out.println("请输入卡号:");
Account a = findCard(accounts, sc.next());//这个方法如果找不到相同的号码会返回null
if (a != null) {
while (true) {
System.out.println("请输入密码:");
if (sc.next().equals(a.getPassWord())) {//如果密码相等
System.out.println("欢迎你," + a.getUserName() + a.getSex() + ",登录成功!");
//要进入二级界面
function(accounts, a, sc);
break;
} else {
System.out.println("密码输入错误,请重试~~");
}
}
} else {
System.out.println("卡号输入有误,请重新输入~~");
}
} else {
System.out.println("系统中没有账户,创建一个吧~~");
}
}
/**
* 登录之后的功能界面
*
* @param accounts 具有装载账户对象的集合
* @param a 登录的账户对象
* @param sc 输入对象
*/
private static void function(ArrayList<Account> accounts, Account a, Scanner sc) {
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.println("8、注销账户");
System.out.println("请输入你要进行的操作:");
switch (sc.nextInt()) {
case 1:
printfInformation(a);
break;
case 2:
deposit(a, sc);
break;
case 3:
withdraw(a, sc);
break;
case 4:
transfer(a, accounts, sc);
break;
case 5:
change(a, sc);
break;
case 6:
upgrade(a);
break;
case 7:
System.out.println("退出成功!!");
return;
case 8:
if (cancel(a, accounts, sc)) {
return;
}
break;
default:
System.out.println("输入有误,重新输入~~");
}
}
}
/**
* 注销功能方法
*
* @param a 账户
* @param accounts 装载这个账户的集合
* @param sc 输入对象
* @return
*/
private static boolean cancel(Account a, ArrayList<Account> accounts, Scanner sc) {
System.out.println("请确认注销账户吗,一旦注销无法恢复");
System.out.println("1、确认");
System.out.println("2、取消");
if (sc.nextInt() == 1) {
System.out.println("请补全姓名以确认身份:");
System.out.println(a.getUserName().replace(a.getUserName().substring(1), "**"));//字符串替换
if (sc.next().equals(a.getUserName().substring(1))) {//判断替换掉的字符串跟用户输入的是否一样
accounts.remove(a);
System.out.println("注销成功!!");
return true;
} else {
System.out.println("验证失败");
return false;
}
} else {
return false;
}
}
/**
* 用于升级账户类型的方法
*
* @param a 要升级的账户地址
*/
private static void upgrade(Account a) {
System.out.println(a.getUserName() + a.getSex() + "您好,感谢您对中印银行的长久的支持");
System.out.println("目前您的" + "账户类型为" + a.getAccountLevel() + "级客户");
if (a.getAccountLevel() < 3) {
System.out.println("已经为您成功升级!");
a.setAccountLevel((byte) (a.getAccountLevel() + 1));
setQuota(a);//调用限额改变方法
System.out.println("目前您的账户等级为" + a.getAccountLevel() + "级" + ",单次限额提升到" + a.getQuota());
} else {
System.out.println("您已经是我们最高级的客户了,感谢您对本银行的支持!!");
}
}
/**
* 修改密码方法
*
* @param a 要修改密码的账户地址
* @param sc 输入对象
*/
private static void change(Account a, Scanner sc) {
while (true) {//原密码循环
System.out.println("请输入原密码:");
if (sc.next().equals(a.getPassWord())) {//确认身份
while (true) {//新密码循环
System.out.println("请输入新密码:");
String newPassWord = sc.next();
if (!newPassWord.equals(a.getPassWord())) {//新密码不能和旧密码相同
System.out.println("请再次输入以确认:");
if (sc.next().equals(newPassWord)) {
System.out.println("修改密码成功!!");
a.setPassWord(newPassWord);
return;
} else {
System.out.println("两次输入的密码不一致~~");
}
} else {
System.out.println("新密码要与旧密码不一样!!");
}
}
} else {
System.out.println("密码输入错误~~");
}
}
}
/**
* 转账方法
*
* @param a 想要转账的账户地址
* @param accounts 所有账户的集合
* @param sc 输入对象
*/
private static void transfer(Account a, ArrayList<Account> accounts, Scanner sc) {
if (accounts.size() >= 2) {//确保系统里有两个或以上的账户才能转账
while (true) {
System.out.println("请输入对方的卡号:");
Account other = findCard(accounts, sc.next());//调用找卡号的方法
if (other != null) { //如果方法返回的不是null,就代表找到了
while (true) {//判断金额是否满足转账条件
System.out.println("请选择为" + other.getUserName().replace(other.getUserName().substring(1), "**") + other.getSex() + "转账多少元");
double money = sc.nextDouble();
if (a.getBalance() >= 100 && money <= a.getBalance()) {
System.out.println("请输入密码:");
while (true) {//密码循环
if (sc.next().equals(a.getPassWord())) {
System.out.println("转账成功!!");
other.setBalance(other.getBalance() + money);
a.setBalance(a.getBalance() - money);//将原账户的钱减去转走到钱
return;
} else {
System.out.println("密码错误~请重新输入");
}
}
} else {
System.out.println("失败!,您的余额为" + a.getBalance() + ",请重新输入要转账的金额");
}
}
} else {
System.out.println("卡号输入错误~~请重新输入");
}
}
} else {
System.out.println("系统内没有其他用户,无法转账");
}
}
/**
* 用于取钱方法
*
* @param a 要取钱的对象地址
* @param sc 输入对象
*/
private static void withdraw(Account a, Scanner sc) {
if (a.getBalance() >= 100) {
System.out.println("请输入你要取多少钱");
double money = sc.nextDouble();
if (money <= a.getBalance()) {
if (money <= a.getQuota()) {
a.setBalance(a.getBalance() - money);
System.out.println("已成功取走!!目前还有余额" + a.getBalance());
} else {
System.out.println("失败,当次取钱超过限额~~");
}
} else {
System.out.println("余额不足,请重新选择");
}
} else {
System.out.println("余额不足100,取钱失败!!");
}
}
/**
* 用于存钱方法
*
* @param a 需要取钱的账户地址
* @param sc 输入对象
*/
private static void deposit(Account a, Scanner sc) {
System.out.println("请输入你要存入的钱:");
a.setBalance(a.getBalance() + sc.nextInt());
System.out.println("存入成功!!");
System.out.println("你现在余额为:" + a.getBalance());
}
/**
* 用于注册的界面方法
*
* @param accounts 要装载账户类的集合
* @param sc 输入对象地址
*/
private static void register(ArrayList<Account> accounts, Scanner sc) {
while (true) {
System.out.println("===========注册界面===========");
System.out.println("请输入身份证号码:");
String userID = sc.next();
if (userID.length() == 18) {
Account a = new Account();
accounts.add(a);//将账户类添加到集合中去
a.setUserID(userID);
setSex(a);//判断性别
System.out.println("请输入姓名:");
a.setUserName(sc.next());
a.setCardID(getCardNumber(accounts));//随机出一个8位数卡号
System.out.println("您的卡号为:" + a.getCardID());
while (true) {
System.out.println("请为卡号:" + a.getCardID() + "\t设置一个密码:");
String passWord = sc.next();
System.out.println("请再次确认密码:");
if (sc.next().equals(passWord)) {
a.setPassWord(passWord);
break;
} else {
System.out.println("两次输入的密码不一致,请重新输入~~");
}
}
a.setAccountLevel((byte) 1);
setQuota(a);
return;
} else {
System.out.println("身份证格式有误!!");
}
}
}
/**
* 用于生成随机的8位卡号数字
*
* @param accounts 装载了账户类型的集合
* @return 返回生成好的不重复的字符串
*/
private static String getCardNumber(ArrayList<Account> accounts) {
while (true) {//不重复才返回
Random r = new Random();
String cardNumber = "98";//卡号默认98开头
for (int i = 0; i < 6; i++) {
cardNumber += r.nextInt(10);//每一次生成的随机数都加到cardNumber里
}
for (int i = 0; i < accounts.size(); i++) {//判断卡号与其他用户的卡号是否相同
if (cardNumber.equals(accounts.get(i).getCardID())) {
} else {
System.out.println("创建成功");
return cardNumber;
}
}
}
}
/**
* 用于将用户的基本形象打印
*
* @param a 要打印的对象地址
*/
private static void printfInformation(Account a) {
System.out.println("-------------------------------------");
System.out.println("您的信息如下:");
System.out.println("姓名:" + a.getUserName());
System.out.println("卡号:" + a.getCardID());
System.out.println("卡上余额:" + a.getBalance());
System.out.println("账户类型" + a.getAccountLevel() + "级客户");
System.out.println("当次限额:" + a.getQuota());
System.out.println("-------------------------------------");
}
/**
* 通过身份证第17位来判断是男生还是女生
*
* @param a 要判断的账户类地址
*/
private static void setSex(Account a) {
if ((a.getUserID().charAt(16) % 2) != 0) {//ascll码中字符1-9中对应的ascll码值的奇偶性相同
a.setSex("先生");
} else {
a.setSex("女士");
}
}
/**
* 根据账户等级调整限额
*
* @param a 要调整的账户类地址
*/
private static void setQuota(Account a) {
switch (a.getAccountLevel()) {
case 1:
a.setQuota(5000);
break;
case 2:
a.setQuota(10000);
break;
case 3:
a.setQuota(50000);
break;
}
}
/**
* 用于将要比较的卡号与集合里的其他对象的卡号进行对比
*
* @param accounts 装载了用户信息的集合
* @param cardId 要比较的卡号
* @return 找到了返回那个卡号的对象地址,找不到返回null
*/
private static Account findCard(ArrayList<Account> accounts, String cardId) {
for (int i = 0; i < accounts.size(); i++) {
if (cardId.equals(accounts.get(i).getCardID())) {
return accounts.get(i);
}
}
return null;
}
}