package com.ATMdemo;
public class Test {
public static void main(String[] args) {
ATM atm=new ATM();
atm.start();
}
}
package com.ATMdemo;
public class Account {
private String carId;
private String userName;
private char sex;
private String passWord;
private double money;
private double limit;//限额
public String getCarId() {
return carId;
}
public void setCarId(String carId) {
this.carId = carId;
}
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;
}
}
package com.ATMdemo;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
public class ATM {
private ArrayList<Account> accounts=new ArrayList<>();
private Account loginAcc;//记住登录后的用户账户
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("===系统登录===");
//判断系统中是否存在账户用户对象,存在才能登录,如果不存在,我们直接结束登录操作
if (accounts.size()==0){
return;//跳出登录
}
//系统中存在账户对象,可以开始操作’
while (true) {
System.out.println("请您输入您的登录卡号:");
String carId=sc.next();
//判断卡号是否存在
Account acc=getAccountByCardId(carId);
if (acc==null){
//返回null说明卡号不存在
System.out.println("卡号不存在");
}else {
while (true) {
//卡号存在,接着输入密码
System.out.println("请您输入登录密码:");
String passWord=sc.next();
//判断密码是否正确
if (acc.getPassWord().equals(passWord)){
loginAcc=acc;
//密码正确登录成功
System.out.println("恭喜您,"+acc.getUserName()+"成功登录系统,您的卡号是:"+acc.getCarId());
//展示登录后的页面了
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:
upadtePassWord();//修改密码
return;
case 6:
System.out.println(loginAcc.getUserName()+"您退出系统成功。");//退出
return;//跳出
case 7:
if (deleteAccount()) {
//销户成功返回欢迎界面
return;
}
break;
default:
System.out.println("您当前选择的操作不存在");
}
}
}
//修改密码
private void upadtePassWord() {
System.out.println("===修改密码操作===");
//提醒用户认证当前密码
while (true) {
System.out.println("请您输入当前账户密码:");
String passWord=sc.next();
//认证当前密码是否正确
if (loginAcc.getPassWord().equals(passWord)){
//认证通过
//开始修改密码
while (true) {
System.out.println("请您输入新密码:");
String newPassWord=sc.next();
System.out.println("请您确认一次新密码:");
String okpassWord=sc.next();
//判断2次密码是否一致
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("===进行销户操作===");
System.out.println("请问您确认销户吗?y/n");
String command=sc.next();
switch (command){
case "y":
//确认要销户
//判断是否账户有钱
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("===转账操作===");
//判断系统中是否存在其他账户
if (accounts.size()<2){
System.out.println("当前系统中只有你一个账户,无法为其他账户转账");
return;
}
//判断账户中是否有钱
if (loginAcc.getMoney()==0){
System.out.println("账户没钱可转");
return;
}
//可以转钱
while (true) {
System.out.println("请输入对方的卡号:");
String carID=sc.next();
//判断卡号是否存在
Account acc=getAccountByCardId(carID);
if (acc==null){
System.out.println("您输入卡号不存在");
}else {
//对方卡号存在,让用户认证
String name="*"+acc.getUserName().substring(1);
System.out.println("请您输入【"+name+"】姓氏");
String paeName=sc.next();
if (acc.getUserName().startsWith(paeName)){
//认证通过
while (true) {
System.out.println("请您输入转账金额:");
double money=sc.nextDouble();
//判断这个金额是否有没有超过自己的金额
if (loginAcc.getMoney()>=money){
//转账
//更新自己账号金额
loginAcc.setMoney(loginAcc.getMoney()-money);
//更新对方金额
acc.setMoney(acc.getMoney()+money);
return;//结束
}else {
System.out.println("您余额不足,无法转钱,最多可转:"+loginAcc.getMoney());
}
}
}else {
System.out.println("您认证的姓氏有问题");
}
}
}
}
//取款
private void drawmoney() {
System.out.println("===取款操作===");
//判断账户余额是否达到了100元
if (loginAcc.getMoney()<100){
System.out.println("您的账户余额不足100元,不允许取钱");
return;
}
//让用户输入取款金额
while (true) {
System.out.println("请您输入取款金额:");
double money=sc.nextDouble();
//判断账户余额是否足够
if (loginAcc.getMoney()>=money){
//账户中金额足够
//判断当前取款金额是否超过了每次限额
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(loginAcc.getMoney()+money);
System.out.println("恭喜您,您存钱:"+money+"成功,存钱后余额为:"+loginAcc.getMoney());
}
//展示当前登录的账户信息
private void showLoginAccount(){
System.out.println("===当前您的账户信息如下===");
System.out.println("卡号:"+loginAcc.getCarId());
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("===系统开户操作===");
//创造一个账户对象,用封装用户的开户信息
Account acc=new Account();
//需要用户输入自己的开户信息,赋值给账户对象
System.out.println("请您输入您的账户名称:");
String name=sc.next();
acc.setUserName(name);
while (true) {
System.out.println("请您输入您的性别:");
char sex = sc.next().charAt(0);//"男"
if (sex=='男' || sex=='女'){
acc.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)){
acc.setPassWord(okpassWord);
break;
}else {
System.out.println("您输入的2次密码不一致,请重新输入");
}
}
System.out.println("请您输入您的取现额度:");
double limit=sc.nextDouble();
acc.setLimit(limit);
//重点:我们需要为这个账户生成一个卡号(由系统自动生成,8位数字表示,不能与其他账户的卡号重复)
String newCarId=createCarId();
acc.setCarId(newCarId);
//把这个账户的对象,存入到账户集合中去
accounts.add(acc);
System.out.println("恭喜您,"+acc.getUserName()+"开户成功,您的卡号是:"+acc.getCarId());
}
//返回一个8位数字的卡号,而且这个卡号不能与其他账户重复
private String createCarId(){
//定义一个String类型的变量记住8位数字作为一个卡号
while (true) {
String carId="";
//使用循环、循环8次,每次产生一个随机数给carId连接起来
Random r=new Random();
for (int i = 0; i < 8; i++) {
int data=r.nextInt(10);//0-9
carId+=data;
}
//判断carId中记住的卡号,是否与其他账户卡号重复,没有重复才可以作为一个新卡号
Account acc=getAccountByCardId(carId);
if (acc==null){
//没有找到账户对象,没有重复,可以作为新卡号
return carId;
}
}
}
//根据卡号查询账户对象返回
private Account getAccountByCardId(String cardId){
//遍历全部账户对象
for (int i = 0; i < accounts.size(); i++) {
Account acc=accounts.get(i);
//判断这个账户对象acc中的卡号是否是我们要找的卡号
if (acc.getCarId().equals(cardId)){
return acc;
}
}
return null;//查无此账户,这个卡号不存在
}
}