Java基础项目(ATM系统)

目录

一. ATM系统功能介绍

需要用到的技术方面(都是java基础) :

分析开发流程

二、项目架构搭建、欢迎界面设计

第一步:先来完成Account类的编写

第二步:编写一个ATM类,负责对每一个账户对象进行管理

 第三步:在ATM类中,编写欢迎界面

三、开户功能实现

分析 :

四、登录功能

分析 :

五、展示二级菜单界面

分析:

六、二级菜单子功能实现

1.查询账户

分析 :

代码:

2.存款

分析 :

代码 :

3.取款

分析 :

代码 :

4.转账

分析 :

代码 :

5.修改密码

分析 :

代码 :

6.退出

分析 :

7.注销

分析 :

代码 :


一. ATM系统功能介绍

大家都应该去过银行的ATM机上取过钱,每次取钱的时候,首先需要用户把卡插入机器,然后机器会自动读取你的卡号,由用户输入密码,如果密码校验通过,就会进入ATM机的主操作界面:有查询、取款、存款、转账等业务功能,用户选择哪个功能就执行对应预先设定好的程序。

 由于没有图形化界面编程,所以我们是做不出界面效果的,但是我们可以在控制台模拟ATM机的各项功能。

如下图所示:运行程序时,进入登录界面,在此界面可以登录、或者开户。

  • 在登录界面,如果用户录入1就进入用户登录的功能:如下图所示:

  • 在登录界面,如果用户录入2就进入用户开户的功能:如下图所示

  • 需要用到的技术方面(都是java基础) :

  • 分析开发流程

首先我们来分析一下,开发这个ATM系统的流程:

  • 由于每一个账户都包含一些个人信息,比如:卡号、姓名、性别、密码、余额、每次取现额度等等。所以,首先可以设计一个Account类,用来描述账户对象需要封装那些数据。

  • 紧接着,定义一个ATM类,用来表示ATM系统,负责提供所有的业务需求。

    比如:展示ATM系统的欢迎页面、开户、登录、转账等功能。

  • 最后,定义一个测试类Test,负责启动我们开发好的ATM系统,进行测试。


二、项目架构搭建、欢迎界面设计

第一步:先来完成Account类的编写
public class Account {
    private String cardId;
    private String userName;
    private String password;
    private String gender;
    private double money;
    private double limit;

    public Account() {
    }

    public Account(String cardId, String userName, String password, String gender, double money, double limit) {
        this.cardId = cardId;  //卡号
        this.userName = userName;  //用户名
        this.password = password;  //密码
        this.gender = gender;   //性别
        this.money = money;     //余额
        this.limit = limit;     //限额
    }

    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 String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public double getMoney() {
        return money;
    }

    public void setMoney(double money) {
        this.money = money;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }
}
第二步:编写一个ATM类,负责对每一个账户对象进行管理
public class ATM {
    //创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
    private ArrayList<Account> accounts = new ArrayList<>(); 
    //添加一个测试账户,方便之后使用
    accounts.add(new Account("12345678", "test1", "123123", "男", 100, 10000));   
}
 第三步:在ATM类中,编写欢迎界面
public class ATM {
    public static void main(String[] args) {
        ArrayList<Account> accounts = new ArrayList<>();
        accounts.add(new Account("12345678", "test1", "123123", "男", 100, 10000));
        while (true) {
            System.out.println("---欢迎来到ATM---");
            System.out.println("请输入以下选项");
            System.out.println("1.登录");
            System.out.println("2.开户");
            System.out.println("3.退出");
            Scanner scanner = new Scanner(System.in);
            int choose = scanner.nextInt();
            switch (choose) {
                case 1:
                    login(accounts);
                    break;
                case 2:
                    addAccount(accounts);
                    break;
                case 3:
                    System.out.println("退出成功");
                    return;
            }
        }
    }

三、开户功能实现

分析 :

  • 1、创建一个账户对象,用于封装用户的开户信息

  • 2、需要用户输入自己的开户信息,赋值给账户对象

    • 输入账户名,设置给账户对象

    • 输入性别,如果性别是'男'或者'女',将性别设置给账户对象;否则重新录入性别知道录入正确为止。

    • 输入账户、并且输入两次密码,只有两次密码相同,才将账户和密码设置给账户对象。

    • 输入提现限额,并且设置给账户对象

  • 3、输出开户成功,的提示语句。

/**
     * 开户
     *
     * @param accounts
     */
    public static void addAccount(ArrayList<Account> accounts) {
        Scanner scanner = new Scanner(System.in);
        //输入用户名
        System.out.println("请输入用户名");
        String userName = scanner.next();
        //处理密码问题
        String password;
        while (true) {
            System.out.println("请输入密码");
            password = scanner.next();
            System.out.println("请确认密码");
            String password1 = scanner.next();
            if (password1.equals(password)) {
                break;
            } else {
                System.out.println("输入错误,请再次输入");
            }
        }
        //输入性别
        System.out.println("请输入性别");
        String gender = scanner.next();
        System.out.println("请输入限额");
        double limit = scanner.nextDouble();
        //生成卡号
        String cardId = "";
        Random random = new Random();
        for (int i = 0; i < 8; i++) {
            int c = random.nextInt(10);
            cardId += c;
        }
        //封装数据,打包成一个Account对象
        Account account = new Account(cardId, userName, gender, password, 0, limit);
        accounts.add(account);
        System.out.println("开户成功,你的卡号是:" + cardId);
    }

四、登录功能

分析 :

  • 1、判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作

  • 2、输入登录的卡号,并判断卡号是否存在

  • 3、如果卡号不存在,直接给出提示

  • 4、如果卡号存在,接着输入用户密码,并判断密码是否正确

  • 5、如果密码也正确,则登录成功,并且记录当前的登录账户

/**
     * 登录功能
     *
     * @param accounts
     */
    public static void login(ArrayList<Account> accounts) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入卡号");
        String cardId = scanner.next();
        System.out.println("请输入密码");
        String password = scanner.next();
        Account loginAccount = null;
        for (int i = 0; i < accounts.size(); i++) {
            Account account = accounts.get(i);
            if (account.getCardId().equals(cardId) && account.getPassword().equals(password)) {
                loginAccount = account;
            }
        }
        if (loginAccount == null) {
            System.out.println("登录失败");
        } else {
            System.out.println("登陆成功,欢迎" + loginAccount.getUserName());
            showUserMenu(loginAccount,accounts);
        }
    }

五、展示二级菜单界面

分析:

代码:

 /**
     * 二级菜单
     */
    public static void showUserMenu(Account loginAccount,ArrayList<Account> accounts) {
        while (true) {
            System.out.println("---欢迎使用ATM---");
            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.注销账户");
            Scanner scanner = new Scanner(System.in);
            int choose = scanner.nextInt();
            switch (choose) {
                case 1:
                    showUserInfo(loginAccount);
                    break;
                case 2:
                    addMoney(loginAccount);
                    break;
                case 3:
                    drawMoney(loginAccount);
                    break;
                case 4:
                    transferMoney(loginAccount,accounts);
                    break;
                case 5:
                    boolean result = updatePassword(loginAccount);
                    if (result==true){
                        return;  //结束二级菜单到一级菜单重新登陆
                    }else {
                        break;
                    }

                case 6:
                    System.out.println("退出成功");
                    return;
                case 7:
                   result = loginOut(loginAccount,accounts);
                   if (result){
                       return;
                   }{
                       break;
                }
            }
        }
    }

六、二级菜单子功能实现

(具体实现代码可能没有完全按照分析中的写,自己写的还有一些不严谨也不完美的地方,仅供参考)

以下的所有功能都是方法呈现

1.查询账户

分析 :

代码:

/**
     * 显示用户信息
     *
     * @param loginAccount
     */
    public static void showUserInfo(Account loginAccount) {
        System.out.println("----用户信息----");
        System.out.println("姓名是:" + loginAccount.getUserName());
        System.out.println("卡号是:" + loginAccount.getCardId());
        System.out.println("密码是:" + loginAccount.getPassword());
        System.out.println("性别是:" + loginAccount.getGender());
        System.out.println("余额是:" + loginAccount.getMoney());
        System.out.println("限额是:" + loginAccount.getLimit());
    }

2.存款

分析 :

  1. 键盘录入要存入的金额
  2. 在原有余额的基础上,加上存入金额,得到新的余额
  3. 再将新的余额设置给当前账户对象

代码 :

 /**
     * 存款功能
     *
     * @param loginAccount
     */
    public static void addMoney(Account loginAccount) {
        System.out.println("请将钱放入卡槽中");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要存的的金额");
        double addMoney = scanner.nextDouble();
        loginAccount.setMoney(loginAccount.getMoney() + addMoney);
        System.out.println("存入成功,余额为:" + loginAccount.getMoney());
    }

3.取款

分析 :

  • 1、判断账户余额是否达到了100元,如果不够100元,就不让用户取钱了

  • 2、让用户输入取款金额

  • 3、判断账户余额是否足够

    • 如果余额足够, 继续判断当前取款金额是否超过了每次限额

      • 如果超过限额,提示“每次只能取xxx限额的钱”

      • 如果不超过限额,则在当前余额上减去取钱的金额,得到新的余额

        并将新的余额设置给账户对象。

    • 如果余额不足,提示“你的余额不足,你的账户余额是xxx元”

代码 :

 /**
     * 取钱
     * @param loginAccount
     */
    public static void drawMoney(Account loginAccount){
        System.out.println("请输入取款金额");
        Scanner scanner = new Scanner(System.in);
        int drawMorey = scanner.nextInt();
        if (drawMorey>loginAccount.getMoney()){
            System.out.println("余额不足,当前余额为:"+loginAccount.getMoney());
            return;
        }
        if (drawMorey>loginAccount.getLimit()){
            System.out.println("取款金额超过限额"+loginAccount.getLimit()+"当前余额为:"+loginAccount.getMoney());
            return;
        }
        loginAccount.setMoney(loginAccount.getMoney()-drawMorey);
        System.out.println("取款成功,当前余额为:"+loginAccount.getMoney());
    }

4.转账

分析 :

  • 1、判断系统中是否存在其他账户

  • 2、判断自己的账户中是否有钱

  • 3、真正开始转账了,输入对方卡号

  • 4、判断对方卡号是否正确啊?

  • 5、如果卡号正确,就继续让用户输入姓氏, 并判断这个姓氏是否正确?

    • 如果姓氏不正确,给出提示“对不起,您姓氏有问题,转账失败!”

  • 6、如果姓氏正确,继续判断这个转账金额是否超过自己的余额。

    • 如果转账金额超过余额,给出提示“对不起,余额不足,转账失败!”

  • 7、如果对方卡号存在、姓氏匹配、余额足够,就完成真正的转账操作

    • 获取当前自己账户的余额,减去转账金额,就可以得到自己账户新的余额,

      并将新的余额,设置给当前账户

    • 并且获取对方的账户余额,加上转账金额,就可以得到对方账户新的余额,

      并将新的余额,设置给对方账户

    • 给出提示:“您转账成功了~~~”

代码 :

/**
     * 转账
     * @param loginAccount
     * @param accounts
     */
    public static void transferMoney(Account loginAccount,ArrayList<Account> accounts){
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入转款金额");
        int transferMoney = scanner.nextInt();
        if (transferMoney>loginAccount.getMoney()){
            System.out.println("余额不足,当前余额为:"+loginAccount.getMoney());
            return;
        }
        if (transferMoney>loginAccount.getLimit()){
            System.out.println("转款金额超过限额"+loginAccount.getLimit());
            return;
        }
        System.out.println("请输入对方卡号");
        String cardId = scanner.next();

        Account destAccount = null;
        for (int i = 0; i < accounts.size(); i++) {
            if (accounts.get(i).getCardId().equals(cardId)){
                destAccount=accounts.get(i);
                break;
            }
        }
        if (destAccount==null){
            System.out.println("卡号错误");
            return;
        }else {
            //自己减钱
            loginAccount.setMoney(loginAccount.getMoney()-transferMoney);
            //目标账号加钱
            destAccount.setMoney(destAccount.getMoney()+transferMoney);
            System.out.println("转账成功,当前账户余额为:"+loginAccount.getMoney());

        }

5.修改密码

分析 :

  • 1、提醒用户输入当前密码

  • 2、认证当前密码是否正确

    • 如果认证密码错误,提示“您当前输入的密码不正确~~”;重新输入密码,再次认证密码是否正确。

  • 3、如果认证密码正确,开始修改密码,修改密码时需要用户输入2次新密码

  • 4、判断2次 密码是否一致

    • 如果两次密码一致,就将新密码设置给当前账户对象,密码修改成功

    • 如果两次密码不一直,则给出提示“您输入的2次密码不一致~~”;重新输入新密码,并确认密码。

代码 :

 /**
     * 修改密码
     * @param loginAccount
     * @return
     */
    public static  boolean  updatePassword(Account loginAccount){
        Scanner scanner = new Scanner(System.in);
        //1.提示用户输入原密码
        System.out.println("请输入原密码");
        String updatePassword = scanner.next();
        if (!loginAccount.getPassword().equals(updatePassword)){
            System.out.println("原密码输入错误,请重新尝试");
            return false;
        }
        //2.输入修改后的密码
        System.out.println("请输入新密码");
        String newPassword1 = scanner.next();
        System.out.println("请重新输入密码");
        String newPassword2 = scanner.next();
        if (!newPassword1.equals(newPassword2)){
            System.out.println("两次密码输入不一致,请重新尝试");
            return false;
        }else {
            loginAccount.setPassword(newPassword1);
            System.out.println("密码修改成功");
            return true;
        }
    }
  • 这个是使用在二级菜单中加入了一个判断,如果返回值是true就退出 

6.退出

分析 :

  • 直接在二级菜单中return

7.注销

分析 :

  • 1、先确认是否需要注销账户,让用户输入y或者n

    • 如果输入y,表示确认

    • 如果输入n,表示取消注销操作

  • 2、输入y后,继续判断当前用户的账户是否有钱

    • 如果账户有钱,提示:“对不起,您的账户中存钱金额,不允许销”

    • 如果账户没有钱,则把当前账户对象,从系统的集合中删除,完成注销。

代码 :

/**
     * 注销功能
     * @param loginAccount
     * @param accounts
     * @return
     */
    public static boolean loginOut(Account loginAccount,ArrayList<Account> accounts){
        if (loginAccount.getMoney()>0){
            System.out.println("你的账户还有余额,注销失败");
            return false;
        }
        accounts.remove(loginAccount);
        System.out.println("账户删除成功");
        return true;
    }
  • 这个是使用在二级菜单中加入了一个判断,如果返回值是true就退出

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序一定有bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值