ATM原理的实现

该博客介绍了如何使用Java编程语言模拟ATM机的功能,包括读卡、存款、取款、转账及打印等操作,详细阐述了各个功能的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:
模拟ATM机,实现读卡,存款,取款,转账,打印等功能。

/**
*卡信息类
*/
public class UserInfo {
    private String account;  //账号
    private String password; //密码
    private String name;     //持卡人姓名
    private double balance;  //余额

    public UserInfo() {
    }

    public UserInfo(String account, String password, String name, double balance) {
        this.account = account;
        this.password = password;
        this.name = name;
        this.balance = balance;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }
}
/**
*ATM类
*/
public class ATM {
    UserInfo lisi = new UserInfo("10001", "123456", "李四", 2000);
    UserInfo wangwu = new UserInfo("10002", "123456", "王五", 3000);
    int count=3;
    private boolean flag;
    //创建list集合,存放转账信息
    List<String> tranMoneyList=new ArrayList<>();
    //创建list集合,存放所有操作信息
    List<String> optionInfoList=new ArrayList<>();
    public boolean isFlag(){
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    Scanner sc = new Scanner(System.in);
    // 1、显示一段欢迎的信息
    public void showWelcom() {
        System.out.println("*****************");
        System.out.println("**欢迎使用ATM**");
        System.out.println("*****************");
    }
    //登录
    public void login() {

        System.out.println("请输入卡号");
        String keyAccount = sc.next();
        System.out.println("请输入密码");
        String keyPassword = sc.next();
        if (keyAccount.equals(lisi.getAccount()) && keyPassword.equals(lisi.getPassword())) {
            System.out.println("欢迎" + lisi.getName() + "来到ATM系统");
            showMenu();
        } else {
            if (count > 1) {//当count允许重新输入的次数大于1时执行
                count--;
                System.out.println("卡号或密码有误,请重新输入还有" + count + "机会");
            } else {
                System.out.println("请重新运行程序");

            }
        }
    }
    // 显示主菜单
    public void showMenu() {
        System.out.println("***********************************");
        System.out.println("*******请输入你想要操作类型*******");
        System.out.println("******1.余额查询  2.取款***********");
        System.out.println("******3.存款        4.转账***********");
        System.out.println("******5.打印        6.退卡***********");
        System.out.println("******7.查询转账信息**************");
        System.out.println("**********************************");

    }

    //查询余额
    public void searchMoney(){
        System.out.println("查询成功,余额为:" + lisi.getBalance());
    }

    //存款
    public void saveMoney() {
        System.out.println("请输入你存入的金额:");
        Integer cun = sc.nextInt();
        if ((cun <= 0) || (cun.toString().length() > 6)) {
            System.out.println("不是吧,阿sir");
            System.out.println("请重新输入把!");
            saveMoney();
        } else {
            lisi.setBalance(lisi.getBalance() + cun);
            System.out.println("存入成功,余额为:" + lisi.getBalance());
        }
        String saveMoneyInfo = "存款     存款金额:" + cun + "元     存款后余额:" + lisi.getBalance() + "元";
        optionInfoList.add(saveMoneyInfo);//把存款信息放入optionInfoList集合
    }

    //取款
    public void getMoney() {
        System.out.println("请输入你取出的金额:");
        double qu = sc.nextDouble();
        if (qu > lisi.getBalance()) {
            System.out.println("努力吧铁子,不然吃羊肉串都得闻味啊!");
            getMoney();
        } else if (qu <= 0) {
            System.out.println("不是吧,阿sir");
            getMoney();
        } else {
            lisi.setBalance(lisi.getBalance() - qu);
            System.out.println("取钱成功,余额为:" + lisi.getBalance());
        }
        String getMoneyInfo = "取款     取款金额:" + qu + "元     取款后余额:" + lisi.getBalance() + "元";
        optionInfoList.add(getMoneyInfo);//把取款信息放入optionInfoList集合
    }


    //转账
    public void tranMoney() {
        System.out.println("请输入要转入的卡号:");
        String inAccount = sc.next();
        System.out.println("请输入转入的金额:");
        double zhuan = sc.nextDouble();
        if (inAccount.equals(wangwu.getAccount())) {
            if (zhuan > lisi.getBalance()) {
                System.out.println("铁子,卡里没那么多");
                tranMoney();
            } else if (zhuan <= 0) {
                System.out.println("不是吧,阿sir");
                System.out.println("重新输入把!");
                tranMoney();
            } else {
                lisi.setBalance(lisi.getBalance() - zhuan);
                wangwu.setBalance(wangwu.getBalance() + zhuan);
                System.out.println("转账成功,余额为:" + lisi.getBalance());
            }
        }else {
            System.out.println("没有此卡号,请重新输入转入卡号......");
            tranMoney();
        }
        String tranMoneyInfo="转方:"+lisi.getName()+"\t"+"对方姓名:"+wangwu.getName()+"    "+"转出金额:"+zhuan+"\t"+"余额为:"+lisi.getBalance();
        tranMoneyList.add(tranMoneyInfo);//把转账记录放入tranMoneyList集合
        optionInfoList.add(tranMoneyInfo);//把转账记录放入optionInfoList集合

    }
    //打印操作信息,写入文件
    public void print(){
        //打开文件
        File file=new File("F:\\billInfo.txt");
        if (file.exists()){//判断,如果文件已存在,就删除
            file.delete();
        }else {
            //创建一个文件,捕获异常
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        FileWriter fw=null;
        try {
            fw=new FileWriter(file);
            String cardInfo = "卡号:" + lisi.getAccount() + "\t号主:" + lisi.getName() + "\n";
            fw.write(cardInfo);
                for (String s:optionInfoList){//把optionInfoList集合里的信息都循环遍历写入文件
                String message=s.toString()+"\n";
                fw.write(message);
                fw.flush();//刷新缓冲区,将缓冲区中的数据立刻写入文件,同时清空缓冲区

            }
        } catch (IOException e) {
            e.printStackTrace();
            try {
                //关闭资源
                fw.close();
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        }
        System.out.println("打印成功!");
        System.out.println("存放路径:F:\\billInfo.txt");
    }
    //退卡
    public void outCard(){
        System.out.println("当前用户已退出!");
        flag = false;
        System.exit(0);
    }
    //打印转账信息
    public void tranMoneyInfo(){
        if (tranMoneyList.size()!=0){
            for (String s:tranMoneyList){
                System.out.println(s.toString());
            }
        }else {
            System.out.println("无转账记录");
        }

    }
    // 显示操作主菜单
    public void optionMenu() {
    //选择操作类型
        String choose=sc.next();
        switch (choose){
            case "1":
                //查询余额
                searchMoney();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;
            case "2":
                //取款
                getMoney();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;
            case "3":
                //存款
                saveMoney();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;
            case "4":
                //转款
                tranMoney();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;
            case "5":
                //打印操作信息
                print();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;
            case "6":
                outCard();
                break;
            case "7":
                //转款
                tranMoneyInfo();
                //显示主菜单
                showMenu();
                //操作主菜单
                optionMenu();
                break;

        }

    }
}
/**
*测试类
*/
public class Person_Test {
    public static void main(String[] args) {
        //创建ATM对象
        ATM atm=new ATM();
        //欢迎方法
        atm.showWelcom();
        //定义是否继续执行
        boolean flag=true;
        while (flag){
            //登录方法
            atm.login();
            //操作主菜单方法
            atm.optionMenu();
            flag=atm.isFlag();
        }
    }

执行结果:

*****************
**欢迎使用ATM**
*****************
请输入卡号
10001
请输入密码
123456
欢迎李四来到ATM系统
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
2
请输入你取出的金额:
200
取钱成功,余额为:1800.0
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
3
请输入你存入的金额:
500
存入成功,余额为:2300.0
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
4
请输入要转入的卡号:
10002
请输入转入的金额:
200
转账成功,余额为:2100.0
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
7
转方:李四	对方姓名:王五    转出金额:200.0	余额为:2100.0
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
5
打印成功!
存放路径:F:\billInfo.txt
***********************************
*******请输入你想要操作类型*******
******1.余额查询  2.取款***********
******3.存款        4.转账***********
******5.打印        6.退卡***********
******7.查询转账信息**************
**********************************
6
当前用户已退出!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值