Java模拟实现ATM系统

这篇具有很好参考价值的文章主要介绍了Java模拟实现ATM系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


 ****转载请注明出处哦~ ~ ~****                                   

前言

前言:
自动取款机又称ATM(Automated Teller Machine的缩写),意思是自动柜员机,因大部分用于取款,又称自动取款机。它是一种高度精密的机电一体化装置,利用磁性代码卡或智能卡实现金融交易的自助服务,代替银行柜面人员的工作。可提取现金、查询存款余额、进行账户之间资金划拨、余额查询等工作;此项目是实现了模拟ATM系统。

一、项目需求是什么?

模拟实现银行ATM机系统,可以实现开户,登录账户,查询账户,存款,取款,转账,修改账户密码,注销账户。

二、技术选型

技术点分析:

面向对象分析,使用集合容器,程序流程控制,使用常见API。

1. 面型对象分析:

每个用户对象要对应一个账户对象:所以需要设计账户类Account。

2. 使用集合容器:

系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合。

3. 程序流程控制:

需要结合分支、循环、跳转等相关操作控制程序的业务逻辑。

4. 使用常见API:

内容比较,分析,数据处理等需要用到String等常用API。

三、实现步骤

1.账户类、首页设计

Java模拟实现ATM系统
Java模拟实现ATM系统
分析:
① 每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、余额、取现额度、密码)。
② 需要定义一个ArrayList的集合用于存储账户对象。
③ 需要展示欢迎页包含2个功能:注册开户、登录账户。

2.用户开户功能实现

Java模拟实现ATM系统

分析:
① 开户功能应该独立定义成方法,并传入当前集合对象给该方法。
private static void register(ArrayList accounts, Scanner sc) {

② 需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。
public static String createCardId()

③ 注意:自动生成的卡号不能与其他用户的卡号重复。

④ 最终把用户开户的信息封装成Account对象,存入到集合中。


3.用户登录功能实现

Java模拟实现ATM系统
分析:
① 需要根据卡号去集合中查询对应的账户对象。

② 如果找到了账户对象,说明卡号存在,继续输入密码。

③ 如果密码也正确,则登录成功

4.用户操作页设计、查询账户、退出账户功能

Java模拟实现ATM系统
分析
① 用户登录成功后,需要进入用户操作页。

② 查询就是直接展示当前登录成功的账户对象的信息。

③ 退出账户是需要回到首页的。

5.用户存款、取款功能

Java模拟实现ATM系统
Java模拟实现ATM系统
分析
① 存款和取款都是拿到当前用户的账户对象。

② 通过调用账户对象的set方法修改其余额

6.用户转账功能

Java模拟实现ATM系统
分析
① 转账功能要分析对方账户是否存在的问题。

② 还要分析自己的余额是否足够的问题。

7.用户密码修改功能、销户功能

Java模拟实现ATM系统
Java模拟实现ATM系统
如果账户还有余额,则不可销户
Java模拟实现ATM系统
分析
① 修改密码就是把当前对象的密码属性使用set方法进行更新。

② 销户是从集合对象中删除当前对象,并回到首页。

四、代码实现

ATMSystem类(ATM系统入口类):

package atmdemo;

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

/**
 * ATM系统的入口类
 */
public class ATMSystem {
    public static void main(String[] args) {
        //1.定义账户类
        //2.定义一个集合容器,负责存储全部账户对象,进行相应操作
        ArrayList<Account> accounts = new ArrayList<>();
        Scanner sc = new Scanner(System.in);
        //3.展示系统的首页
        while (true) {
            System.out.println("=======================欢迎使用ATM系统==================");
            System.out.println("1.登录账户");
            System.out.println("2.注册账户");
            System.out.println("请输入您的操作:");
            int common = sc.nextInt();
            switch (common) {
                case 1:
                    //登录操作
                    login(accounts, sc);
                    break;

                case 2:
                    //注册操作
                    register(accounts, sc);
                    break;

                default:
                    System.out.println("您的输入操作有误,请重新输入!!!");
            }
        }
    }

    /**
     * 定义一个方法,实现登录功能
     *
     * @param accounts
     * @param sc
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("==================系统登录操作=================");
        //1.判断当时系统是否有账户
        if (accounts.size() == 0) {
            System.out.println("当前系统无任何账户,请先开户!!!");
            return;
        }

        //2.让用户输入卡号,根据卡号查询用户是否存在
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();

            //判断卡号是否存在:根据卡号去账户集合中查询账户对象
            Account acc = judgeCardId(accounts, cardId);
            if (acc != null) {
                while (true) {
                    System.out.println("请您输入密码:");
                    String password = sc.next();
                    if (acc.getPassword().equals(password)) {
                        System.out.println(acc.getUsername() + "先生/女生密码正确,登陆成功!!!");

                        //需要显示登录后的操作页
                        showUserCommand(sc, acc, accounts);
                        return;//结束登录后的操作页,回到首页
                    } else {
                        System.out.println("密码不正确,请您重新输入!!!");
                    }
                }

            } else {
                System.out.println("您输入的卡号不存在,请重新输入!!!");
            }
        }
    }

    /**
     * 登录成功后展示的页面
     */
    private static void showUserCommand(Scanner sc, Account acc, ArrayList<Account> accounts) {
        while (true) {
            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("7.注销账户");
            System.out.println("请输入您的操作:");
            int command = sc.nextInt();

            switch (command) {
                case 1:
                    //查询账户
                    showAccount(acc);
                    break;
                case 2:
                    //存款
                    deposit(acc, sc);
                    break;
                case 3:
                    //取款
                    withdrawMoney(acc, sc);
                    break;
                case 4:
                    //转账
                    transfer(acc, sc,accounts);
                    break;
                case 5:
                    //修改密码
                    changePassword(acc, sc);
                    return;
                case 6:
                    //退出
                    System.out.println("退出成功!!!");
                    return;//退出操作页
                case 7:
                    //注销账户
                    if (logout(acc, sc, accounts)) {
                        return;
                    } else {
                        break;
                    }
                default:
                    System.out.println("您输入的操作命令不正确!!!");
            }
        }

    }

    /**
     * 注销账户
     *
     * @param acc
     * @param sc
     * @param accounts
     */
    private static boolean logout(Account acc, Scanner sc, ArrayList<Account> accounts) {
        System.out.println("====================注销账户===================");
        System.out.println("您确定要销户吗?y/n");
        String s = sc.next();
        switch (s) {
            case "y":
                if (acc.getMoney() > 0) {
                    System.out.println("账户还有余额,不可销户!!!");
                } else {
                    accounts.remove(acc);//注销账户
                    System.out.println("销户成功!!!");
                    return true;
                }
                break;
            default:
                System.out.println("很好,当前用户继续保留!!!");
        }
        return false;
    }

    /**
     * 定义一个方法,实现用户修改功能
     *
     * @param acc
     * @param sc
     */
    private static void changePassword(Account acc, Scanner sc) {
        System.out.println("=====================修改密码==================");
        while (true) {
            System.out.println("请" + acc.getUsername() + "先生/女生输入要修改的密码:");
            String password = sc.next();
            System.out.println("请" + acc.getUsername() + "先生/女生确认要修改的密码:");
            String okpassword = sc.next();
            if (okpassword.equals(password)) {
                acc.setPassword(password);
                System.out.println("修改密码成功!!!");
                System.out.println("请重新登录账户!!!");
                return;
            } else {
                System.out.println("您输入的两次密码不一致,请重新输入!!!");
            }
        }
    }

    /**
     * 定义一个方法,实现转账用户功能
     *
     * @param acc
     * @param sc
     */
    private static void transfer(Account acc, Scanner sc,ArrayList<Account> accounts) {
        System.out.println("======================转账=====================");
        String cardid= null;
        //判断输入的卡号是否存在
        while (true) {
            System.out.println("请输入您要转账的卡号:");
            cardid = sc.next();
            if(judgeCardId(accounts,cardid)==null){
                System.out.println("您输入的卡号不存在,请重新输入!!!");
            }else if(acc.getCardId().equals(cardid)){
                System.out.println("不可给自己转账,请重新输入!!!");
            }else {
                break;
            }
        }
        //遍历找到要转账的卡号
        for (int i = 0; i < accounts.size(); i++) {
            Account acc1=accounts.get(i);
            if (acc1.getCardId().equals(cardid)) {
                //输入姓名,判断是否正确
                while (true) {
                    System.out.println("请您补全姓名:");
                    String s1=acc1.getUsername().substring(0,1);
                    String s2=acc1.getUsername().substring(2);
                    System.out.println(s1+"*"+s2);
                    String name=sc.next();
                    if (acc1.getUsername().equals(name)) {
                        break;
                    }else {
                        System.out.println("您输入的姓名有误,请重新输入!!!");
                    }
                }
                //判断金额
                if (acc.getMoney() == 0) {
                    System.out.println("您现在余额为0,请先存款后,才可以转账!!!");
                    return;
                }
                while (true) {
                    System.out.println("请输入您的转账金额:");
                    double money = sc.nextDouble();
                    if (money <= acc.getAmount() && money <= acc.getMoney()) {
                        acc.setMoney(acc.getMoney() - money);
                        acc1.setMoney(acc1.getMoney()+money);
                        System.out.println("转账成功!!!");
                        break;
                    } else if (money > acc.getMoney()) {
                        System.out.println("您的存款金额不足,请重新输入!!!");
                    }else if (money > acc.getAmount()) {
                        System.out.println("您的转账金额超出限额,请重新输入!!!");
                    }
                }
            }
        }

    }

    /**
     * 定义一个方法,实现取款功能,并输出查询账户
     *
     * @param acc
     * @param sc
     */
    private static void withdrawMoney(Account acc, Scanner sc) {
        System.out.println("======================取款======================");
        if (acc.getMoney() == 0) {
            System.out.println("您现在余额为0,请先存款后,才可以取款!!!");
            return;
        }
        while (true) {
            System.out.println("请输入您的取款金额:");
            double money = sc.nextDouble();
            if (money <= acc.getAmount() && money <= acc.getMoney()) {
                acc.setMoney(acc.getMoney() - money);
                System.out.println("取款成功!!!");
                break;
            } else if (money > acc.getAmount()) {
                System.out.println("您的取款金额超出限额,请重新输入!!!");
            } else if (money > acc.getMoney()) {
                System.out.println("您的存款金额不足,请重新输入!!!");
            }
        }
        showAccount(acc);

    }

    /**
     * 定义一个方法,实现存款功能,并输出查询账户
     *
     * @param acc
     */
    private static void deposit(Account acc, Scanner sc) {
        System.out.println("======================存款======================");
        System.out.println("请输入您要存款的金额:");
        double money = sc.nextDouble();
        acc.setMoney(acc.getMoney() + money);
        System.out.println("存款成功!!!");
        showAccount(acc);
    }

    /**
     * 定义一个方法,实现登录后查询账户的功能
     *
     * @param acc
     */
    private static void showAccount(Account acc) {
        System.out.println("==================查询账户================");
        System.out.println("卡号:" + acc.getCardId());
        System.out.println("户主:" + acc.getUsername());
        System.out.println("余额:" + acc.getMoney());
        System.out.println("限额:" + acc.getAmount());
    }

    /**
     * 定义一个方法,实现用户开户功能
     *
     * @param accounts
     * @param sc
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("=================系统开户操作===================");
        //1.创建一个Account账户类,用于封装账户信息(用户名,密码,卡号)
        Account account = new Account();

        //2.录入当前账户信息,注入到账户对象中去
        //2.1 用户名
        System.out.println("请输入您的用户名:");
        String username = sc.next();
        account.setUsername(username);

        //2.2 密码
        while (true) {
            System.out.println("请输入您的账户密码:");
            String password = sc.next();
            System.out.println("请您确认密码:");
            String okpassword = sc.next();
            if (okpassword.equals(password)) {
                account.setPassword(okpassword);
                break;//要记得跳出循环!!!
            } else {
                System.out.println("您两次输入的密码不同,请重新输入!!!");
            }
        }

        //2.3 限额
        while (true) {
            System.out.println("请输入您最大支付额度:");
            double amount = sc.nextDouble();
            if (amount > 0) {
                account.setAmount(amount);
                break;
            } else {
                System.out.println("您输入的不可为负数,请重新输入!!!");
            }
        }

        //2.3 卡号(运用一个方法,使得其随机生成一个8位的卡号,且不可重复的卡号)
        String cardId = getRandomCardId(accounts);
        System.out.println("恭喜" + username + "先生/女生,开户成功!!!\n您的卡号为:" + cardId);
        account.setCardId(cardId);

        //3.把账户对象添加到集合中去
        accounts.add(account);
    }

    /**
     * 定义一个方法,随机生成一个8位数的卡号
     *
     * @param accounts
     */
    private static String getRandomCardId(ArrayList<Account> accounts) {
        Random r = new Random();
        while (true) {
            String cardId = "";

            for (int i = 0; i < 8; i++) {
                cardId += r.nextInt(10);
            }
            //定义方法,判断是否有重复的(只需看这个卡号,是否有账户即可)
            Account acc = judgeCardId(accounts, cardId);
            if (acc == null) {
                return cardId;
            }
        }

    }

    /**
     * 查询该卡号是否有账户
     *
     * @param accounts
     * @param carId
     */
    private static Account judgeCardId(ArrayList<Account> accounts, String carId) {
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getCardId().equals(carId)) {
                return acc;
            }
        }

        return null;//查无此账户
    }
}

Account类(账户类):

package atmdemo;

/**
 * 定义一个账户类
 */
public class Account {
    /**
     * 成员变量
     */
    private String cardId;//卡号
    private String username;//用户名
    private String password;//密码
    private double money;//余额
    private double amount;//限额

    public String getCardId() {
        return cardId;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    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 getAmount() {
        return amount;
    }

    public void setAmount(double amount) {
        this.amount = amount;
    }
}


总结

总结:
以上就是全部的内容,本文简单地分析介绍了ATM系统的实现,实现了开户,登录账户,查询账户,存款,取款,转账,修改密码,退出,销户的功能。以上功能均定义成独立的方法。

(如有不正确之处,请在评论区指正哦~ ~ ~)文章来源地址https://www.toymoban.com/news/detail-496988.html

投票

到了这里,关于Java模拟实现ATM系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【java】【基础8】入门结业-ATM系统实战

      目录 一、ATM项目技术  二、能达成的能力  三、开始编码 3.1 系统架构搭建、欢迎页设计  3.1.1 Account 3.1.2 ATM  3.1.3 Test 3.2 开户功能实现 3.2.1 修改AccountgetUserName()  3.2.2 ATM 开户操作  3.2.3 ATM为新用户生成一个随机卡号​编辑 3.3 登录功能实现 3.4 操作页展示、查询账户、退出

    2024年02月16日
    浏览(33)
  • java每日一题——ATM系统编写(答案及编程思路)

    基础语句学完,也可以编写一些像样的程序了,现在要做的是多加练习,巩固下知识点,打好基础,daydayup! 题目:模仿银行ATM系统,可以创建用户,存钱,转账,修改密码注销账户等操作 思路:利用面向对象编程:1, 定义一个账户类 Account,至少需要包含(卡号、姓名、性

    2024年01月20日
    浏览(33)
  • 基于Javaweb实现ATM机系统开发实战(十)取款功能实现

    老规矩,先看前端页面:  创建同名servlet: 接口: 实现类: 数据层: 这里我们为了方便实现交易记录的查询,先创建一个实体类:

    2024年02月15日
    浏览(34)
  • 基于Javaweb实现ATM机系统开发实战(八)实时查询余额功能实现

    老规矩,先看前端页面,把前端页面上没有的表达式都删掉:  创建servlet接受和处理请求: 接口: 实现类: 数据层: 测试一下就发现余额查询成功啦~  

    2024年02月16日
    浏览(47)
  • 基于Javaweb实现ATM机系统开发实战(四)用户修改删除功能实现

    我们点一下修改,发现页面进行了跳转,跳转到了/toUpdate,并传递了用户的卡号。  我们可以先查看一下用户列表展示界面的前端代码:userlist.jsp,可以看到前端代码中做了跳转的动作,我们需要在后端中完成相应的servlet完成这个动作。  首先,创建UserToUpdateServlet,对用户

    2024年02月13日
    浏览(29)
  • 基于Javaweb实现ATM机系统开发实战(十一)存储交易记录

    首先创建一个业务接口: 再完成业务接口的实现类: 在创建数据层的持久化类: 在存款中调用接口来保存交易记录: 取款中也是一样的: 然后我们重启一下系统,存个钱测试一下; 发现交易记录已经成功保存啦~  代码已上传~

    2024年02月16日
    浏览(35)
  • 基于Javaweb实现ATM机系统开发实战(十四)交易记录分页实现

    还是老规矩,先看前端页面查看需要传递哪些参数,并且把逻辑有问题的部分进行修改~ 创建一个PageBean对象,封装这些数据: 之前我们把查询交易明细的代码都写到Userservice中了,其实应该写到RunMessageService中,对应的数据层和实现类也是同样的操作~ 然后对交易记录的Serv

    2024年02月16日
    浏览(30)
  • 页面置换算法模拟实现-操作系统课程设计基于Java

    存储管理的主要功能之一是合理的分配空间,请求页式存储管理是一种常用的虚拟存储管理技术。在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断,当发生中断时,系统必须在内存选择一个页面移出内存,调用页面置换算法,以便为调入新的页面让

    2024年02月07日
    浏览(28)
  • Java——ATM程序(完整代码详细解析)

    目录 一、需求 二、详细解析 三、完整代码

    2024年02月07日
    浏览(34)
  • 【Java】自动取款机ATM案例

      用户输入密码,如果密码校验通过,就会进入ATM机的主操作界面:有查询、取款、存款、转账等业务功能。 1. 封装数据 首先可以设计一个Account类,来描述账户对象需要封装哪些数据。 2. 欢迎界面 编写一个ATM类,负责对每一个账户对象进行管理,并编写欢迎界面 3. 实现

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包