ATM系统案例练习

1. 效果展示

效果展示

2. 架构搭建

2.1 Test.java

负责对 ATM 系统进行测试

/**
 *  测试类Test,负责对ATM系统进行测试
 */
public class Test {
    public static void main(String[] args) {
        
        // 1. 创建ATM类的一个对象
        ATM atm=new ATM();

        // 2. 调用ATM对象的start()方法
        atm.start();

    }
}

2.2 Account.java

负责定义账户信息
卡号、姓名、性别、密码、余额、限额

/**
 * 账户类Account,负责定义账户信息
 * 卡号、姓名、性别、密码、余额、限额
 */
public class Account {
    private String cardId;
    private String name;
    private char sex;
    private String password;
    private double balance;
    private double limit;

    public String getCardId() {
        return cardId;
    }

    public void setCardId(String cardId) {
        this.cardId = cardId;
    }

    public String getName() {
        return name;
    }

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

    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 getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}

2.3 ATM.java

负责提供所有的 ATM 业务处理方法

2.3.0 导包准备

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM(){
    private ArrayList<Account> accounts=new ArrayList<>();    // 账户列表
    private Scanner scanner=new Scanner(System.in);
}

2.3.1 初始界面(欢迎界面)实现

在这里插入图片描述

    /**
     * ATM机的欢迎页面(初始界面)
     * 本方法为无参方法,不接受任何参数。
     * 无返回值,执行完毕后不返回任何结果。
     */
    public void start() {
        while(true){
            System.out.println("===== 欢迎进入ATM系统 =====");
            System.out.println("[1] 用户登录");
            System.out.println("[2] 用户开户");
            System.out.println("[0] 退出系统");
            System.out.print("请选择:");

            // 获取用户输入
            switch (scanner.nextInt()) {
                case 1:
                    this.login();    // 用户登录
                    break;
                case 2:
                    this.creatAccount(); // 用户开户
                    break;
                case 0:           // 用户退出
                    System.out.println("欢迎下次使用!");
                    return;
                default:            // 非法输入
                    System.out.println("输入有误,请重新输入!");
            }
        }
    }

2.3.2 开户功能实现

在这里插入图片描述

    /** 功能:创建(开)账户 */
    private void creatAccount(){
        // 1.创建一个账户
        Account account=new Account();

        account.setBalance(0);              // 新开账户余额默认为0
        account.setLimit(5000);             // 新开账户额度默认为5000
        account.setCardId(creatCardId());   // 产生8位的开户卡号(不重复)

        // 2.录入账户信息
        System.out.println("-------- 开户界面 --------");
        System.out.print("请输入开户名:");
        account.setName(scanner.next());

        while (true) {
            System.out.print("请输入性别(男/女):");
            account.setSex(scanner.next().charAt(0));
            if (account.getSex()=='男'||account.getSex()=='女') {
                break;
            }else{
                System.out.println("输入有误,请重新输入!");
            }
        }

        while (true) {
            System.out.print("请输入设置账户密码:");
            account.setPassword(scanner.next());
            System.out.print("请再次确认账户密码:");
            if (!account.getPassword().equals(scanner.next())) {    // 两次密码输入不一致
                System.out.println("两次密码输入不一致,请重新设置密码!");
            }else{
                break;
            }
        }

        // 3.添加到账户列表
        this.accounts.add(account); 
        System.out.println("你已开户成功,卡号为"+account.getCardId());
    }

    /** 功能:返回8位的随机卡号,且与账户列表已有卡号不重复 */
    private String creatCardId(){
        String cardId="";
        Random  random=new Random();

        while(true){
            // 1.随机生成8位数字的卡号
            for (int i = 0; i < 8; i++) {
                cardId+=random.nextInt(10); // 0-9
            }

            if(this.getAccountByCardId(cardId)==null){   // 生成的卡号不重复
                return cardId;
            }
        }
    }

     /**
     * 根据卡号获取对应的账户信息。
     * 遍历所有账户,查找卡号匹配的账户并返回。
     *
     * @param cardId 卡号,用于查找对应的账户。
     * @return Account 对象,如果找到匹配的账户则返回该账户,否则返回null。
     */
    private Account getAccountByCardId(String cardId){
        for (Account account : accounts) { // 遍历所有账户
            if (account.getCardId().equals(cardId)) {   // 判断当前账户的卡号是否与传入的卡号匹配
                return account;
            }
        }

        return null;    // 账户列表中无该卡号对应的账户
    }

2.3.3 登录功能实现

在这里插入图片描述

    /**
     * 登录功能的实现。
     * 该方法不需要参数,也不返回任何值。
     */
    private void login(){
        if (this.accounts.isEmpty()) {
            System.out.println("系统暂无用户!");
            return;
        }

        // 1.输入卡号
        System.out.println("-------- 登录界面 --------");
        Account accountLogin = null;

        while (true) {  // 检查卡号是否输入正确
            System.out.print("请输入卡号:");
            accountLogin = this.getAccountByCardId(scanner.next());

            if (accountLogin ==null) {
                System.out.println("卡号不存在,请重新输入!");
            }else{
                break;
            }
        }

        // 2.输入密码
        while(true){
            System.out.print("请输入密码:");
            if (accountLogin.getPassword().equals(scanner.next())) {
                System.out.println("登录成功!");
                break;
            } else {
                System.out.println("密码错误,请重新输入!");
            }
        }

        // 3.登录成功后,进入主菜单界面
        this.mainMenu(accountLogin);
    }

2.3.4 主菜单界面实现

在这里插入图片描述

    /**
     * 主菜单界面逻辑处理。
     * 该方法用于展示主菜单,并根据用户选择执行相应的操作。
     * @param accountLogin 登录用户账户信息,用于在主菜单中根据账户状态提供不同的功能选项。
     */
    private void mainMenu(Account accountLogin){
        while(true){
            System.out.println("--------- 主界面 ---------");
            System.out.println(accountLogin.getName()+"用户你好!");
            System.out.println("请按如下选项办理业务");
            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("[0] 退出当前界面");
            System.out.print("请选择: ");

            switch (scanner.nextInt()) {
                case 1:
                    this.show(accountLogin);    // 查询当前账户信息
                    break;
                case 2:
                    this.deposit(accountLogin); // 存款业务
                    break;
                case 3:
                   this.withdraw(accountLogin);   // 取款业务
                    break;
                case 4:
                   this.transferMoney(accountLogin); // 转账业务
                    break;
                case 5:
                    this.changePassword(accountLogin); // 密码修改
                    break;
                case 6: // 注销当前账户
                    if(this.deleteAccount(accountLogin)){    // 注销成功
                        return;
                    }else{  // 注销失败
                        break;
                    }
                case 0:
                    System.out.println("你已成功退出当前页面!"); // 退出当前界面
                    return;
                default:
                    System.out.println("输入有误!"); // 输入有误
            }
        }


    }

2.3.5 查询业务实现

在这里插入图片描述

     /**
     * 展示账户信息
     * @param accountLogin 账户登录信息对象,包含账户的基本信息
     * 该方法不返回任何值
     */
    private void show(Account accountLogin){
        // 打印账户信息的标题
        System.out.println("-------- 账户信息 --------");

        // 打印账户的基本信息
        System.out.println("卡号:"+accountLogin.getCardId());
        System.out.println("姓名:"+accountLogin.getName());
        System.out.println("性别:"+(accountLogin.getSex()=='男'?"男":"女")); // 根据性别字段打印性别信息
        System.out.println("余额:"+accountLogin.getBalance()+"¥");
        System.out.println("限额:"+accountLogin.getLimit()+"¥");
    }

2.3.6 存款业务实现

在这里插入图片描述

    /**
     * 为账户进行存款操作。
     * @param accountLogin 用户的账户对象,用于执行存款操作的登录账户。
     */
    private void deposit(Account accountLogin) {
        System.out.println("-------- 存款界面 --------");
        double money=0;
        while(true){
            System.out.print("请输入存款金额:");
            money=scanner.nextDouble();

            if (money<=0) {
                System.out.println("输入有误,请重新输入!");
            }else{
                accountLogin.setBalance(accountLogin.getBalance()+money);
                System.out.println("已成功存款"+money+"元,当前可用余额为"+accountLogin.getBalance()+"元");
                break;
            }
        }
    }

2.3.7 取款业务实现

在这里插入图片描述

    /**
     * 取款操作函数
     * @param accountLogin 用户的账户对象,用于进行取款操作和余额查询
     */
    private void withdraw(Account accountLogin) {
        System.out.println("-------- 取款界面 --------");
        double money=0;

        while(true){
            System.out.print("请输入取款金额:");
            money=scanner.nextDouble();

            if (money<=0) { // 判断输入的取款金额是否合法
                System.out.println("输入有误,请重新输入!");
            }else if(money>accountLogin.getBalance()) {  // 判断账户余额是否足够进行取款
                System.out.println("余额不足,请重新输入!");
            }else if(money>accountLogin.getLimit()){  // 判断是否超过账户限额
                System.out.println("超过账户限额,请重新输入!");
            }else{  // 执行取款操作,更新账户余额
                    accountLogin.setBalance(accountLogin.getBalance()-money);
                    System.out.println("已成功取款"+money+"元,当前可用余额为"+accountLogin.getBalance()+"元");
                    break; // 取款成功后退出循环
                }
            }
        }

2.3.8 转账业务实现

转账业务实现

    /**
     * 实现转账功能。
     * 该方法用于将登录账户内的资金转移到其他账户。
     * @param accountLogin 登录账户,用于资金转移的起始账户。
     */
    private void transferMoney(Account accountLogin) {

        System.out.println("-------- 转账界面 --------");

        // 1.判断ATM系统中的账户数目是否大于1
        if(this.accounts.size()<2){
            System.out.println("ATM系统暂无其他账户,无法进行转账!");
            return;
        }

        // 2.输入转账账户的卡号并验证
        Account accountTransfer = null;
        String cardId="";

        while(true) {
            System.out.print("请输入转账账户的卡号:");
            cardId = scanner.next();

            if (cardId.length() != 8) {     // 卡号长度检验
                System.out.println("卡号长度有误,请重新输入!");
                continue;
            }

            if (cardId.equals(accountLogin.getCardId())) {
                System.out.println("不能给自己转账!");
            } else {
                accountTransfer = this.getAccountByCardId(cardId);
                if (accountTransfer == null) {
                    System.out.println("卡号不存在,请重新输入!");
                } else {
                    break;
                }
            }
        }

        // 3.输入转账金额并验证后,进行转账
        double money=0;
         while(true){
             System.out.print("请输入转账金额:");
             money=scanner.nextDouble();

             if (money<=0) { // 判断输入的转账金额是否合法
                 System.out.println("输入有误,请重新输入!");
             }else if(money>accountLogin.getBalance()) {  // 判断账户余额是否足够进行转账
                 System.out.println("余额不足,请重新输入!");
             } else if(money>accountLogin.getLimit()){  // 判断是否超过账户限额
                 System.out.println("超过账户限额,请重新输入!");
             }else{  // 可以进行转账
                 accountTransfer.setBalance(accountTransfer.getBalance()+money);
                 accountLogin.setBalance(accountLogin.getBalance()-money);
                 System.out.println("已成功向卡号为"+accountTransfer.getCardId()+"的用户转账"+money+"元");
                 System.out.println("当前可用余额为"+accountLogin.getBalance()+"元");
                 break;
             }
         }
    }

2.3.9 密码修改实现

在这里插入图片描述

    /**
     * 更改账户密码的方法。
     * @param accountLogin 登录账户的信息,用于标识需要更改密码的账户。
     * @return 无返回值。
     */
    private void changePassword(Account accountLogin) {
        System.out.println("-------- 修改密码界面 --------");
        String password="";

        // 1.输入新密码并验证
        while(true){
            System.out.print("请输入新密码:");
            password = scanner.next();

            if (password.isEmpty()) {  //  密码不能为空
                System.out.println("密码不能为空,请重新输入!");
                continue;
            }

            if (password.equals(accountLogin.getPassword())) {     // 密码不能与原密码相同
                System.out.println("新密码不能与原密码相同,请重新输入!");
                continue;
            }
            break;
        }

        // 2.输入确认密码并验证后,修改原密码
       while(true){
           System.out.print("请再次确认新密码:");
           if(!password.equals(scanner.next())){    // 两次密码不一致
               System.out.println("两次密码不一致,请重新输入!");
                continue;
           }else{   // 密码一致,修改原密码
               accountLogin.setPassword(password);
               System.out.println("密码修改成功!");
               break;
           }
       }
    }

2.3.10 注销当前账务实现

在这里插入图片描述

    /**
     * 注销账户。
     * @param accountLogin 账户登录信息,用于标识要删除的账户。
     * @return 返回一个布尔值,表示账户是否成功删除。
     */
    private boolean deleteAccount(Account accountLogin) {
        System.out.println("-------- 注销账户界面 --------");
        String choice="";

        while(true){
            System.out.print("是否确认注销当前账户(y/n):");
            choice=scanner.next();

            if(!choice.equals("y")&&!choice.equals("n")){
                System.out.println("输入有误,请重新输入!");
                continue;
            }

            if (choice.equals("y")) {
                if(accountLogin.getBalance()>0){    // 账户中有存款,不允许注销
                    System.out.println("该账户中还有存款,不允许注销!");
                    return false;
                }else{  // 账户中没有存款,允许注销
                    this.accounts.remove(accountLogin);
                    System.out.println("该账户注销成功!");
                    return true;
                }
            }else{
                System.out.println("已取消注销!");
                return false;
            }
        }
    }

2.3.11 退出当前界面效果展示

在这里插入图片描述

2.3.12 退出 ATM 系统效果展示

在这里插入图片描述

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ATM系统系统结构图主要分为硬件层、操作系统层、应用软件层和用户界面层四个部分。 在硬件层,ATM系统包括ATM机主体、密码键盘、插卡口、打印机、屏幕、读卡器、存取款箱等各种硬件设备。这些设备通过各种接口和总线连接在一起,与操作系统层和应用软件层进行数据传输和通信。 在操作系统层,ATM系统运行着一个特定的操作系统,用于管理硬件设备、调度任务、处理网络通信等功能。操作系统负责与硬件设备进行底层交互,控制硬件设备的操作和数据传输。 在应用软件层,ATM系统主要包括业务服务和用户服务两个模块。业务服务模块负责处理用户的各类交易请求,包括查询余额、取款、转账、存款等操作,并将结果返回给用户。用户服务模块提供用户操作界面,使用户可以通过触摸屏或按钮进行相应的操作。 在用户界面层,ATM系统提供了一个用户友好的界面,用于向用户展示交互界面和操作提示。用户可以通过界面输入密码、选择交易类型、输入金额等,并根据界面上的提示完成所需的操作。 ATM系统系统结构图将这四个部分以不同的方框分开,并用箭头表示数据流和控制流。硬件层、操作系统层、应用软件层和用户界面层之间的交互和信息流动可以清楚地展示在系统结构图中,使人们更容易理解和分析ATM系统的整体架构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值