Java学习笔记——第九天

综合项目:ATM

项目需求

  • 拥有登陆界面,在登陆界面有开户、功能和退出系统功能。
  • 在开户时,要求输入姓名、性别、密码和每次取款限额,输入密码时要再输入一次以确认密码输入正确,之后自动生成不重复的8位数字卡号。
  • 在登陆时,若系统中没有账户,要能提示用户先去开户;若输入的账户不存在或密码错误,要能要求用户重新输入卡号或密码。
  • 登录完成后,能够展示及选择以下功能:查询账户、存款、取款、转账、修改密码、退出账户和注销当前帐户。
  • 在查询账户时,打印出账户的卡号、姓名、性别、余额和每次取款限额。
  • 在存款完成后,要打印出账户内的余额。
  • 在取款时,要先判断账户里余额是否足够以及是否超过每次取款限额,取款完成后要打印出账户内的余额。
  • 在转账时,若当前系统内账户数小于2,则要求用户先去开户;若账户内余额为不足,则提示用户余额不足,不能转账;在转账前,要求用户输入转入账户户主的姓氏,否则不能转账;转账完成后要打印出账户内的余额。
  • 在修改密码时,需要先认证用户当前的密码,认证通过后,需要让用户输入2次新密码以确认输入正确,若两次密码一样,则更新账户密码,并回到登陆界面。
  • 在退出账户时,需要用户进行确认。
  • 在注销当前账户时,若账户里余额不为0,则提示用户账户里还有余额,不能销户;若余额为0,则需要用户进行确认。

项目架构

项目架构

将项目分为三个类:Account类,ATM类,Run类。Account类用来储存账户的信息,并提供给ATM类处理;ATM类用来处理账户的信息并提供给Run类运行;Run类调用ATM类中的方法运行整个程序。

Account类

Account类中有六个私有属性和对应的setter、getter方法,以及无参构造器和有参构造器,属性对应的信息见下表:

属性 信息
String name 姓名
String gender 性别
String password 密码
double limit 每次取款限额
double balance 余额
String id 卡号

ATM类

ATM类中有三个私有属性,作用见下表:

属性 作用
ArrayList acc 存储注册的账户
Scanner sc 存储扫描器,接收用户输入
Account loginAccount 存储当前的账户对象

ATM类中还有一系列方法,作用见下表:

方法 作用
start() 启动系统
login() 登录功能
register() 开户功能
show() 查询账户功能
deposit() 存款功能
withdraw() 取款功能
transfer() 转账功能
changePassword() 修改密码功能
logout() 退出账户功能
cancelAccount() 注销当前账户功能
getAccountById() 使用id获取账户对象

Run类

Run类没有属性,只有一个main方法,用来调用ATM类的start()方法以启动系统。

代码

Account类

package com.zgg1h.ATM;

public class Account {
    private String name; //姓名
    private String gender; //性别
    private String password; //密码
    private double limit; //每次取款限额
    private double balance; //余额
    private String id; //卡号

    public String getName() {
        return name + (gender.equals("男") ? "先生" : "女士");
    }

    public String getName(String name) {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public double getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }

    public double getBalance() {
        return balance;
    }

    public void setBalance(double balance) {
        this.balance = balance;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Account() {
    }

    public Account(String name, String gender, String password, double limit, String id) {
        this.name = name;
        this.gender = gender;
        this.password = password;
        this.limit = limit;
        this.id = id;
    }
}

ATM类

package com.zgg1h.ATM;

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

public class ATM {
    private ArrayList<Account> acc = new ArrayList<>(); //存储所有账户
    private Scanner sc = new Scanner(System.in); //接收用户输入
    private Account loginAccount; //当前登陆账户

    //启动系统
    public void start() {
        //循环选择功能
        while (true) {
            System.out.println("===欢迎来到ATM系统===");
            System.out.println("1.用户登录");
            System.out.println("2.用户开户");
            System.out.println("3.退出系统");
            System.out.print("请选择功能:");
            String select = sc.next(); //用户选择的功能

            //选择功能
            switch (select) {
                case "1":
                    //登录
                    login();
                    break;
                case "2":
                    //开户
                    register();
                    break;
                case "3":
                    //退出系统
                    return;
                default:
                    System.out.println("输入错误,请重新输入:");
            }
        }
    }

    //登录功能
    private void login() {
        System.out.println("===欢迎来到登录功能===");

        //判断系统中是否已有账户
        if (acc.size() == 0) {
            System.out.println("当前没有账户,请先去开户");
            return;
        }

        //循环输入卡号
        while (true) {
            System.out.print("请输入卡号:");
            String id = sc.next(); //用户输入的卡号
            loginAccount = getAccountById(id); //设置当前登录用户,若卡号不存在,则为null

            //查看卡号是否存在
            if (loginAccount != null) {
                //卡号存在
                break;
            }
            //卡号不存在
            System.out.println("您输入的卡号不存在,请重新输入");
        }

        System.out.print("请输入密码:");
        String password = sc.next(); //用户输入的密码

        //查看密码是否正确
        if (!password.equals(loginAccount.getPassword())) {
            //密码错误
            System.out.println("密码错误");
            return;
        }
        //密码正确
        System.out.println("登陆成功");

        //循环选择功能
        while (true) {
            //展示功能
            System.out.println("===欢迎" + loginAccount.getName() + "使用ATM系统===");
            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.print("请选择功能:");
            String select = sc.next(); //获取用户的选择

            //选择功能
            switch (select) {
                case "1":
                    //查询账户
                    show();
                    break;
                case "2":
                    //存款
                    deposit();
                    break;
                case "3":
                    //取款
                    withdraw();
                    break;
                case "4":
                    //转账
                    transfer();
                    break;
                case "5":
                    //修改密码
                    changePassword();
                    break;
                case "6":
                    //退出账户
                    if (logout()) {
                        return;
                    }
                    break;
                case "7":
                    //注销当前账户
                    if (cancelAccount()) {
                        return;
                    }
                    break;
                default:
                    System.out.println("输入错误,请重新输入");
            }
        }
    }

    //开户功能
    private void register() {
        Random r = new Random();
        System.out.println("===欢迎来到开户功能===");
        System.out.print("请输入您的姓名:");
        String name = sc.next(); //用户输入的姓名

        String gender; //保存用户输入的性别
        //循环输入性别
        while (true) {
            System.out.print("请输入您的性别:");
            gender = sc.next();
            //判断性别输入是否正确
            if (!gender.equals("男") && !gender.equals("女")) {
                //输入不正确
                System.out.println("您输入的性别有误,请重新输入");
                continue;
            }
            //输入正确
            break;
        }

        String password; //保存用户输入的密码
        while (true) {
            System.out.print("请输入您的密码:");
            password = sc.next();
            System.out.print("请再次输入您的密码:");
            String checkPassword = sc.next(); //用户第二次输入的密码

            //比较两次输入的密码是否一致
            if (!checkPassword.equals(password)) {
                //不一致
                System.out.println("两次密码不一致,请重新输入");
                continue;
            }
            //一致
            break;
        }

        System.out.print("请输入您每次取款的限额:");
        double limit = sc.nextDouble(); //用户输入的每次取款限额

        //随机创建不重复的卡号
        String id = "";
        //一直随机,直到随即到不重复的卡号
        while (true) {
            id = ""; //每次都把id置空

            //生成8位数字卡号
            for (int i = 0; i < 8; i++) {
                id += r.nextInt(10);
            }

            //判断卡号是否存在
            if (getAccountById(id) != null) {
                //卡号存在则继续
                continue;
            }
            //卡号不存在
            Account account = new Account(name, gender, password, limit, id); //新建账户并赋值
            acc.add(account); //把账户加入到列表中
            System.out.println("账户" + name + "创建成功,您的卡号是:" + id + ",请妥善保管");
            return;
        }
    }

    //查询账户功能
    private void show () {
        System.out.println("===" + loginAccount.getName() + "账户内的信息如下===");
        System.out.println("卡号:" + loginAccount.getId());
        System.out.println("姓名:" + loginAccount.getName());
        System.out.println("性别:" + loginAccount.getGender());
        System.out.println("余额:" + loginAccount.getBalance());
        System.out.println("每次取款限额:" + loginAccount.getLimit());
    }

    //存款功能
    private void deposit () {
        System.out.println("===欢迎" + loginAccount.getName() + "来到存款功能===");
        System.out.print("请输入您要存钱的数量:");
        double money = sc.nextDouble(); //用户要存钱的数量
        loginAccount.setBalance(loginAccount.getBalance() + money); //修改账户的余额
        System.out.println("存钱" +  money + "元,当前的余额是" + loginAccount.getBalance() + "元");
    }

    //取款功能
    private void withdraw () {
        System.out.println("===欢迎" + loginAccount.getName() + "来到取款功能===");
        double money; //用户要取钱的数量

        //循环输入取钱数量
        while (true) {
            System.out.print("请输入您要取钱的数量:");
            money = sc.nextDouble(); //用户要取钱的数量
            //判断是否超过每次取款限额
            if (money > loginAccount.getLimit()) {
                //超过了
                System.out.println("超过了每次取款限额(" + loginAccount.getLimit() + "元),请重新输入");
                continue;
            }
            //没有超过
            double balance = loginAccount.getBalance(); //用户当前的余额
            //判断余额是否足够
            if (money > balance) {
                //余额不够
                System.out.println("余额不足,当前余额为" + loginAccount.getBalance() + "元,请重新输入");
                continue;
            }
            //余额足够
            loginAccount.setBalance(loginAccount.getBalance() - money); //修改账户的余额
            System.out.println("取钱" +  money + "元,当前的余额是" + loginAccount.getBalance() + "元");
            return;
        }
    }

    //转账功能
    private void transfer () {
        System.out.println("===欢迎" + loginAccount.getName() + "来到取款功能===");

        //判断系统中用户是否有两人或以上
        if (acc.size() < 2) {
            //如没有,则没法转账
            System.out.println("系统中用户不足两人,请先开户");
            return;
        }

        Account toAccount;
        //循环转账
        while (true) {
            System.out.print("请输入转入账户的卡号:");
            String id = sc.next();

            //判断卡号是否存在
            toAccount = getAccountById(id);
            if (toAccount != null) {
                //卡号存在
                break;
            }
            //卡号不存在
            System.out.println("卡号不存在,请重新输入");
        }

        //循环让用户验证转入账户户主姓氏
        while (true) {
            String name = toAccount.getName("名字").substring(1); //将转入账户户主姓氏用*替换
            System.out.println("请输入对方用户的姓氏:*" + name); //输出替换后的姓名
            String familyName = sc.next();
            //判断输入姓氏是否正确
            if (toAccount.getName().startsWith(familyName)) {
                //正确
                break;
            }
            //错误
            System.out.println("您输入的姓氏有误,请重新输入");
        }

        //循环判断余额是否足够
        while (true) {
            System.out.print("请输入您要转账的金额:");
            double money = sc.nextDouble();
            if (money <= loginAccount.getBalance()) {
                //余额足够,完成转账操作
                loginAccount.setBalance(loginAccount.getBalance() - money); //当前登录用户余额减少
                System.out.println("当前的余额是" + loginAccount.getBalance() + "元");
                toAccount.setBalance(toAccount.getBalance() + money); //转入账户余额增加
                break;
            }
            //余额不够
            System.out.println("余额不足,当前余额为" + loginAccount.getBalance() + "元,请重新输入");
        }
    }

    //修改密码功能
    private void changePassword () {
        //循环输入当前密码
        while (true) {
            System.out.print("请输入您的旧密码:");
            String oldPassword = sc.next();
            if (oldPassword.equals(loginAccount.getPassword())) {
                //密码正确
                break;
            }
            System.out.println("密码错误,请重新输入");
        }
            //密码正确,输入新密码
        while (true) {
            System.out.print("请输入您的新密码:");
            String newPassword = sc.next();
            System.out.print("请再次输入您的新密码:");
            String checkNewPassword = sc.next();
            if (!newPassword.equals(checkNewPassword)) {
                //两次输入不一样
                System.out.println("两次密码不一致,请重新输入");
                continue;
            }

            //两次输入一样,更新密码
            loginAccount.setPassword(newPassword);
            System.out.println("修改密码成功");
            break;
        }
    }

    //退出账户功能
    private boolean logout () {
        System.out.println("请确认是否要退出登录?确定退出输入y,取消退出输入其他任意字符");
        String logout = sc.next();


        switch (logout) {
            case "y":
                //确定退出返回true
                System.out.println("账号" + loginAccount.getName(" ") + "已退出");
                return true;
            default:
                //不退出返回false
                return false;
        }
    }

    //注销当前账户功能
    private boolean cancelAccount () {
        System.out.println("请确认是否要注销当前账户?确定退出输入y,取消退出输入其他任意字符");
        String cancel = sc.next();

        //若确定注销
        if (cancel.equals("y")) {
            //判断账户中是否还有余额
            if (loginAccount.getBalance() != 0) {
                //还有余额,不能注销
                System.out.println("当前账户还有余额,请取出后再注销");
            } else {
                //没有余额,执行注销操作
                acc.remove(loginAccount); //从账户列表中移除账户对象
                System.out.println("账号" + loginAccount.getName(" ") + "注销成功");
                return true; //注销成功返回true
            }
        }
         return false; //否则返回false
    }

    //使用id获取账户对象
    private Account getAccountById (String id){
        //遍历账户列表
        for (int i = 0; i < acc.size(); i++) {
            if (acc.get(i).getId().equals(id)) {
                //存在此id的账户则返回该账户
                return acc.get(i);
            }
        }
        //不存在此id的账户则返回null
        return null;
    }
}

Run类

package com.zgg1h.ATM;

public class Run {
    public static void main(String[] args) {
        ATM atm = new ATM(); //实例化ATM类
        atm.start(); //启动系统
    }
}

posted @ 2024-03-08 14:46  zgg1h  阅读(61)  评论(0)    收藏  举报