简单实现ATM机功能(java)

思路

思路:

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函数

猜你喜欢

转载自blog.csdn.net/qq_41571459/article/details/113533080