ATM系统

一、ATM项目介绍

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

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

  • 由于每一个账户都包含一些个人信息,比如:卡号、姓名、性别、密码、余额、每次取现额度等等,所以,首先可以设计一个Account类,用来描述账户对象需要封装那些数据。
  • 紧接着,定义一个ATM类,用来表示ATM系统,负责提供所有的业务需求。比如:展示ATM系统的欢迎页面、开户、登录、转账等功能。
  • 最后,定义一个测试类Test,负责启动我们开发好的ATM系统,进行测试

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

//首先可以设计一个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;
    }
}

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

import java.util.ArrayList;

public class ATM {
    //创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
    private ArrayList<Account> accounts = new ArrayList<>();
}

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

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

public class ATM {
    //创建一个存储账户对象的集合;后面每开一个账户,就往集合中添加一个账户对象
    private ArrayList<Account> accounts = new ArrayList<>();
    //为了后面键盘录入方便一点,先创建好一个Scanner对象
    private Scanner sc = new Scanner(System.in);

    /**启动ATM系统 展示欢迎界面 */
    public void start(){
        while (true) {
            System.out.println("===欢迎您进入到了ATM系统===");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.print("请选择:");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    // 用户登录
                    System.out.println("进入登录功能");
                    break;
                case 2:
                    // 用户开户
                    System.out.println("进入开户功能");
                    break;
                default:
                    System.out.println("没有该操作~~");
            }
        }
    }
}

三、开户功能实现

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

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

  • 输入账户名,设置给账户对象
  • 输入性别,如果性别是‘男’或者"女',将性别设置给账户对象;否则重新录入性别直到录入正确为止。
  • 输入账户、并且输入两次密码,只有两次密码相同,才将账户和密码设置给账户对象
  • 输入提现限额,并且设置给账户对象

3.输出开户成功,的提示语句

/** 完成用户开户操作  */
private void createAccount() {
    System.out.println("===系统开户操作===");
    // 1、创建一个账户对象,用于封装用户的开户信息
    Account acc = new Account();

    // 2、需要用户输入自己的开户信息,赋值给账户对象
    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();
        // 判断2次密码是否一样。
        if(okPassword.equals(password)){
            acc.setPassword(okPassword);
            break;
        }else {
            System.out.println("您输入的2次密码不一致,请您确认~~");
        }
    }

    System.out.println("请您输入您的取现额度:");
    double limit = sc.nextDouble();
    acc.setLimit(limit);

    // 重点:我们需要为这个账户生成一个卡号(由系统自动生成。8位数字表示,不能与其他账户的卡号重复)
    //TODO 这里先留着,待会把生成卡号的功能写好,再到这里调用

    // 3、把这个账户对象,存入到账户集合中去
    accounts.add(acc);
    System.out.println("恭喜您," + acc.getUserName() + "开户成功,您的卡号是:" + acc.getCardId());
}

四、生成卡号

第一步:先在ATM类中,写一个判断卡号是否存在的功能。

  • 遍历存储Account对象的集合,得到每一个Account对象,获取对象的卡号
  • 如果卡号存在,返回该卡号对应的Account对
  • 如果卡号不存在 返回null
/** 根据卡号查询账户对象返回 accounts = [c1, c2, c3 ...]*/
private Account getAccountByCardId(String cardId){
    // 遍历全部的账户对象
    for (int i = 0; i < accounts.size(); i++) {
        Account acc = accounts.get(i);
        // 判断这个账户对象acc中的卡号是否是我们要找的卡号
        if(acc.getCardId().equals(cardId)){
            return acc;
        }
    }
    return null; // 查无此账户,这个卡号不存在的
}

第二步:再在ATM类中,写一个生成卡号的功能
1.先随机产生8个[0,9]范围内的随机数,拼接成一个字符串

2.然后再调用getAccountByCardld方法,判断这个卡号字符串是否存在
3.判断生成的卡号是否存在

  • 如果生成的卡号不存在,说明生成的卡号是有效的,把卡号返回
  • 如果生成的卡号存在,说明生成的卡号无效,循环继续生产卡号
/** 返回一个8位 数字的卡号,而且这个卡号不能与其他账户的卡号重复 */
private String createCardId(){
    while (true) {
        // 1、定义一个String类型的变量记住8位数字作为一个卡号
        String cardId = "";
        // 2、使用循环,循环8次,每次产生一个随机数给cardId连接起来
        Random r = new Random();
        for (int i = 0; i < 8; i++) {
            int data = r.nextInt(10); // 0 - 9
            cardId += data;
        }
        // 3、判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新
卡号返回。
        Account acc = getAccountByCardId(cardId);
        if(acc == null){
            // 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做
为一个新卡号
            return cardId;
        }
    }
}

五、登录功能

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

2.输入登录的卡号,并判断卡号是否存在
3.如果卡号不存在,直接给出提示
4.如果卡号存在,接着输入用户密码,并判断密码是否正确

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

private Account loginAcc; // 记住登录后的用户账户
/** 完成用户的登录操作 */
private void login(){
System.out.println("==系统登录==");
// 1、判断系统中是否存在账户对象,存在才能登录,如果不存在,我们直接结束登录操作
if(accounts.size() == 0){
System.out.println("当前系统中无任何账户,请先开户再来登录~~");
return; // 跳出登录操作。
}
// 2、系统中存在账户对象,可以开始进行登录操作了
while (true) {
System.out.println("请您输入您的登录卡号:");
String cardId = sc.next();
// 3、判断这个卡号是否存在啊?
Account acc = getAccountByCardId(cardId);
if(acc == null){
// 说明这个卡号不存在。
System.out.println("您输入的登录卡号不存在,请确认~~");
}else {
各位同学,在上面我们编写的欢迎界面,只是打印了进入了某某功能,但是没有调用对应的功能方法。
接下来我们调用对应的功能方法来实现对应的需求。
 
            while (true) {
                // 卡号存在了,接着让用户输入密码
                System.out.println("请您输入登录密码:");
                String passWord = sc.next();
                // 4、判断密码是否正确
                if(acc.getPassWord().equals(passWord)){
                    loginAcc = acc;
                    // 密码正确了,登录成功了
                    System.out.println("恭喜您," + acc.getUserName() + "成功登录了
系统,您的卡号是:" + acc.getCardId());
                    //TODO 把展示登录界面的功能写成一个方法,写好了再回来调用。           
        
                    return; // 跳出并结束当前登录方法
                }else {
                    System.out.println("您输入的密码不正确,请确认~~");
}
}
}
}
}
/**启动ATM系统 展示欢迎界面 */
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:
                // 用户登录
                this.login();
                break;
            case 2:
                // 用户开户
                this.createAccount();
                break;
            default:
                System.out.println("没有该操作~~");
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值