栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java学习案例---ATM系统详细讲解案例(实现基础功能)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java学习案例---ATM系统详细讲解案例(实现基础功能)

此案例是通过学习黑马程序员的视频学习仿写的,如有雷同,纯属意外

~~~~~~~~~~~~~~~~~~~~~~~~~~~源代码在文章最下方~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

目录

银行ATM系统技术选型分析:

1.   账户类,首页设计 

2.   用户开户功能实现   

3.  用户登录功能实现

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

5.   用户存款,取款功能设计 

6.  用户转账功能 

7.  修改密码和销户


银行ATM系统技术选型分析: ① 面向对象编程 每个用户对象要对应一个账户对象: 所以需要设计账户类Account ② 使用集合容器 系统需要提供一个容器用于存储这些账户对象的信息,我们选ArrayList集合。 ③ 程序流程控制 需要结合分支、循环、跳转等相关操 作控制程序的业务逻辑。 ④ 使用常见API 内容比较,分析,数据处理等需要用 到String等常用API ---------------------------------------------------------------------------------------------------------------------------

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

定义的账户类

package ATM案例;

public class account {
    private String cardNumber;//卡号
    private String  passWord;//密码
    private String name;//开户名
    private double money;//余额
    private double limitMoney;//限制当前取额


    public account() {
    }
    public account(String cardNumber, String passWord, String name , double limitMoney) {
        this.cardNumber = cardNumber;
        this.passWord = passWord;
        this.name = name;
        this.money = money;
        this.limitMoney = limitMoney;
    }

    public String getCardNumber() {
        return cardNumber;
    }
    public void setCardNumber(String cardNumber) {
        this.cardNumber = cardNumber;
    }

    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 getMoney() {
        return money;
    }
    public void setMoney(double money) {
        this.money = money;
    }
    public double getLimitMoney() {
        return limitMoney;
    }

    public void setLimitMoney(double limitMoney) {
        this.limitMoney = limitMoney;
    }
}

2.   用户开户功能实现   

分析

① 开户功能应该独立定义成方法,并传入当前集合对象给该方法

② 需要提示用户输入个人信息, 开户的卡号是系统自动生成的 8 位数 ③ 注意:自动生成的卡号不能与其他用户的卡号重复 ④ 最终把用户开户的信息封装成 Account对象,存入到集合中

3.  用户登录功能实现 分析 ① 需要根据卡号去集合中查询对应的账户对象 ② 如果找到了账户对象,说明卡号存在,继续输入密码 ③ 如果密码也正确,则登录成功

4.  用户操作页设计,查询账户,退出账户功能  分析 ① 需要根据卡号去集合中查询对应的账户对象 ② 如果找到了账户对象,说明卡号存在,继续输入密码 ③ 如果密码也正确,则登录成功

5.   用户存款,取款功能设计 

存款分析 ① 存款是拿到当前用户的账户对象 ② 通过调用账户对象的 set 方法修改其余额 ③当存钱完成后提示用户账户余额 取款分析 ①先判断账户余额是否大于等于100 ②再判断取款金额是否超过账户余额 ③再判断取款金额是否超过此次限额 ④ 通过调用账户对象的 set 方法修改其余额,取款成功后提示账户余额

6.  用户转账功能 

分析

①先判断系统中是否存在两个及以上的账号

②判断自己账户是否有钱,接下来输入对方卡号,判断其卡号是否存在

③对方账户存在还需要确认对方的姓氏

④满足所有要求即可转账到对方账户中去

7.  修改密码和销户 分析 ① 修改密码就是把当前对象的密码属性使用 set 方法进行更新。 ② 销户是从集合对象中删除当前对象,并回到首页。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~全部代码~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
package ATM案例;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //1.定义一个账户信息类account用于存储账户信息

        //2.定义一个Arraylist集合,用于存储账户信息
        ArrayList accounts = new ArrayList<>();

        //3.创建欢迎界面,封装成方法
        showMain(accounts, sc);


    }

    //登录的方法
    private static void enterUser(ArrayList accounts, Scanner sc) {
        //1.先判断系统中是否存在用户
        if (accounts.size() > 0) {
            System.out.println("=======欢迎进入勇士Warriors银行登录详情界面======");
            while (true) {
                //2.让用户输入卡号
                System.out.println("请输入你要登录的卡号");
                String cardId = sc.next();
                //3.调用查询用户的方法,判断用户输入的卡号是否存在
                account acc = judgeRe(accounts, cardId);
                if (acc != null) //存在该卡号
                {
                    //4.判断用户输入的密码是否正确
                    while (true) {
                        System.out.println("请输入密码:");
                        String passWord = sc.next();

                        if (passWord.equals(acc.getPassWord())) {
                            //密码正确
                            System.out.println("勇士" + acc.getName() + "贵宾,欢迎您进入系统,您的卡号是" + acc.getCardNumber());
                            //5.密码输入正确进入操作页
                            userInterface(accounts, acc, sc);//进去操作页界面
                            return;//继续结束登录方法
                        } else {
                            System.out.println("密码输入错误,请重新输入");
                        }
                    }
                } else {
                    System.out.println("此卡号不存在,请重新输入");
                }
            }

        } else {//不存在该卡号
            System.out.println("系统中没有账户,请先注册账户");
        }
    }

    //操作页方法
    private static void userInterface(ArrayList accounts, account acc, Scanner sc) {
        while (true) {
            System.out.println("=======欢迎进入勇士Warriors银行用户操作界面======");
            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("请选择需要的功能,(输入1-7)");
            //用户选择需要的功能
            int userChoice = sc.nextInt();
            switch (userChoice) {
                case 1:
                    //查询
                    inquire(acc);
                    break;
                case 2:
                    //存款
                    deposit(acc, sc);
                    break;
                case 3:
                    //取款
                    fetchMoney(acc, sc);
                    break;
                case 4:
                    // 转账
                    transferMoney(accounts, acc, sc);
                    break;
                case 5:
                    //修改密码
                    amendPassWord(acc,sc);
                    break;
                case 6:
                    //退出
                    System.out.println("欢迎下次光临~~");
                    return;//结束当前操作的方法
                case 7:
                    //注销当前账户
                    logoutAccount(accounts,acc,sc);
                    return;
                default:
                    System.out.println("没有该命令,请重新选择:");
            }
        }
    }

    //注销账户的方法
    private static void logoutAccount(ArrayList accounts ,account acc, Scanner sc) {
        System.out.println("===========注销账户==============");
        while (true) {
            System.out.println("您正在进行销户操作,请知晓!");
            System.out.println("请输入确定来销户");
            String rs= sc.next();
            if (rs.equals("确定"))
            {
                accounts.remove(acc);
                System.out.println("销户成功");
                return;
            }
        }
    }

    //修改密码的方法
    private static void amendPassWord(account acc, Scanner sc) {
        System.out.println("===========修改密码==============");
        //通过两次确认密码来修改
        while (true) {
            System.out.println("请输入你要修改的密码:");
            String passWord1= sc.next();
            System.out.println("请再次输入你要修改的密码:");
            String passWord2= sc.next();
            if (passWord1.equals(passWord2))
            {
                acc.setPassWord(passWord1);
                System.out.println("密码修改成功,修改后的密码是:" + acc.getPassWord() + ",请妥善保管");
                break;
            }else
                System.out.println("两次密码输入不一致,请重新输入两次密码");
        }
    }

    //转账的方法
    private static void transferMoney(ArrayList accounts, account acc, Scanner sc) {
        //1.判断自己账户是否有钱
        if (acc.getMoney() <= 0) {
            System.out.println("自己都没钱就别转了吧!!!");
            return;
        }
        //2.判断系统中是否存在两个及以上的账号
        if ((accounts.size() >= 2)) {
            System.out.println("============欢迎进入到转账界面======");
            while (true) {
                //3.输入对方卡号
                System.out.println("请输入对方卡号:");
                String sideCardNum = sc.next();

                //4.根据卡号查询出集合中的账户对象,判断其卡号是否存在
                account otherAcc = judgeRe(accounts, sideCardNum);

                //5.判断账户对象是否存在,而且这个账户对象不能是自己。
                if (otherAcc != null) {
                    if (otherAcc.getCardNumber().equals(acc.getCardNumber())) {
                        System.out.println("不能给自己转账");
                    } else {
                        //~~~~~~~~~~~~所有条件通过,进入正式的转账逻辑~~~~~~~~~~~~~~~

                        //6.通过get出姓名然后通过ArrayList自带的API startWith来判断是否以输入的姓氏开始
                        String rs = '*' + otherAcc.getName().substring(1);
                        System.out.println("您当前要为" + rs + "转账");
                        System.out.println("请您输入姓氏来确认");
                        String c = sc.next();

                        //7.姓氏输入正确,进入转账
                        if (otherAcc.getName().startsWith(c)) {
                            while (true) {
                                System.out.println("请您输入转账的金额,您最多可以转账" + acc.getMoney() + "元");
                                double money = sc.nextDouble();
                                if (money > acc.getMoney()) {
                                    System.out.println("转账金额大于您账户当前金额,无法完成转账!!!");
                                } else {
                                    acc.setMoney(acc.getMoney() - money);
                                    otherAcc.setMoney(otherAcc.getMoney() + money);
                                    System.out.println("转账完成,您账户当前余额为:" + acc.getMoney() + "元");
                                    return;
                                }
                            }
                        } else {
                            System.out.println("输入姓氏有误!");
                        }
                    }
                } else {
                    System.out.println("对方卡号不存在!!!");
                }
            }
        } else {
            System.out.println("系统中账户低于两个,无法完成转账");
        }
    }

    //取款方法
    private static void fetchMoney(account acc, Scanner sc) {
        System.out.println("===========取款操作==============");

        //1.判断账户余额是否大于等于100
        if (acc.getMoney() >= 100) {
            while (true) {
                // 2.输入取钱的金额
                System.out.println("请输入你要取款的金额");
                double takeMoney = sc.nextDouble();
                // 3.判断当前取钱金额是超过了账户的余额
                if (takeMoney > acc.getMoney()) {
                    System.out.println("取款金额超过账户余额,余额不足~~~~~");
                } else {
                    //4.判断当前取钱金额是超过了此次限额
                    if (takeMoney > acc.getLimitMoney()) {
                        System.out.println("此次取款金额超过当次限额!!!!");
                    } else {
                        //5.更新账户余额并输出
                        acc.setMoney(acc.getMoney() - takeMoney);
                        System.out.println("取款成功,您的账户余额为:" + acc.getMoney() + "元");
                        break;
                    }
                }
            }
        } else {
            System.out.println("账户余额低于100元,请先去存款");
            return;
        }
    }

    //存款方法
        private static void deposit(account acc, Scanner sc) {
        System.out.println("===========存钱操作==============");
        System.out.println("请您输入需要存款的金额");
        double storeMoney = sc.nextDouble();
        //将账户余额和存入金额相加
        storeMoney += acc.getMoney();
        acc.setMoney(storeMoney);
        System.out.println("您已存款成功,您当前账户有" + acc.getMoney() + "元存款");


    }

    //用户查询的方法
    private static void inquire(account acc) {
        System.out.println("===========查询账户信息操作=========");
        System.out.println("您的账户信息如下:");
        System.out.println("卡号:" + acc.getCardNumber());
        System.out.println("姓名:" + acc.getName());
        System.out.println("余额:" + acc.getMoney());
        System.out.println("当前取现额度:" + acc.getLimitMoney());
    }

    //将欢迎界面封装成的方法
    public static void showMain(ArrayList accounts, Scanner sc) {
        System.out.println("=======欢迎进入勇士Warriors银行用户注册界面======");
        while (true) {
            System.out.println("1.登录账户");
            System.out.println("2.注册账户");
            System.out.println("请输入命令1,2选择对应的操作:");
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    //登录
                    enterUser(accounts, sc);//调用登录的方法
                    break;
                case 2:
                    //开户
                    openAccount(accounts, sc);//调用开户的方法
                    break;
                default:
                    System.out.println("你输入的命令不存在,请重新输入:");
                    break;
            }
        }
    }

    //开户的方法
    public static void openAccount(ArrayList accounts, Scanner sc) {

        //1.录取相关的账户信息
        System.out.println("=======欢迎进入勇士Warriors银行开户界面======");

        System.out.println("请输入您的开户名:");
        String Name = sc.next();

        String passWord = "";
        while (true) {
            System.out.println("请输入您的密码:");
            passWord = sc.next();
            System.out.println("请再次确认密码");
            String okPassWord = sc.next();
            //判断两次密码是否相同
            if (passWord.equals(okPassWord)) {
                break;
            } else
                System.out.println("两次密码必须一致~~~~:");
        }

        System.out.println("请您输入当次限额:");
        double limitMoney = sc.nextDouble();

        //2.生成八位不重复的账户卡号
        String cardNum = createCardNum(accounts);

        //3.创建一个用户对象封装账户的信息,这里初始金额不能自己指定,需要改造一下有参构造器
        account account = new account(cardNum, passWord, Name, limitMoney);

        //4.将账户信息添加到账户集合中去
        accounts.add(account);
        System.out.println("恭喜你开户成功,卡号为:" + account.getCardNumber());
    }

    //生成八位数不重复的卡号的方法
    public static String createCardNum(ArrayList accounts) {
        Random num = new Random();
        while (true) {
            String cardNum = "";//定义一个String变量存储卡号
            //随机生成八位数卡号
            for (int i = 0; i < 8; i++) {
                int j = num.nextInt(10);
                cardNum += j;
            }

            //判断卡号是否重复
            account acc = judgeRe(accounts, cardNum);
            if (acc == null) {
                //说明卡号没有重复
                return cardNum;
            }
        }
    }

    //根据卡号查询对象
    public static account judgeRe(ArrayList accounts, String cardNum) {
        for (int i = 0; i < accounts.size(); i++) {
            account acc = accounts.get(i);
            if (acc.getCardNumber().equals(cardNum)) {
                return acc;
            }
        }
        return null;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1005786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号