ATM系统设计

Account

package com.item.huang;

public class Account {
    private String idCard;
    private String userName;
    private char sex;
    private String passWord;
    private double money;
    private double limit;//限额

    public String getIdCard() {
        return idCard;
    }

    public void setIdCard(String idCard) {
        this.idCard = idCard;
    }

    public String getUserName() {
        return userName + (sex == '男' ? "先生" : "女士");
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    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 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

package com.item.huang;

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

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account logicAccount = new Account();
    //启动ATM系统,展示欢迎界面
    public void start(){
        while (true) {
            System.out.println("=====欢迎来到ATM系统======");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("3.显示所有用户账户信息");
            System.out.println("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //用户登录
                    logic();
                    break;
                case 2:
                    //用户开户
                    createAccount();
                    break;
                case 3:
                    //显示所有用户账户信息
                    showAllAccount();
                    break;
                default:
                    System.out.println("没有该操作!!!");
            }
        }
    }

    //完成用户开户操作
    private void createAccount(){
        System.out.println("===欢迎进行用户开户===");
        //1.创建一个账户对象
        Account account = new Account();
        //2.添加用户信息
        System.out.println("请输入用户姓名:");
        String userName = sc.next();
        account.setUserName(userName);

        while (true) {
            System.out.println("请输入用户性别:");
            char sex = sc.next().charAt(0);
            if(sex == '男' || sex == '女'){
                account.setSex(sex);
                break;
            }else{
                System.out.println("你输入的性别有问题!!!");
            }
        }

        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("两次输入的密码不相同!!!");
            }
        }

        System.out.println("请输入每次取现额度:");
        double limit = sc.nextDouble();
        account.setLimit(limit);

        //3.系统生成随机8位卡号并且不重复
        account.setIdCard(createIdCard());
        System.out.println("尊敬的"+account.getUserName()+"您的卡号是:"+account.getIdCard());

        //4.将账户添加到ATM机中
        accounts.add(account);
    }

    //生成随机8位卡号
    private String createIdCard(){
        while (true) {
            String idCard = "";
            Random random = new Random();
            for (int i = 0; i < 8; i++) {
                idCard += random.nextInt(10);
            }
            Account account = getAccountByIdCard(idCard);
            //账户不存在,返回卡号
            if (account == null) {
                return idCard;
            } else {
                System.out.println("该卡号已存在!!!");
            }
        }
    }

    //返回一个账户对象(卡号不重复)
    private Account getAccountByIdCard(String idCard){
        //1.遍历账户集合,返回对应卡号的账户
        Account account = new Account();
        for (int i = 0; i < accounts.size(); i++) {
            account = accounts.get(i);
            if(account.getIdCard().equals(idCard)) {
                return accounts.get(i);
            }
        }
        //2.反之,返回空账户
        return null;
    }

    //用户登录
    private void logic(){
        while (true) {
            System.out.println("=====登录系统=====");
            if (accounts.size()==0){
                System.out.println("当前系统没有账户!!!");
                return;
            }else{
                while (true) {
                    System.out.println("请输入卡号:");
                    String idCard = sc.next();
                    Account account = getAccountByIdCard(idCard);
                    while (true) {
                        if (account==null){
                            System.out.println("卡号不正确!!!");
                            break;
                        }else{
                            while (true) {
                                System.out.println("请输入账户密码:");
                                String passWord = sc.next();
                                if (account.getPassWord().equals(passWord)){
                                    System.out.println("恭喜你"+account.getUserName()+"登陆成功!!!"+"你的卡号是:"+account.getIdCard());
                                    logicAccount = account;
                                    showUserCommand();
                                    return;
                                }
                                else{
                                    System.out.println("密码不正确!!!");
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    //用户操作页
    private void showUserCommand(){
        while (true) {
            System.out.println("=====用户功能菜单=====");
            System.out.println(logicAccount.getUserName()+"您可以选择如下功能!!!");
            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、注销当前账户");
            int command = sc.nextInt();
            switch (command){
                case 1 :
                    //查询账户
                    showLogicAccount();
                    break;
                case 2 :
                    //存款
                    depositMoney();
                    break;
                case 3 :
                    //取款
                    drawMoney();
                    break;
                case 4 :
                    //转账
                    transferMoney();
                    break;
                case 5 :
                    //密码修改
                    upDataPassword();
                    return;
                case 6 :
                    //退出
                    System.out.println(logicAccount.getUserName()+"您已退出系统!!!");
                    return;
                case 7 :
                    //注销当前账户
                    if (deleteAccount()){
                        return;
                    }else {
                        break;
                    }
                default:
                    System.out.println("输入的命令错误!!!");
            }
        }
    }

    //修改密码
    private void upDataPassword() {
        while (true) {
            System.out.println("=====修改密码=====");
            System.out.println("请输入密码:");
            String passWord = sc.next();
            if (passWord.equals(logicAccount.getPassWord())){
                while (true) {
                    //认证成功
                    System.out.println("请输入新密码:");
                    String newPassWord = sc.next();
                    System.out.println("请再次输入新密码:");
                    String okPassWord = sc.next();
                    if (newPassWord.equals(okPassWord)){
                        //两次密码相同
                        logicAccount.setPassWord(okPassWord);
                        System.out.println("恭喜成功修改密码!!!");
                        return;
                    }else {
                        System.out.println("两次输入的密码不相同!!!");
                    }
                }
            }else {
                System.out.println("输入的密码不正确!!!");
                return;
            }
        }

    }

    //销户
    private boolean deleteAccount() {
        while (true) {
            System.out.println("=====销户操作=====");
            System.out.println("是否要注销账户Y/N");
            String command = sc.next();
            switch (command){
                case "Y":
                    //确定销户
                    if (logicAccount.getMoney()==0){
                        //允许销户
                        accounts.remove(logicAccount);
                        System.out.println("销户成功!!!");
                        return true;
                    }else {
                        System.out.println("账户内有现金"+logicAccount.getMoney()+"元不允许销户!!!");
                        return false;
                    }
                case  "N":
                    //不销户
                    return false;
            }
        }
    }

    //转账(转钱给自己本质上钱不会发生变化)
    private void transferMoney() {
        System.out.println("=====转账操作=====");
        if (logicAccount.getMoney()<0.01){
            System.out.println("抱歉您的余额不足!!!");
            return;
        }
        if (accounts.size()<2){
            System.out.println("抱歉您目前是ATM系统唯一的账户,无法为其他账户转账!!!");
            return;
        }
        //余额足够且ATM系统账户数足够,可以进行转账操作
        while (true) {
            System.out.println("请输入对方的卡号:");
            String idCard = sc.next();
            Account account = getAccountByIdCard(idCard);
            if(account == null){
                System.out.println("该账户不存在!!!");
                break;
            }else {
                //账号存在
                System.out.println("请输入该账户户主 "+"*"+account.getUserName().substring(1)+"的姓氏:");
                String preName = sc.next();
                if (account.getUserName().startsWith(preName)){
                    //可以转账
                    while (true) {
                        System.out.println("请输入转账金额:");
                        double money = sc.nextDouble();
                        if (logicAccount.getMoney()>=money){
                            //金额足够
                            //转账人的账户金额变化
                            logicAccount.setMoney(logicAccount.getMoney()-money);
                            System.out.println("您转账"+money+"元,账户余额为"+logicAccount.getMoney()+"元");
                            //被转账人的账户金额变化
                            account.setMoney(account.getMoney()+money);
                            return;
                        }else {
                            System.out.println("您的余额不足为"+logicAccount.getMoney());
                        }
                    }

                }else {
                    System.out.println("您输入的姓氏错误!!!");
                    break;
                }
            }
        }
    }

    //取钱
    private void drawMoney() {
        System.out.println("=====欢迎取钱=====");
        if (logicAccount.getMoney() < 100){
            System.out.println("您的余额不足!!!");
            return;
        }else{
            //余额足够
            while (true) {
                System.out.println("请输入你的取款金额:");
                double money = sc.nextDouble();
                if (money > logicAccount.getLimit()){
                    System.out.println("取款金额大于取款限额!!!");
                }else{
                    logicAccount.setMoney(logicAccount.getMoney()-money);
                    System.out.println("恭喜您取钱成功,账户余额为"+logicAccount.getMoney());
                    return;
                }
            }

        }
    }

    //存钱
    private void depositMoney() {
        System.out.println("=====欢迎存钱=====");
        System.out.println("请输入存款金额:");
        double money = sc.nextDouble();
        logicAccount.setMoney(logicAccount.getMoney()+money);
        System.out.println("恭喜您存钱成功,账户余额为"+logicAccount.getMoney());
    }

    //查询账户-登录用户
    private void showLogicAccount(){
        System.out.println("=====当前你的账户信息如下=====");
        System.out.println("卡号:"+logicAccount.getIdCard());
        System.out.println("户主:"+logicAccount.getUserName());
        System.out.println("性别:"+logicAccount.getSex());
        System.out.println("余额:"+logicAccount.getMoney());
        System.out.println("每次取现额度:"+logicAccount.getLimit());
    }
    //显示当前所有账户信息
    private void showAllAccount(){
        if (accounts.size()==0){
            System.out.println("目前没有账户!!!");
            return;
        }
        System.out.println("=====显示所有用户信息=====");
        for (int i = 0; i < accounts.size(); i++) {
            System.out.println("户主:"+accounts.get(i).getUserName());
            System.out.println("性别:"+accounts.get(i).getSex());
            System.out.println("卡号:"+accounts.get(i).getIdCard());
            System.out.println("密码:"+accounts.get(i).getPassWord());
            System.out.println("余额: "+accounts.get(i).getMoney());
            System.out.println("每次取现限额:"+accounts.get(i).getLimit());
            System.out.println("=================================");
        }
    }
}

Test

package com.item.huang;

/*系统架构搭建:
* 1.定义一个账户类Account类,至少需要包含(卡号、姓名、性别、密码、余额、每次取现额度)
* 2.定义一个ATM类,用来代表ATM系统,负责提供所有的业务需求,比如:展示ATM的系统欢迎页、开通账户、转账...)
* 3.定义一个测试类,负责对我们开发的ATM系统进行测试。
*
* 1.系统欢迎页设计:在ATM类中设计一个方法start(),方法里负责展示欢迎界面。
* 2.用户开户功能:新增一个账户,也就是往系统的账户集合中添加一个账户对象
*   账户的要求:用户信息包含:姓名、性别、密码、每次取现额度、卡号(由系统生成,要求是8位的数字组成且卡号不能重复)
* 3.用户登录功能:
*   如果系统没有任何账户对象,则不允许登录。
*   让用户输入登录的卡号,先判断卡号是否则正确,如果不正确要给出提示。
*   如果卡号正确,在让用户输入账户密码,如果密码不正确要给出提示,如果密码也正确,则给出登录成功的提示。
* 需要设计一个返回一个账户对象(卡号不重复)功能和生成随机8位卡号功能
* 4.用户操作页设计、查询账户、退出账户功能(在ATM类增加一个登录成功账户)
*   用户登录成功后,需要进入用户操作页
*   查询就是直接展示当前登陆成功的用户的账户信息
*   退出账户就是回到欢迎页面
* 5.用户存钱功能:用户为自己的账户存钱,存钱后更新账户的余额
* 6.用户取钱功能:
*   需要先判断账户的余额是否>=100,如果够,让用户输入取款金额
*   需要判断取款金额是否超过了当次限额,以及余额是否足够
* 7.用户转账功能:
*   把钱转给别人,转账前需要判断:
*   自己账户是否有钱,系统中是否有其他账户
*   接下来让用户输入对方卡号,判断对方账户是否存在,账户如果存在,还需要认证对方账户的户主姓氏
* 8.注销操作功能:
*   首先询问用户是否要注销账户,如果不确定,则回到操作界面
*   如果确定,要判断用户的账户中是否有钱,有则不允许销户,并回到操作界面
*   如果没钱,则完成销户,并回到欢迎页
* 9.密码修改功能:
*   认证用户当前密码
*   认证通过后,需要让用户输入2次新密码
*   两次密码一样,则更新账户密码,并回到欢迎页面
 */

public class Test {
    public static void main(String[] args) {
        //1.创建一个ATM对象,代表ATM系统
        ATM atm = new ATM();

        //2.调用ATM对象的start方法,启动系统
        atm.start();

    }
}

posted @ 2024-03-27 23:33  qing集  阅读(5)  评论(0编辑  收藏  举报