Java模拟ATM系统

前言:本项目为了更深的理解java语言的面向对象原理

目录

一、项目目标

二、技术分析

1、面向对象

2、使用集合进行存储用户数据

3、简单的流程控制

三、实现步骤

1、Test类进行测试

2、Account类账户对象

3、ATM类银行系统

1、用户展示界面

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

3、用户登录

4、用户查询账户、退出账户功能

5.用户存款、取款功能

6.用户转账功能

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

四、完整代码

1、Account类

2、ATM类

3、Test测试类


一、项目目标

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

二、技术分析

1、面向对象

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

2、使用集合进行存储用户数据

系统需要提供一个容器用于存储这些账户对象的信息,利用ArrayList集合及其方法

3、简单的流程控制

结合顺序、选择、循环、等相关操作控制程序的业务逻辑

三、实现步骤

1、Test类进行测试

创建一个ATM对象

public class Test {
    public static void main(String[] args) {
        //创建一个ATM的对象
        ATM atm = new ATM();
        //用对象调用start()方法,启动程序
        atm.start();
    }
}

2、Account类账户对象

    private String cardId;//卡号
    private String userName;//用户名称
    private char sex;//性别'男'或'女'
    private String password;//密码
    private double money;//余额
    private double limit;//取现限额

每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、性别、余额、取现额度、密码)
需要定义一个ArrayList的集合用于存储账户对象。

还要给出相应的get()和set()方法,方便存取数值

3、ATM类银行系统

1、用户展示界面

需要展示欢迎页包含2个功能:用户登录、用户开户

System.out.println("-----欢迎你进入到ATM系统-----");
System.out.println("1、用户登录");
System.out.println("2、用户开户");
System.out.println("请选择您的操作:");

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

private void creataccount()

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

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

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

3、用户登录

 需要根据卡号去集合中查询对应的账户对象。

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

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

4、用户查询账户、退出账户功能

 用户登录成功后,需要进入用户操作页。

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

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

5.用户存款、取款功能

存款和取款都是拿到当前用户的账户对象。

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

6.用户转账功能

转账功能要分析最少有两个账户是否存在的问题。

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

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

修改密码就是把当前对象的密码属性使用set方法进行更新。

注意:如果账户还有余额,则不可销户

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

修改密码时要输入当前密码,修改成功后要回到欢迎界面

四、完整代码

1、Account类

public class Account {
    private String cardId;//卡号
    private String userName;//用户名称
    private char sex;//性别'男'或'女'
    private String password;//密码
    private double money;//余额
    private double limit;//取现限额

    public String getCardId() {
        return cardId;
    }

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

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

2、ATM类

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

public class ATM {
    private ArrayList<Account> accountlist = new ArrayList<>();
    private Scanner sc = new Scanner(System.in);
    private Account loginAcc;//作为登录后的用户
    /**启动*/
    public void start(){
        while (true) {
            System.out.println("-----欢迎你进入到ATM系统-----");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请选择您的操作:");
            int command = sc.nextInt();
            switch(command){
                case 1:
                    //用户登录
                    login();
                    break;
                case 2:
                    //用户开户
                    creataccount();
                    break;
                default:
                    System.out.println("您的输入有误,请重新输入!");
            }
        }
    }
    /** 用户登录*/
    private void login(){
        System.out.println("您正在进行登录操作~~");
        //判断系统中有没有账户
        if(accountlist.size() == 0){
            System.out.println("当前系统中无账户,请先开户~~");
            return;
        }
        //存在账户,输入卡号登录
        while (true) {
            System.out.println("请输入您的卡号:");
            String cardId = sc.next();
            Account acc = Isused(cardId);//Isused()方法判断账户中有没有对应的卡号
            //如果没有卡号,我这里要求再次输入用while循环
            if(acc == null){
                System.out.println("系统中没有找到您输入的卡号,请确认~~");
            }else{
                while (true) {
                    System.out.println("请输入您的密码:");
                    String password = sc.next();
                    //判断密码是否正确
                    if(acc.getPassword().equals(password)){
                        System.out.println("恭喜您," + acc.getUserName() + "登录成功!" + "您的卡号是:" + acc.getCardId());
                        //登录成功后的其他功能
                        loginAcc = acc;
                        showUserCommand();
                        return;//跳出并结束当前方法,回到start()方法
                    }else{
                        System.out.println("您输入的密码有误,请确认");//提示用户再次登录
                    }
                }
            }
        }
    }
    /** 展示登录后操作界面*/
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.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:
                    //查询账户
                    showLoginAccount();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    drawMoney();
                    break;
                case 4:
                    //转账
                    transferMoney();
                    break;
                case 5:
                    //密码修改
                    updataPassword();
                    return;
                case 6:
                    //退出
                    System.out.println(loginAcc.getUserName() + "您退出系统成功~~");
                    return;//跳出并结束当前方法
                case 7:
                    //注销当前账户
                    if(deleteAccount()){
                        return;
                    }
                    break;
                default:
                    System.out.println("您的输入有误,请确认~~");
            }
        }
    }
    /**1、查询账户*/
    private void showLoginAccount(){
        System.out.println("当前您的账户信息如下:");
        System.out.println("卡号:" + loginAcc.getCardId());
        System.out.println("账户:" + loginAcc.getUserName());
        System.out.println("性别:" + loginAcc.getSex());
        System.out.println("余额:" + loginAcc.getMoney());
        System.out.println("每次取现额度:" + loginAcc.getLimit());
    }
    /** 2、存款*/
    private void depositMoney(){
        System.out.println("您正在进行存钱:");
        System.out.println("请输入您的存款金额:");
        double money = sc.nextDouble();
        //更新当前账户的余额
        loginAcc.setMoney(loginAcc.getMoney() + money);
        //提示用户
        System.out.println("恭喜您,您存钱是:"+ money + "您现在的余额是:" + loginAcc.getMoney());
    }

    /** 3、取款*/
    private void drawMoney(){
        System.out.println("您正在取钱:");
        //判断余额是否大于100
        if(loginAcc.getMoney() < 100){
            System.out.println("您的余额不足100,不能取钱~~");
            return;
        }
        while (true) {
            //输入取款金额
            System.out.println("请输入您的取款金额:");
            double money = sc.nextDouble();
            //判断余额是否足够
            if(loginAcc.getMoney() >= money){
                //余额足够
                //还要判断是否超过了限额
                if(money > loginAcc.getLimit()){
                    System.out.println("您输入的金额超过了限额,你的限额是:" + loginAcc.getLimit());
                }else{
                    //到这里,就可以取钱了,只需要更新余额就可以了
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("您取款成功,取款金额是:" + money + ",剩余额度是:" + loginAcc.getMoney());
                    return;//退出当先方法,这里用break也可以
                }
            }else{
                System.out.println("余额不足,您的余额是:" + loginAcc.getMoney());
            }
        }
    }

    /** 4、转账*/
    private void transferMoney(){
        System.out.println("您正在进行转账:");
        //判断用户数量>=2才可以转账
        if(accountlist.size() < 2){
            System.out.println("系统中只有您一个账户无法转账~~");
        }
        //判断自己是否有钱
        if(loginAcc.getMoney() == 0){
            System.out.println("您自己都没钱,就不要转了~~");
        }
        //可以转账了
        while (true) {
            System.out.println("请您输入对方的卡号:");
            String cardId = sc.next();
            //判断对方的卡号是否正确
            Account acc = Isused(cardId);
            if(acc == null){
                System.out.println("您输入的对方卡号不存在~~");
            }else{
                //对方账户存在就可以转账了
                while (true) {
                    System.out.println("请您输入转账金额:");
                    double money = sc.nextDouble();
                    //判断余额是否大于转账金额
                    if(loginAcc.getMoney() >= money){
                        //更新余额即可
                        loginAcc.setMoney(loginAcc.getMoney() - money);
                        acc.setMoney(acc.getMoney() + money);
                        System.out.println("您转账成功~~");
                        return;
                    }else{
                        System.out.println("您的余额不足转账~~,您最多可以转账:" + loginAcc.getMoney());
                    }
                }
            }
        }

    }

    /** 5、密码修改*/
    private void updataPassword(){
        System.out.println("您正在修改密码:");
        while (true) {
            System.out.println("请确认当前密码:");
            String password = sc.next();
            if(loginAcc.getPassword().equals(password)){
                while (true) {
                    System.out.println("请输入新密码:");
                    String newpassword = sc.next();
                    System.out.println("请再次输入新密码:");
                    String okpassword = sc.next();
                    if(newpassword.equals(okpassword)){
                        loginAcc.setPassword(okpassword);
                        System.out.println("您的密码修改成功~~");
                        return;
                    }else{
                        System.out.println("您输入的两次密码不一致~~");
                    }
                }
            }else{
                System.out.println("密码输入有误,请确认~~");
            }
        }
    }
    /** 7、注销当前账户*/
    private boolean deleteAccount(){
        System.out.println("您正在进行销户:");
        System.out.println("您确认销户吗? ’yes‘/'no'");
        String command = sc.next();
        switch (command){
            case "yes":
                //判断账户中余额是否为0
                if(loginAcc.getMoney() == 0){
                    accountlist.remove(loginAcc);
                    System.out.println("您已销户成功~~");
                    return true;
                }else{
                    System.out.println("您的账户余额是:" + loginAcc.getMoney() + ",您还不可以销户~~");
                    return false;
                }
            default:
                System.out.println("好的,给您保留账户~~");
                return false;
        }

    }
    /**用户开户*/
    private void creataccount(){
        System.out.println("您正在进行开户操作~~");
        //创建一个用户对象acc
        Account acc = new Account();
        //提示用户
        System.out.println("请输入您的用户名称:");
        String name = sc.next();
        acc.setUserName(name);

        while (true) {
            System.out.println("请输入您的性别:");
            char sex = sc.next().charAt(0);//'男'
            if(sex == '男'||sex == '女'){
                acc.setSex(sex);
                break;
            }
            else{
                System.out.println("您的输入有误,性别只能是男或是女");
            }
        }
        //输入密码
        while (true) {
            System.out.println("请输入您的密码:");
            String password = sc.next();
            System.out.println("请您再次输入您的密码:");
            String okpassword = sc.next();
            if(password.equals(okpassword)){
                acc.setPassword(okpassword);
                break;
            }
            else System.out.println("您输入的两次密码不一致!");
        }
        //取现额度
        System.out.println("请输入您的取现额度:");
        double limit = sc.nextDouble();
        acc.setLimit(limit);

        //系统生成一个8位数的卡号,还要保证不重复
        acc.setCardId(creatcardId());

        accountlist.add(acc);
        System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
    }
    /**生成卡号*/
    private String creatcardId(){
        while (true) {
            String cardId = "";//存放卡号
            Random r = new Random();
            //使用8次循环,生成8位数字的卡号
            for (int i = 0; i < 8; i++) {
                int num = r.nextInt(10);//生成0~9的数
                cardId += num;
            }
            //此时不可以直接返回卡号,还要判断卡号是否重复。
            Account acc = Isused(cardId);
            //说明卡号不重复
            if(acc == null){
                return cardId;
            }
        }
    }
    /**判断卡号是否重复的方法,传递我们要判断的卡号*/
    private Account Isused(String cardId){
        //遍历ArrayList集合
        for (int i = 0; i < accountlist.size(); i++) {
            Account acc = accountlist.get(i);
            if(acc.getCardId().equals(cardId)){
                return acc;//返回相同的卡号的用户
            }
        }
        return null;//说明没有相同的卡号
    }
}

3、Test测试类

public class Test {
    public static void main(String[] args) {
        //创建一个ATM的对象
        ATM atm = new ATM();
        //用对象调用start()方法,启动程序
        atm.start();
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无问西东_X

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

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

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

打赏作者

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

抵扣说明:

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

余额充值