目录
一、ATM项目技术
二、能达成的能力
三、开始编码
3.1 系统架构搭建、欢迎页设计
3.1.1 Account
3.1.2 ATM
3.1.3 Test
3.2 开户功能实现
3.2.1 修改AccountgetUserName()
3.2.2 ATM 开户操作
3.2.3 ATM为新用户生成一个随机卡号编辑
3.3 登录功能实现
3.4 操作页展示、查询账户、退出账户
3.5 存款、取款功能实现
3.6 转账功能实现
3.7 销户功能实现
3.8 用户密码修改
前言:通过前面的基础学习,依据入门java了,通过本实战项目来巩固和检验学习成果
一、ATM项目技术
二、能达成的能力
三、开始编码
3.1 系统架构搭建、欢迎页设计
3.1.1 Account
package com.run;
public class Account {
private String cardId;
private String userName;
private char sex;
private String password;
private double money;
private double limit;
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
3.1.2 ATM
package com.run;
import java.util.ArrayList;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
/**
* 启动ATM系统 展示欢迎页面
*/
public void start(){
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
break;
case 2:
// 用户开户
break;
default:
System.out.println("没有该操作~~~");
}
}
}
}
3.1.3 Test
package com.run;
public class Test {
public static void main(String[] args) {
// 1 创建一个ATM对象,代表ATM系统
ATM atm = new ATM();
// 2 调用ATM的start方法,启动系统
atm.start();
}
}
3.2 开户功能实现
3.2.1 修改AccountgetUserName()
package com.run;
public class Account {
private String cardId;
private String userName;
private char sex;
private String password;
private double money;
private double limit;
public String getCardId() {
return cardId;
}
public void setCardId(String cardId) {
this.cardId = cardId;
}
public String getUserName() {
return userName + ( sex == '男' ? "先生" : "女士");
}
public void setUserName(String userName) {
this.userName = userName;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public double getLimit() {
return limit;
}
public void setLimit(double limit) {
this.limit = limit;
}
}
3.2.2 ATM 开户操作
package com.run;
import java.util.ArrayList;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
/**
* 启动ATM系统 展示欢迎页面
*/
public void start(){
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command){
case 1:
// 用户登录
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 开户操作
*/
private void createAccount(){
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if(sex == '男' || sex == '女'){
account.setSex(sex);
break;
}else{
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if(okPassword.equals(password)){
account.setPassword(okPassword);
break;
}else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + "" );
}
}
3.2.3 ATM为新用户生成一个随机卡号
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.3 登录功能实现
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.4 操作页展示、查询账户、退出账户
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后账户信息
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
loginAcc = acc; //记住登录后账户信息
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
// 展示登录后的操作页面
showUserCommand();
return; // 跳出当前登录方法
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/** 展示登录后的操作页面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "== 您可以选择如下功能进行账户的处理 ==");
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( "请选择:");
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
//存款
break;
case 3:
//取款
break;
case 4:
//转账
break;
case 5:
//密码修改
break;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return; // 结束当前方法
case 7:
//注销当前账户
break;
default:
// 非法输入
System.out.println("您输入的操作是不存在");
}
}
}
/**
展示当前登录账户信息
*/
private void showLoginAccount(){
System.out.println("== 当前登录信息如下: ==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.5 存款、取款功能实现
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后账户信息
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
loginAcc = acc; //记住登录后账户信息
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
// 展示登录后的操作页面
showUserCommand();
return; // 跳出当前登录方法
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/** 展示登录后的操作页面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "== 您可以选择如下功能进行账户的处理 ==");
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( "请选择:");
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
depositMoney();
//存款
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
break;
case 5:
//密码修改
break;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return; // 结束当前方法
case 7:
//注销当前账户
break;
default:
// 非法输入
System.out.println("您输入的操作是不存在");
}
}
}
/** 取钱 */
private void drawMoney() {
System.out.println("== 取钱操作 ==");
// 1 判断账户余额是否达到100元,如果不够100元,不让用户取款
if(loginAcc.getMoney() < 100){
System.out.println("您的余额不足100元,不允许取钱~~~");
return;
}
// 2 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3 判断账户余额是否足够
if(loginAcc.getMoney() >= money){
// 4 取款金额不能操作当日限额
if(money > loginAcc.getLimit()){
System.out.println("请您输入取款金额超过了每次限额,每次最多可取:" + loginAcc.getLimit());
}else{
//可以取钱了
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款:" + money + " 成功,取款后,余额为:" + loginAcc.getMoney());
break;
}
}else{
System.out.println("余额不足,您的账户中的余额是:" + loginAcc.getMoney());
}
}
}
/** 存钱 */
private void depositMoney() {
System.out.println("== 存钱操作 ==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前账户余额
loginAcc.setMoney(money + loginAcc.getMoney());
System.out.println("恭喜您存钱:" + money + " 成功,存款之后,余额为:" + loginAcc.getMoney());
}
/**
展示当前登录账户信息
*/
private void showLoginAccount(){
System.out.println("== 当前登录信息如下: ==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.6 转账功能实现
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后账户信息
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
loginAcc = acc; //记住登录后账户信息
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
// 展示登录后的操作页面
showUserCommand();
return; // 跳出当前登录方法
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/** 展示登录后的操作页面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "== 您可以选择如下功能进行账户的处理 ==");
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( "请选择:");
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
depositMoney();
//存款
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
transferMoney();
break;
case 5:
//密码修改
break;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return; // 结束当前方法
case 7:
//注销当前账户
break;
default:
// 非法输入
System.out.println("您输入的操作是不存在");
}
}
}
/** 转账 */
private void transferMoney() {
System.out.println("== 用户转账 ==");
// 1 判断系统中是否存在其他账户
if(accounts.size() < 2){
System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");
return;
}
// 2 判断自己的账户是否有钱
if(loginAcc.getMoney() == 0){
System.out.println("您的账户余额为0,无法转账");
return;
}
// 3 开始转账
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
// 4 判断卡号是否正确
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的对方卡号不存在~~");
}else{
// 对方卡号存在,继续让用户认证姓氏
String name = "*" + acc.getUserName().substring(1); //从第1位开始截取
System.out.println("请您输入 【" + name + "】姓氏");
String preName = sc.next();
// 5 判断这个姓氏是否正确
if(acc.getUserName().startsWith(preName)){
// 认证通过
while (true) {
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
// 6 判断这个金额是否超过自己余额
if(loginAcc.getMoney() >= money){
//转给对方
// 7 更新自己的账户余额和对方的余额
loginAcc.setMoney(loginAcc.getMoney() - money);
acc.setMoney(acc.getMoney() + money);
System.out.println("转账成功,本次转账:" + money +"当前余额为:" + loginAcc.getMoney());
return; // 跳出转账方法
}else {
System.out.println("对不起您余额不足,您的余额为:" + loginAcc.getMoney());
}
}
}else{
System.out.println("对不起,您认证的姓氏有问题~~");
}
}
}
}
/** 取钱 */
private void drawMoney() {
System.out.println("== 取钱操作 ==");
// 1 判断账户余额是否达到100元,如果不够100元,不让用户取款
if(loginAcc.getMoney() < 100){
System.out.println("您的余额不足100元,不允许取钱~~~");
return;
}
// 2 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3 判断账户余额是否足够
if(loginAcc.getMoney() >= money){
// 4 取款金额不能操作当日限额
if(money > loginAcc.getLimit()){
System.out.println("请您输入取款金额超过了每次限额,每次最多可取:" + loginAcc.getLimit());
}else{
//可以取钱了
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款:" + money + " 成功,取款后,余额为:" + loginAcc.getMoney());
break;
}
}else{
System.out.println("余额不足,您的账户中的余额是:" + loginAcc.getMoney());
}
}
}
/** 存钱 */
private void depositMoney() {
System.out.println("== 存钱操作 ==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前账户余额
loginAcc.setMoney(money + loginAcc.getMoney());
System.out.println("恭喜您存钱:" + money + " 成功,存款之后,余额为:" + loginAcc.getMoney());
}
/**
展示当前登录账户信息
*/
private void showLoginAccount(){
System.out.println("== 当前登录信息如下: ==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.7 销户功能实现
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后账户信息
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
loginAcc = acc; //记住登录后账户信息
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
// 展示登录后的操作页面
showUserCommand();
return; // 跳出当前登录方法
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/** 展示登录后的操作页面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "== 您可以选择如下功能进行账户的处理 ==");
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( "请选择:");
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
depositMoney();
//存款
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
transferMoney();
break;
case 5:
//密码修改
break;
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return; // 结束当前方法
case 7:
//注销当前账户
if(deleteAccount()){
//销户成功,回到欢迎界面
return;//跳出方法, 到欢迎页面
};
break;
default:
// 非法输入
System.out.println("您输入的操作是不存在");
}
}
}
/** 销户 */
private boolean deleteAccount() {
System.out.println("== 销户操作 ==");
// 1 询问用户是否确定要销户
System.out.println("请问您确认销户吗? y/n");
String command = sc.next();
switch (command){
case "y":
// 确实销户
// 2 判断账户是否有钱
if(loginAcc.getMoney() == 0){
//真的销户
accounts.remove(loginAcc);
System.out.println("您好!您的账户已成功销户~~~");
return true;
}else{
System.out.println("对不起,您的账户中存在金额,不允许销户~~~");
return false;
}
default:
System.out.println("好的,您的账户保留~~");
return false;
}
}
/** 转账 */
private void transferMoney() {
System.out.println("== 用户转账 ==");
// 1 判断系统中是否存在其他账户
if(accounts.size() < 2){
System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");
return;
}
// 2 判断自己的账户是否有钱
if(loginAcc.getMoney() == 0){
System.out.println("您的账户余额为0,无法转账");
return;
}
// 3 开始转账
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
// 4 判断卡号是否正确
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的对方卡号不存在~~");
}else{
// 对方卡号存在,继续让用户认证姓氏
String name = "*" + acc.getUserName().substring(1); //从第1位开始截取
System.out.println("请您输入 【" + name + "】姓氏");
String preName = sc.next();
// 5 判断这个姓氏是否正确
if(acc.getUserName().startsWith(preName)){
// 认证通过
while (true) {
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
// 6 判断这个金额是否超过自己余额
if(loginAcc.getMoney() >= money){
//转给对方
// 7 更新自己的账户余额和对方的余额
loginAcc.setMoney(loginAcc.getMoney() - money);
acc.setMoney(acc.getMoney() + money);
System.out.println("转账成功,本次转账:" + money +"当前余额为:" + loginAcc.getMoney());
return; // 跳出转账方法
}else {
System.out.println("对不起您余额不足,您的余额为:" + loginAcc.getMoney());
}
}
}else{
System.out.println("对不起,您认证的姓氏有问题~~");
}
}
}
}
/** 取钱 */
private void drawMoney() {
System.out.println("== 取钱操作 ==");
// 1 判断账户余额是否达到100元,如果不够100元,不让用户取款
if(loginAcc.getMoney() < 100){
System.out.println("您的余额不足100元,不允许取钱~~~");
return;
}
// 2 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3 判断账户余额是否足够
if(loginAcc.getMoney() >= money){
// 4 取款金额不能操作当日限额
if(money > loginAcc.getLimit()){
System.out.println("请您输入取款金额超过了每次限额,每次最多可取:" + loginAcc.getLimit());
}else{
//可以取钱了
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款:" + money + " 成功,取款后,余额为:" + loginAcc.getMoney());
break;
}
}else{
System.out.println("余额不足,您的账户中的余额是:" + loginAcc.getMoney());
}
}
}
/** 存钱 */
private void depositMoney() {
System.out.println("== 存钱操作 ==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前账户余额
loginAcc.setMoney(money + loginAcc.getMoney());
System.out.println("恭喜您存钱:" + money + " 成功,存款之后,余额为:" + loginAcc.getMoney());
}
/**
展示当前登录账户信息
*/
private void showLoginAccount(){
System.out.println("== 当前登录信息如下: ==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}
3.8 用户密码修改
package com.run;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts = new ArrayList<>();//[]
private Scanner sc = new Scanner(System.in);
private Account loginAcc; // 记住登录后账户信息
/**
* 启动ATM系统 展示欢迎页面
*/
public void start() {
while (true) {
System.out.println("===欢迎您进入到中信银行ATM系统===");
System.out.println("1、 用户登录");
System.out.println("2、 用户开户");
System.out.println("请选择:");
int command = sc.nextInt();
switch (command) {
case 1:
// 用户登录
login();
break;
case 2:
// 用户开户
createAccount();
break;
default:
System.out.println("没有该操作~~~");
}
}
}
/**
* 登录操作
*/
private void login(){
System.out.println("== 系统登录操作 ==");
// 1、 判断系统是否存在账户对象,如果不存在,结束登录操作
if(accounts.size() ==0 ){
System.out.println("== 系统无任何账户!请选开户 ==");
return; //跳出登录
}
// 2、 系统中存在账户对象
while (true) {
System.out.println("== 请输入您登录的卡号 ==");
String cardId = sc.next();
// 3 判断这个卡号是否存在
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的登录卡号不存在!请确认~~~");
}else{
while (true) {
// 卡号存在
System.out.println("== 请输入您登录的密码 ==");
String password = sc.next();
//判断密码是否正确, 之前的判断卡号直接返回了这个对象,所以使用acc.
if(acc.getPassword().equals(password)){
loginAcc = acc; //记住登录后账户信息
// 密码正确,登录成功
System.out.println("恭喜您" + acc.getUserName() + " 登录系统成功,您的卡号是" + acc.getCardId());
// 展示登录后的操作页面
showUserCommand();
return; // 跳出当前登录方法
}else {
System.out.println("您输入的密码错误!请确认~~~");
}
}
}
}
}
/** 展示登录后的操作页面*/
private void showUserCommand(){
while (true) {
System.out.println(loginAcc.getUserName() + "== 您可以选择如下功能进行账户的处理 ==");
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( "请选择:");
int command = sc.nextInt();
switch (command){
case 1:
//查询操作
showLoginAccount();
break;
case 2:
depositMoney();
//存款
break;
case 3:
//取款
drawMoney();
break;
case 4:
//转账
transferMoney();
break;
case 5:
//密码修改
updataPassword();
return; //跳出方法, 到欢迎页面
case 6:
//退出
System.out.println(loginAcc.getUserName() + "您退出系统成功!");
return; // 结束当前方法
case 7:
//注销当前账户
if(deleteAccount()){
//销户成功,回到欢迎界面
return;//跳出方法, 到欢迎页面
};
break;
default:
// 非法输入
System.out.println("您输入的操作是不存在");
}
}
}
/** 修改密码 */
private void updataPassword() {
System.out.println("== 修改密码操作 ==");
// 1 提醒用户认证当中密码
while (true) {
System.out.println("请您输入当前账户的密码");
String password = sc.next();
// 2 认证当前密码是否正确
if (loginAcc.getPassword().equals(password)) {
// 认证通过
while (true) {
// 3 真正修改密码
System.out.println("请您输入新密码:");
String newPassword = sc.next();
System.out.println("请您再次输入确认密码:");
String okPassword = sc.next();
if(okPassword.equals(newPassword)){
// 可以真正修改密码
loginAcc.setPassword(okPassword);
System.out.println("恭喜你!密码修改成功,请重新登录~~~");
return; //跳出方法~
}else {
System.out.println("您输入的两次密码不一致~~~");
}
}
}else {
// 认证不通过
System.out.println("请当前输入的密码不正确~~~");
}
}
}
/** 销户 */
private boolean deleteAccount() {
System.out.println("== 销户操作 ==");
// 1 询问用户是否确定要销户
System.out.println("请问您确认销户吗? y/n");
String command = sc.next();
switch (command){
case "y":
// 确实销户
// 2 判断账户是否有钱
if(loginAcc.getMoney() == 0){
//真的销户
accounts.remove(loginAcc);
System.out.println("您好!您的账户已成功销户~~~");
return true;
}else{
System.out.println("对不起,您的账户中存在金额,不允许销户~~~");
return false;
}
default:
System.out.println("好的,您的账户保留~~");
return false;
}
}
/** 转账 */
private void transferMoney() {
System.out.println("== 用户转账 ==");
// 1 判断系统中是否存在其他账户
if(accounts.size() < 2){
System.out.println("当前系统中只有你一个账户,无法为其他账户转账~~");
return;
}
// 2 判断自己的账户是否有钱
if(loginAcc.getMoney() == 0){
System.out.println("您的账户余额为0,无法转账");
return;
}
// 3 开始转账
while (true) {
System.out.println("请您输入对方的卡号:");
String cardId = sc.next();
// 4 判断卡号是否正确
Account acc = getAccountByCardId(cardId);
if(acc == null){
System.out.println("您输入的对方卡号不存在~~");
}else{
// 对方卡号存在,继续让用户认证姓氏
String name = "*" + acc.getUserName().substring(1); //从第1位开始截取
System.out.println("请您输入 【" + name + "】姓氏");
String preName = sc.next();
// 5 判断这个姓氏是否正确
if(acc.getUserName().startsWith(preName)){
// 认证通过
while (true) {
System.out.println("请您输入转账给对方的金额:");
double money = sc.nextDouble();
// 6 判断这个金额是否超过自己余额
if(loginAcc.getMoney() >= money){
//转给对方
// 7 更新自己的账户余额和对方的余额
loginAcc.setMoney(loginAcc.getMoney() - money);
acc.setMoney(acc.getMoney() + money);
System.out.println("转账成功,本次转账:" + money +"当前余额为:" + loginAcc.getMoney());
return; // 跳出转账方法
}else {
System.out.println("对不起您余额不足,您的余额为:" + loginAcc.getMoney());
}
}
}else{
System.out.println("对不起,您认证的姓氏有问题~~");
}
}
}
}
/** 取钱 */
private void drawMoney() {
System.out.println("== 取钱操作 ==");
// 1 判断账户余额是否达到100元,如果不够100元,不让用户取款
if(loginAcc.getMoney() < 100){
System.out.println("您的余额不足100元,不允许取钱~~~");
return;
}
// 2 让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money = sc.nextDouble();
// 3 判断账户余额是否足够
if(loginAcc.getMoney() >= money){
// 4 取款金额不能操作当日限额
if(money > loginAcc.getLimit()){
System.out.println("请您输入取款金额超过了每次限额,每次最多可取:" + loginAcc.getLimit());
}else{
//可以取钱了
loginAcc.setMoney(loginAcc.getMoney() - money);
System.out.println("您取款:" + money + " 成功,取款后,余额为:" + loginAcc.getMoney());
break;
}
}else{
System.out.println("余额不足,您的账户中的余额是:" + loginAcc.getMoney());
}
}
}
/** 存钱 */
private void depositMoney() {
System.out.println("== 存钱操作 ==");
System.out.println("请您输入存款金额:");
double money = sc.nextDouble();
// 更新当前账户余额
loginAcc.setMoney(money + loginAcc.getMoney());
System.out.println("恭喜您存钱:" + money + " 成功,存款之后,余额为:" + loginAcc.getMoney());
}
/**
展示当前登录账户信息
*/
private void showLoginAccount(){
System.out.println("== 当前登录信息如下: ==");
System.out.println("卡号:" + loginAcc.getCardId());
System.out.println("户主:" + loginAcc.getUserName());
System.out.println("性别:" + loginAcc.getSex());
System.out.println("余额:" + loginAcc.getMoney());
System.out.println("每次取现额度:" + loginAcc.getLimit());
}
/**
* 开户操作
*/
private void createAccount() {
System.out.println("== 系统开户操作 ==");
// 1 创建一个账户对象,用于封装用户的开户信息
Account account = new Account();
// 2 需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name = sc.next();
account.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0); //"男"
if (sex == '男' || sex == '女') {
account.setSex(sex);
break;
} else {
System.out.println("您输入的性别有误,只能是男或者女~~~");
}
}
while (true) {
System.out.println("请您输入您的密码:");
String password = sc.next();
System.out.println("请您输入您的确认密码:");
String okPassword = sc.next();
if (okPassword.equals(password)) {
account.setPassword(okPassword);
break;
} else {
System.out.println("您输入的两次密码不一致,请您确认~~");
}
}
System.out.println("请您输入您的取现额度:");
double limit = sc.nextDouble();
account.setLimit(limit);
// 重点 我们要为这个账户生成一个卡号,8位数字,不能重复
String newCardId = createCardId();
account.setCardId(newCardId);
// 3 把这个账户对象,存入账户集合
accounts.add(account);
System.out.println("恭喜您," + account.getUserName() + "开户成功,您的卡号是:" + account.getCardId());
}
// 设计一个新方法,返回一个8位数字卡号,不能重复
private String createCardId() {
while (true) {
// 1 定义一个记住8位数字的卡号
String cardId = "";
Random r = new Random();
// 2 循环8次每次产生一个随机0-9的数字,然后连接起来组成卡号
for (int i = 0; i < 8; i++) {
int data = r.nextInt(10); //0-9
cardId += data;
}
// 3 判断cardId 与其他卡号是否重复
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明此卡号没有重复
return cardId;
}
}
}
// 根据卡号cardId查询账户对象返回 accounts
private Account getAccountByCardId(String cardId){
for (int i = 0; i < accounts.size(); i++) {
Account acc = accounts.get(i);
// 判断这个账户对象的acc中卡号是不是我们要找的对象
if (acc.getCardId().equals(cardId)){
return acc;// 直接返回了这个对象
}
}
return null;//查无此账户,这个卡号不存在
}
}