Java学习笔记——第九天
综合项目:ATM
项目需求
- 拥有登陆界面,在登陆界面有开户、功能和退出系统功能。
- 在开户时,要求输入姓名、性别、密码和每次取款限额,输入密码时要再输入一次以确认密码输入正确,之后自动生成不重复的8位数字卡号。
- 在登陆时,若系统中没有账户,要能提示用户先去开户;若输入的账户不存在或密码错误,要能要求用户重新输入卡号或密码。
- 登录完成后,能够展示及选择以下功能:查询账户、存款、取款、转账、修改密码、退出账户和注销当前帐户。
- 在查询账户时,打印出账户的卡号、姓名、性别、余额和每次取款限额。
- 在存款完成后,要打印出账户内的余额。
- 在取款时,要先判断账户里余额是否足够以及是否超过每次取款限额,取款完成后要打印出账户内的余额。
- 在转账时,若当前系统内账户数小于2,则要求用户先去开户;若账户内余额为不足,则提示用户余额不足,不能转账;在转账前,要求用户输入转入账户户主的姓氏,否则不能转账;转账完成后要打印出账户内的余额。
- 在修改密码时,需要先认证用户当前的密码,认证通过后,需要让用户输入2次新密码以确认输入正确,若两次密码一样,则更新账户密码,并回到登陆界面。
- 在退出账户时,需要用户进行确认。
- 在注销当前账户时,若账户里余额不为0,则提示用户账户里还有余额,不能销户;若余额为0,则需要用户进行确认。
项目架构

将项目分为三个类:Account类,ATM类,Run类。Account类用来储存账户的信息,并提供给ATM类处理;ATM类用来处理账户的信息并提供给Run类运行;Run类调用ATM类中的方法运行整个程序。
Account类
Account类中有六个私有属性和对应的setter、getter方法,以及无参构造器和有参构造器,属性对应的信息见下表:
| 属性 | 信息 |
|---|---|
| String name | 姓名 |
| String gender | 性别 |
| String password | 密码 |
| double limit | 每次取款限额 |
| double balance | 余额 |
| String id | 卡号 |
ATM类
ATM类中有三个私有属性,作用见下表:
| 属性 | 作用 |
|---|---|
| ArrayList |
存储注册的账户 |
| Scanner sc | 存储扫描器,接收用户输入 |
| Account loginAccount | 存储当前的账户对象 |
ATM类中还有一系列方法,作用见下表:
| 方法 | 作用 |
|---|---|
| start() | 启动系统 |
| login() | 登录功能 |
| register() | 开户功能 |
| show() | 查询账户功能 |
| deposit() | 存款功能 |
| withdraw() | 取款功能 |
| transfer() | 转账功能 |
| changePassword() | 修改密码功能 |
| logout() | 退出账户功能 |
| cancelAccount() | 注销当前账户功能 |
| getAccountById() | 使用id获取账户对象 |
Run类
Run类没有属性,只有一个main方法,用来调用ATM类的start()方法以启动系统。
代码
Account类
package com.zgg1h.ATM;
public class Account {
private String name; //姓名
private String gender; //性别
private String password; //密码
private double limit; //每次取款限额
private double balance; //余额
private String id; //卡号
public String getName() {
return name + (gender.equals("男") ? "先生" : "女士");
}
public String getName(String name) {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
public double getBalance() {
return balance;
}
public void setBalance(double balance) {
this.balance = balance;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Account() {
}
public Account(String name, String gender, String password, double limit, String id) {
this.name = name;
this.gender = gender;
this.password = password;
this.limit = limit;
this.id = id;
}
}
ATM类
package com.zgg1h.ATM;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> acc = new ArrayList<>(); //存储所有账户
private Scanner sc = new Scanner(System.in); //接收用户输入
private Account loginAccount; //当前登陆账户
//启动系统
public void start() {
//循环选择功能
while (true) {
System.out.println("===欢迎来到ATM系统===");
System.out.println("1.用户登录");
System.out.println("2.用户开户");
System.out.println("3.退出系统");
System.out.print("请选择功能:");
String select = sc.next(); //用户选择的功能
//选择功能
switch (select) {
case "1":
//登录
login();
break;
case "2":
//开户
register();
break;
case "3":
//退出系统
return;
default:
System.out.println("输入错误,请重新输入:");
}
}
}
//登录功能
private void login() {
System.out.println("===欢迎来到登录功能===");
//判断系统中是否已有账户
if (acc.size() == 0) {
System.out.println("当前没有账户,请先去开户");
return;
}
//循环输入卡号
while (true) {
System.out.print("请输入卡号:");
String id = sc.next(); //用户输入的卡号
loginAccount = getAccountById(id); //设置当前登录用户,若卡号不存在,则为null
//查看卡号是否存在
if (loginAccount != null) {
//卡号存在
break;
}
//卡号不存在
System.out.println("您输入的卡号不存在,请重新输入");
}
System.out.print("请输入密码:");
String password = sc.next(); //用户输入的密码
//查看密码是否正确
if (!password.equals(loginAccount.getPassword())) {
//密码错误
System.out.println("密码错误");
return;
}
//密码正确
System.out.println("登陆成功");
//循环选择功能
while (true) {
//展示功能
System.out.println("===欢迎" + loginAccount.getName() + "使用ATM系统===");
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("请选择功能:");
String select = sc.next(); //获取用户的选择
//选择功能
switch (select) {
case "1":
//查询账户
show();
break;
case "2":
//存款
deposit();
break;
case "3":
//取款
withdraw();
break;
case "4":
//转账
transfer();
break;
case "5":
//修改密码
changePassword();
break;
case "6":
//退出账户
if (logout()) {
return;
}
break;
case "7":
//注销当前账户
if (cancelAccount()) {
return;
}
break;
default:
System.out.println("输入错误,请重新输入");
}
}
}
//开户功能
private void register() {
Random r = new Random();
System.out.println("===欢迎来到开户功能===");
System.out.print("请输入您的姓名:");
String name = sc.next(); //用户输入的姓名
String gender; //保存用户输入的性别
//循环输入性别
while (true) {
System.out.print("请输入您的性别:");
gender = sc.next();
//判断性别输入是否正确
if (!gender.equals("男") && !gender.equals("女")) {
//输入不正确
System.out.println("您输入的性别有误,请重新输入");
continue;
}
//输入正确
break;
}
String password; //保存用户输入的密码
while (true) {
System.out.print("请输入您的密码:");
password = sc.next();
System.out.print("请再次输入您的密码:");
String checkPassword = sc.next(); //用户第二次输入的密码
//比较两次输入的密码是否一致
if (!checkPassword.equals(password)) {
//不一致
System.out.println("两次密码不一致,请重新输入");
continue;
}
//一致
break;
}
System.out.print("请输入您每次取款的限额:");
double limit = sc.nextDouble(); //用户输入的每次取款限额
//随机创建不重复的卡号
String id = "";
//一直随机,直到随即到不重复的卡号
while (true) {
id = ""; //每次都把id置空
//生成8位数字卡号
for (int i = 0; i < 8; i++) {
id += r.nextInt(10);
}
//判断卡号是否存在
if (getAccountById(id) != null) {
//卡号存在则继续
continue;
}
//卡号不存在
Account account = new Account(name, gender, password, limit, id); //新建账户并赋值
acc.add(account); //把账户加入到列表中
System.out.println("账户" + name + "创建成功,您的卡号是:" + id + ",请妥善保管");
return;
}
}
//查询账户功能
private void show () {
System.out.println("===" + loginAccount.getName() + "账户内的信息如下===");
System.out.println("卡号:" + loginAccount.getId());
System.out.println("姓名:" + loginAccount.getName());
System.out.println("性别:" + loginAccount.getGender());
System.out.println("余额:" + loginAccount.getBalance());
System.out.println("每次取款限额:" + loginAccount.getLimit());
}
//存款功能
private void deposit () {
System.out.println("===欢迎" + loginAccount.getName() + "来到存款功能===");
System.out.print("请输入您要存钱的数量:");
double money = sc.nextDouble(); //用户要存钱的数量
loginAccount.setBalance(loginAccount.getBalance() + money); //修改账户的余额
System.out.println("存钱" + money + "元,当前的余额是" + loginAccount.getBalance() + "元");
}
//取款功能
private void withdraw () {
System.out.println("===欢迎" + loginAccount.getName() + "来到取款功能===");
double money; //用户要取钱的数量
//循环输入取钱数量
while (true) {
System.out.print("请输入您要取钱的数量:");
money = sc.nextDouble(); //用户要取钱的数量
//判断是否超过每次取款限额
if (money > loginAccount.getLimit()) {
//超过了
System.out.println("超过了每次取款限额(" + loginAccount.getLimit() + "元),请重新输入");
continue;
}
//没有超过
double balance = loginAccount.getBalance(); //用户当前的余额
//判断余额是否足够
if (money > balance) {
//余额不够
System.out.println("余额不足,当前余额为" + loginAccount.getBalance() + "元,请重新输入");
continue;
}
//余额足够
loginAccount.setBalance(loginAccount.getBalance() - money); //修改账户的余额
System.out.println("取钱" + money + "元,当前的余额是" + loginAccount.getBalance() + "元");
return;
}
}
//转账功能
private void transfer () {
System.out.println("===欢迎" + loginAccount.getName() + "来到取款功能===");
//判断系统中用户是否有两人或以上
if (acc.size() < 2) {
//如没有,则没法转账
System.out.println("系统中用户不足两人,请先开户");
return;
}
Account toAccount;
//循环转账
while (true) {
System.out.print("请输入转入账户的卡号:");
String id = sc.next();
//判断卡号是否存在
toAccount = getAccountById(id);
if (toAccount != null) {
//卡号存在
break;
}
//卡号不存在
System.out.println("卡号不存在,请重新输入");
}
//循环让用户验证转入账户户主姓氏
while (true) {
String name = toAccount.getName("名字").substring(1); //将转入账户户主姓氏用*替换
System.out.println("请输入对方用户的姓氏:*" + name); //输出替换后的姓名
String familyName = sc.next();
//判断输入姓氏是否正确
if (toAccount.getName().startsWith(familyName)) {
//正确
break;
}
//错误
System.out.println("您输入的姓氏有误,请重新输入");
}
//循环判断余额是否足够
while (true) {
System.out.print("请输入您要转账的金额:");
double money = sc.nextDouble();
if (money <= loginAccount.getBalance()) {
//余额足够,完成转账操作
loginAccount.setBalance(loginAccount.getBalance() - money); //当前登录用户余额减少
System.out.println("当前的余额是" + loginAccount.getBalance() + "元");
toAccount.setBalance(toAccount.getBalance() + money); //转入账户余额增加
break;
}
//余额不够
System.out.println("余额不足,当前余额为" + loginAccount.getBalance() + "元,请重新输入");
}
}
//修改密码功能
private void changePassword () {
//循环输入当前密码
while (true) {
System.out.print("请输入您的旧密码:");
String oldPassword = sc.next();
if (oldPassword.equals(loginAccount.getPassword())) {
//密码正确
break;
}
System.out.println("密码错误,请重新输入");
}
//密码正确,输入新密码
while (true) {
System.out.print("请输入您的新密码:");
String newPassword = sc.next();
System.out.print("请再次输入您的新密码:");
String checkNewPassword = sc.next();
if (!newPassword.equals(checkNewPassword)) {
//两次输入不一样
System.out.println("两次密码不一致,请重新输入");
continue;
}
//两次输入一样,更新密码
loginAccount.setPassword(newPassword);
System.out.println("修改密码成功");
break;
}
}
//退出账户功能
private boolean logout () {
System.out.println("请确认是否要退出登录?确定退出输入y,取消退出输入其他任意字符");
String logout = sc.next();
switch (logout) {
case "y":
//确定退出返回true
System.out.println("账号" + loginAccount.getName(" ") + "已退出");
return true;
default:
//不退出返回false
return false;
}
}
//注销当前账户功能
private boolean cancelAccount () {
System.out.println("请确认是否要注销当前账户?确定退出输入y,取消退出输入其他任意字符");
String cancel = sc.next();
//若确定注销
if (cancel.equals("y")) {
//判断账户中是否还有余额
if (loginAccount.getBalance() != 0) {
//还有余额,不能注销
System.out.println("当前账户还有余额,请取出后再注销");
} else {
//没有余额,执行注销操作
acc.remove(loginAccount); //从账户列表中移除账户对象
System.out.println("账号" + loginAccount.getName(" ") + "注销成功");
return true; //注销成功返回true
}
}
return false; //否则返回false
}
//使用id获取账户对象
private Account getAccountById (String id){
//遍历账户列表
for (int i = 0; i < acc.size(); i++) {
if (acc.get(i).getId().equals(id)) {
//存在此id的账户则返回该账户
return acc.get(i);
}
}
//不存在此id的账户则返回null
return null;
}
}
Run类
package com.zgg1h.ATM;
public class Run {
public static void main(String[] args) {
ATM atm = new ATM(); //实例化ATM类
atm.start(); //启动系统
}
}

浙公网安备 33010602011771号