思路
ATM机类:
import java.util.Scanner;
//一个ATM机对应一家银行
public class ATM {
private Bank bank;//可通过它调用bank里的方法
private int choice=0;
private String id;
private String passwd;
private boolean flag=true;//关机标志
public ATM() {
// 初始化
this.bank = new Bank("中国银行");//new ATM时通过ATM()把bank初始化,bank初始化里把bankCard也初始化了
}
//核心方法
public void start() {
// 开机
System.out.println("欢迎使用中国银行ATM机");
while(flag) {
System.out.println(" 1.注册 2.登录 3.关机");// 界面
//重复部分可复用
input(1);
judge(choice);
}
System.out.println("正在关机...");
}
//私有方法 ,仅能在start()函数里自己调用
//输入判断
private void judge(int choice) {
switch (choice) {
case 1:
input(2);
register();
break;// 记得写以跳出case语句,不然顺序往下执行
case 2:
input(2);
login();
break;
case 3:
flag=false;//关机,不循环了
break;
default:// 不匹配才执行这里
System.out.println("请输入正确数字(1或2或3)");// 界面
}
}
//注册
private void register() {
//若为新用户,存用户信息到银行,提示成功
// TODO Auto-generated method stub
if (bank.find(id)) {
//if (bank.search(id)==null) {
System.out.println("用户已注册,请重试");//不应该输1重新进入注册
judge(1);
} else {
bank.add(id, passwd);
System.out.println("注册成功!");
}
}
//登录
private void login() {
//账号 密码匹配,提示成功,输出卡信息
// TODO Auto-generated method stub
// 银行名和钱数???????????????????????????
if (!bank.find(id) || !passwd.equals(bank.getPassWd(id))) {
//if (bank.search(id)==null || !passwd.equals(bank.getPassWd(id))) {
System.out.println("账号或密码错误");
judge(2);
} else {
bussiness(id);
}
}
//登陆成功后业务
private void bussiness(String id) {
int index=bank.findIndex(id);//获取银行卡下标
//也可以return BankCard类型的卡,下面程序用user代替userCards[i]
// BankCard user=bank.search(id);
do{
System.out.println("1.取款2.存款3.转账 4.查余额 5.改密码 6.退卡");//每执行一遍给一个提示
input(1);
switch (choice){
case 1:
bank.withdraw(index);
//bank.withdraw(user);
break;
case 2:
bank.deposit(index);
//bank.deposit(user);
break;
case 3:
bank.transfer(index);
//bank.transfer(user);
break;
case 4:
bank.inquire(index);
//bank.inquire(user);
break;
case 5:
bank.setPasswd(index);
//bank.setPasswd(user);
break;
case 6:
System.out.println("欢迎下次光临");
break;
default:// 不匹配才执行这里
System.out.println("选择有误,请重新选择:");
}
}while(choice!=6);
}
private void input(int num){
//num,需要读入的参数个数
Scanner scan = new Scanner(System.in);
if(num==1) {
choice = scan.nextInt();
}else if(num==2) {
System.out.println("请输入账号和密码:");
id = scan.next();
passwd = scan.next();
}
//scan.close(); //关闭输入流,不能再通过new Scanner(System.in)来创建Scnaner对象了
}
}
Bank类
import java.util.Arrays;
import java.util.Scanner;
//存信息
public class Bank {
//每new一个Bank类,多有一份Bank类的成员变量
private String bankName;
private BankCard[] userCards;//卡类型的一维数组 可通过它调用卡信息
private int size=0;//有效银行卡的个数 全局变量
private int index=-1;//存放银行卡下标。免得每次遍历找
//pubilc 可在ATM类里调用该方法
public Bank(String bankName) {
//初始化
this.bankName=bankName;
userCards=new BankCard[10];//先给10个,扩容参考MyArrayList
}
//尾插
public void add(String id,String passwd ) {
if(size == userCards.length) {
userCards=Arrays.copyOf(userCards,userCards.length*2);
}
userCards[size++]=new BankCard(passwd,id);
}
// //也可以把find函数改进为return BankCard,有就不为空
// public BankCard search(String id) {
// for(int i=0;i<size;i++) {
// if(id.equals(userCards[i].getId()))
// return userCards[i];
// }
// return null;
// }
//找用户,有就true
public boolean find(String id) {
boolean flag=false;//默认没有
for(int i=0;i<size;i++) {
if(id.equals(userCards[i].getId()))
flag= true;
break;
}
return flag;
}
//找银行卡下标
public int findIndex(String id) {
for(int i=0;i<size;i++) {
if(id.equals(userCards[i].getId()))
index=i;
break;
}
return index;
}
public String getBankName() {
return bankName;
}
public String getPassWd(String id) {
//大写W,是银行的方法
String Passwd=null;
for(int i=0;i<size;i++) {
//找到id对应的下标
if(id.equals(userCards[i].getId())){
Passwd=userCards[i].getPasswd();//小写w,是银行卡的方法
break;
}
}
return Passwd;
}
//取钱
public void withdraw(int index) {
double count=enter_Count();
userCards[index].SetMoney(-count);//负数
System.out.println("请取走您的现金");
}
//存钱
public void deposit(int index) {
System.out.println("请将钞票叠放整齐:");
Scanner scan = new Scanner(System.in);
double tmp = scan.nextInt();//只认整钱
userCards[index].SetMoney(tmp);
System.out.println("正在点钞,请稍后。。。\n存款成功");
}
//转账
public void transfer(int index) {
int select =0;
//合法id 和 金额
String account=enter_Account(index);
double count=enter_Count();
System.out.println("确认给"+account+"转账"+count+"元吗?\n输入:1:确认 2:退出");
if(select==1) {
userCards[index].SetMoney(-count);
userCards[findIndex(account)].SetMoney(count);
}
}
//查余额
public void inquire(int index) {
//历史交易记录???????????
double money=userCards[index].getMoney();
System.out.println("余额为:"+money+"元");
}
//判断金额够就返回true
public boolean analyze(double tmp) {
boolean flag=true;
if(tmp>userCards[index].getMoney())
flag=false;
return flag;
}
//输入正确金额
public double enter_Count() {
Scanner scan = new Scanner(System.in);
int select=0;
double tmp=0;
do {
System.out.println("请输入正确金额:");
tmp = scan.nextInt();//只认整钱
}while(!analyze(tmp));//避免余额不足
System.out.println("请再次确认金额数。输入1:确认 2:修改");
select = scan.nextInt();
if(select==2) {
do {
System.out.println("请输入正确金额:");
tmp = scan.nextInt();
}while(!analyze(tmp));
}
return tmp;
}
// 输入正确账户
public String enter_Account(int index) {
Scanner scan = new Scanner(System.in);
int select = 0;
String tmp = null;
do {
System.out.println("请输入正确账户(id):");
tmp = scan.next();
} while (!find(tmp) && !tmp.equals(userCards[index].getId()));//有用户 且 不能是 自己
System.out.println("请再次确认账户(id):"+tmp+"。输入1:确认 2:修改");
select = scan.nextInt();
if (select == 2) {
do {
System.out.println("请输入正确账户(id):");
tmp = scan.next();
} while (!find(tmp));
}
return tmp;
}
//修改密码
public void setPasswd(int index) {
Scanner scan = new Scanner(System.in);
int select = 0;
String tmp1 = null;
String tmp2 = null;
do {
System.out.println("请输入新密码:");
tmp1 = scan.next();
} while (!tmp1.equals(userCards[index].getPasswd()));//不能是老密码
System.out.println("请再次输入新密码以确认:");
tmp2 = scan.next();
while (!tmp1.equals(tmp2)) {
System.out.println("两次密码不一致,请重新输入:");
tmp2 = scan.next();
}
userCards[index].setPasswd(tmp1);
}
}
BankCard 类
//银行卡
public class BankCard {
//同一个BankCard,id和passwd是对应的
private String passwd;//私有,在别的类中不能通过 如userCard[i].passwd的形式访问
private String id;//比int好
//支付密码????????
private double money;
public BankCard(String passwd,String id) {
//初始化
this.passwd=passwd;//即当前对象的属性 用 局部变量初始化
this.id=id;
}
public String getId() {
return id;
}
public double getMoney() {
return money;
}
public void SetMoney(double tmp) {
money+=tmp;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String tmp) {
passwd=tmp;
}
}
main函数内容
ATM atm=new ATM();
atm.start();
备注:
将ATM、Bank、BankCard、Test函数放在同一路径;
运行main函数