Java面向对象实战——手写一个简单ATM系统

这个Java程序实现了一个简单的ATM系统,包括账户类(Account)和ATM系统类(ATMSystem)。用户可以进行登录、开户、查询账户、存款、取款、转账和修改密码等操作。系统使用ArrayList存储账户,并通过Scanner获取用户输入。转账功能会检查余额和限额,开户时会随机生成卡号并防止重复。
摘要由CSDN通过智能技术生成

 代码的注释已经十分详尽,就不多说什么了。一切如下

package arycra_07;
/*
账户类
 */
public class Account {
    private String cardID; //卡号
    private String userName; //户主
    private String passWord; //密码
    private double money; //余额
    private double quotaMoney; //单次取款or转账限额

    public Account() {
    }

    public Account(String cardID, String userName, String passWord, double quotaMoney) {
        this.cardID = cardID;
        this.userName = userName;
        this.passWord = passWord;
        this.quotaMoney = quotaMoney;
    }

    public String getCardID() {
        return cardID;
    }

    public void setCardID(String cardID) {
        this.cardID = cardID;
    }

    public String getUserName() {
        return userName;
    }

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

    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 getQuotaMoney() {
        return quotaMoney;
    }

    public void setQuotaMoney(double quotaMoney) {
        this.quotaMoney = quotaMoney;
    }

}

package arycra_07;

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

public class ATMSystem {
    public static void main(String[] args) {
        //准备系统需要的容器对象,用来存储账户对象
        ArrayList<Account> accounts = new ArrayList<>();

        //准备系统的首页,登录,开户
        showMain(accounts);
    }

    /**
     * 展示首页内容
     *
     * @param accounts 传入账户集合
     */
    public static void showMain(ArrayList<Account> accounts) {
        Scanner sc = new Scanner(System.in);
        showMain_loop:
        while (true) {
            System.out.println("======================Welcome to my ATM system======================");
            System.out.println("0. Exit the system");
            System.out.println("1. Log in to your account");
            System.out.println("2. Open an account");
            System.out.println("Please input the number of your order: ");
            String order = sc.next();
            switch (order) {
                case "0":
                    //退出
                    System.out.println("Exit successfully. Welcome back again!");
                    break showMain_loop;
                case "1":
                    //登录
                    login(accounts, sc);
                    break;
                case "2":
                    //开户
                    register(accounts, sc);
                    break;
                default:
                    System.out.println("Illegal order. Try again.");
            }
        }
    }

    /**
     * 完成用户登录操作
     *
     * @param accounts 传入账户集合
     * @param sc       传入扫描器进行键盘输入
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        //考虑极端情况,用户在不存在账户的情况下强行登录
        if (accounts.size() == 0) {
            //没有任何账户,需要直接返回
            System.out.println("No account exists in the system now. Open an account first.");
            return;
        }
        System.out.println("======================Log in to your account here======================");
        //让用户录入卡号,根据卡号查询账户对象
        while (true) {
            System.out.println("Please input your cardID: ");
            String cardID = sc.next();
            //根据卡号查询账户对象,我们抽象成方法getAccountByCardID
            Account acc = getAccountByCardID(cardID, accounts);

            //判断账户对象是否存在,存在则说明没问题
            if (acc != null) {
                while (true) {
                    //账户对象存在,继续输入密码
                    System.out.println("Please input your password: ");
                    String password = sc.next();
                    //判断密码是否正确
                    if (acc.getPassWord().equals(password)) {
                        //密码正确,登录成功
                        //欢迎界面
                        System.out.println("Hello " + acc.getUserName() +
                                ", now you have successfully entered the User Interface!");
                        System.out.println("Your cardID is " + acc.getCardID() + ".");
                        //展示系统登录后的操作界面
                        showUserOrder(sc, acc, accounts);
                        return; //结束登录方法
                    } else {
                        System.out.println("Wrong password. Try again.");
                    }
                }
            } else {
                //账户对象不存在,继续循环
                System.out.println("This account do not exist. Try again.");
            }
        }
    }

    /**
     * 登录后展示用户操作界面
     *
     * @param sc       传入扫描器读取用户输入
     * @param acc      传入用户登录的账户对象
     * @param accounts 传入账户集合
     */
    private static void showUserOrder(Scanner sc, Account acc, ArrayList<Account> accounts) {
        while (true) {
            System.out.println("======================User Interface======================");
            System.out.println("1 Query account");
            System.out.println("2 Deposit money");
            System.out.println("3 Withdraw money");
            System.out.println("4 Transfer accounts");
            System.out.println("5 Change password");
            System.out.println("6 Log out");
            System.out.println("7 Delete your account");
            System.out.println("Please input the number of your order:");
            String order = sc.next();
            switch (order) {
                case "1" ->
                        //查询账户
                        queryAccount(acc);
                case "2" ->
                        //存款
                        depositMoney(acc, sc);
                case "3" ->
                        //取款
                        withdrawMoney(acc, sc);
                case "4" ->
                        //转账
                        transferMoney(accounts, acc, sc);
                case "5" ->
                        //修改密码
                        changePassword(acc, sc);
                case "6" -> {
                    //登出
                    System.out.println("Log out successfully. Welcome back again!");
                    return; //结束当前方法返回
                }
                case "7" -> {
                    //注销
                    //删除当前账户即可
                    accounts.remove(acc);
                    System.out.println("Delete your account successfully.");
                    return; //结束当前方法返回
                }
                default -> System.out.println("Illegal order. Try again.");
            }
        }
    }

    /**
     * 修改密码功能
     *
     * @param acc 传入当前登录的账户对象
     * @param sc  传入扫描器进行键盘输入
     */
    private static void changePassword(Account acc, Scanner sc) {
        System.out.println("======================Change Password======================");
        while (true) {
            System.out.println("Please input your previous password: ");
            //要求用户输入正在使用的密码
            String prePassword = sc.next();
            //判断密码是否正确
            if (acc.getPassWord().equals(prePassword)) {
                System.out.println("Please input your new password: ");
                String newPassword = sc.next();
                System.out.println("Please confirm your new password: ");
                //请用户确认自己的新密码
                String okNewPassword = sc.next();
                if (newPassword.equals(okNewPassword)) {
                    //确认无误,修改密码
                    acc.setPassWord(newPassword);
                    System.out.println("Change your password successfully!");
                    return; //返回
                } else {
                    System.out.println("The passwords you input twice are inconsistent. Try again.");
                }
            } else {
                System.out.println("Wrong password. Try again.");
            }
        }
    }

    /**
     * 转账功能
     *
     * @param accounts 传入账户集合
     * @param acc      传入当前登录的账户对象
     * @param sc       传入扫描器进行键盘输入
     */
    private static void transferMoney(ArrayList<Account> accounts, Account acc, Scanner sc) {
        //判断系统中是否存在两个及以上账户,以支持转账操作
        if (accounts.size() < 2) {
            System.out.println("Sorry, there are no other accounts in the system " +
                    "for you to transfer money!");
            return;
        }

        //如果当前账户余额为零
        if (acc.getMoney() == 0) {
            System.out.println("Your account is out of money now!");
            return;
        }

        //说明系统中有至少两个账户且当前账户余额不为零,开启转账操作
        while (true) {
            System.out.println("Please input the cardID you want to transfer: ");
            String cardID = sc.next();
            Account account = getAccountByCardID(cardID, accounts); //查询输入的卡号是否存在
            if (account != null) {
                //卡号存在,判断是否在给自己转账
                if (account.getCardID().equals(acc.getCardID())) {
                    //在给自己转账
                    System.out.println("Do not transfer money to yourself!");
                } else {
                    //确认对方名字的第一个字符
                    String name = "*" + account.getUserName().substring(1);
                    System.out.println("Please complete the first character of " +
                            "his or her name: " + name);
                    String firstCharacter = sc.next();
                    //判断
                    if (account.getUserName().startsWith(firstCharacter)) {
                        //验证成功,开始转账
                        System.out.println("Please input the amount you want to transfer: ");
                        double amountMoney = sc.nextDouble();
                        //判断转账金额是否超过当前登录账户的余额或转账限额
                        if (amountMoney > acc.getQuotaMoney()) {
                            System.out.println("Exceed your transfer quota. Your quota is "
                                    + acc.getQuotaMoney() + " dollars. Try again.");
                        } else if (amountMoney > acc.getMoney()) {
                            //超过余额
                            System.out.println("Exceed your balance. Your balance is "
                                    + acc.getMoney() + " dollars now. Try again.");
                        } else {
                            //可以转账
                            acc.setMoney(acc.getMoney() - amountMoney);
                            account.setMoney(account.getMoney() + amountMoney);
                            System.out.println("Successfully transfer! You have transferred "
                                    + amountMoney + " to" + account.getUserName() + ".");
                            queryAccount(acc); //查看自己当前账户信息
                            return;
                        }
                    } else {
                        System.out.println("You get it wrong. Try again.");
                    }
                }
            } else {
                //卡号不存在
                System.out.println("The cardID you input do not exist. Try again.");
            }
        }
    }

    /**
     * 取款
     *
     * @param acc 传入当前登录的账户对象
     * @param sc  传入扫描器进行键盘输入
     */
    private static void withdrawMoney(Account acc, Scanner sc) {
        System.out.println("======================Withdraw Money======================");
        //判断账户上还有没有钱
        if (acc.getMoney() > 0) {
            while (true) {
                System.out.println("Please input your withdrawal amount");
                double withdrawlAmount = sc.nextDouble();
                //判断取款金额有没有超过单次取款限额
                if (withdrawlAmount >= acc.getQuotaMoney()) {
                    System.out.println("Exceed your withdrawal quota. Try again. Your quota is "
                            + acc.getQuotaMoney());
                } else {
                    //判断取款金额有没有超过账户余额
                    if (withdrawlAmount >= acc.getMoney()) {
                        System.out.println("Exceed your balance. Your balance is "
                                + acc.getMoney() + " dollars now. Try again.");
                    } else {
                        //可以取钱
                        acc.setMoney(acc.getMoney() - withdrawlAmount);
                        System.out.println("Successful withdrawal! You took out " + withdrawlAmount
                                + " dollars. Now your account balance is " + acc.getMoney() + " dollars.");
                        return; //取钱成功后返回
                    }
                }
            }
        } else {
            System.out.println("Your account is out of money now!");
        }
    }

    /**
     * 存款功能
     *
     * @param acc 传入当前登录的账户对象
     * @param sc  传入扫描器进行键盘输入
     */
    private static void depositMoney(Account acc, Scanner sc) {
        System.out.println("======================Deposit Money======================");
        System.out.println("Please input your deposit amount: ");
        double depositMoney = sc.nextDouble();

        //直接把金额修改到账户对象的money属性中去
        acc.setMoney(acc.getMoney() + depositMoney);
        System.out.println("Deposit successfully!");
        queryAccount(acc);
    }

    /**
     * 查询当前登录的账户信息
     *
     * @param acc 传入当前登录的账户对象
     */
    private static void queryAccount(Account acc) {
        System.out.println("======================Account Details======================");
        System.out.println("Your cardID is " + acc.getCardID());
        System.out.println("Your name is " + acc.getUserName());
        System.out.println("Your account balance is " + acc.getMoney() + " dollars");
        System.out.println("Your current quota is " + acc.getQuotaMoney() + " dollars");
    }

    /**
     * 开户功能
     *
     * @param accounts 传入账户集合
     * @param sc       传入扫描器进行键盘输入
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("======================Open an account here======================");
        //键盘录入 姓名 密码 确认密码
        System.out.println("Please input your name: ");
        String name = sc.next();

        String password;
        String okPassword;
        while (true) {
            System.out.println("Please input your password: ");
            password = sc.next();
            System.out.println("Please confirm your password: ");
            okPassword = sc.next();
            //判断两次输入的密码是否一致
            if (okPassword.equals(password)) {
                break;
            } else {
                System.out.println("Unsuccessfully confirm your password. Try again.");
            }
        }

        System.out.println("Please input your quota of withdrawal and transfer: ");
        double quotaMoney = sc.nextDouble();

        //随机生成账户卡号并检查是否与其他账号重复,我们抽象出方法createCardID
        String newCardID = createCardID(accounts);

        //创建一个账户对象封装对象信息
        Account account = new Account(newCardID, name, password, quotaMoney);
        accounts.add(account);
        System.out.println("Successfully open an account! Your cardID is " + account.getCardID() + ".");
    }

    /**
     * 随机生成卡号并查重
     *
     * @param accounts 传入账户集合
     * @return 返回一个8位新卡号
     */
    public static String createCardID(ArrayList<Account> accounts) {
        while (true) {
            //生成一个8位新卡号
            String newCardID = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                newCardID += r.nextInt(10);
            }
            //查重,检查新卡号是否重复
            //根据卡号查询账户对象,我们抽象出方法getAccountByCardID
            Account acc = getAccountByCardID(newCardID, accounts);
            //判断账户对象是否存在,为null说明没问题
            if (acc == null) {
                //当前卡号未重复,可以开户
                return newCardID;
            }
        }
    }

    /**
     * 在账户集合中检索,判定卡号是否已经存在
     *
     * @param cardID   createCardID方法中新生成的卡号
     * @param accounts 账户集合
     * @return 若重复则返回重复的账户对象,否则返回null
     */
    public static Account getAccountByCardID(String cardID, ArrayList<Account> accounts) {
        //根据卡号查询账户对象,查不到说明这个卡号未重复
        for (Account acc : accounts) {
            if (acc.getCardID().equals(cardID)) {
                return acc;
            }
        }
        return null; //查无此账户,卡号无重复
    }
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、UNIX文件系统的基本原理        UNIX采用树型目录结构,每个目录表称为一个目录文件。一个目录文件是由目录项组成的。每个目录项包含16B,一个辅存磁盘块(512B)包含32个目录项。在目录项中,第1、2字节为相应文件的外存i节点号,是该文件的内部标识;后14B为文件名,是该文件的外部标识。所以,文件目录项记录了文件内、外部标识的对照关系。根据文件名可以找到辅存i节点号,由此便得到该文件的所有者、存取权、文件数据的地址健在等信息。UNIX的存储介质以512B为单位划分为块,从0开始直到最大容量并顺序加以编号就成了一个文件卷,也叫文件系统。本次课程设计是要实现一个简单的模拟UNIX文件系统。我们在磁盘中申请一个二进制文件模拟UNIX内存,依次初始化建立位示图区,I节点区,数据块区。 二、基本要点思路         1、模拟磁盘块的实现:因为文件系统需要从磁盘中读取数据操作数据,在实现时是使用文件来模拟磁盘,一个文件是一块磁盘,在文件中以划分磁盘块那样划分不同的区域,主要有三个区域:位图区,inode索引节点区,磁盘块区。位图区我是使用一个512byte的数组存放,inode区和磁盘块区我采用一种自认为比较巧妙的方法,就是存放对象列表,之前说过,在本次实验的所有的结构都使用对象进行存储,而inode节点和磁盘块就是两个重要的数据结构,在初始化时我实例化32个inode对象和512个block对象(至于这些类的具体定义下面会提到),然后将这些对象加入各自对应的对象列表中,在存储时,使用java的对象序列化技术将这个对象数组存到磁盘中。当使用文件系统时,程序会先从磁盘文件中读取出位图数组,inode对象列表,block对象列表,之后的操作就是通过对这些列表进行修改来实现。使用这种方法可以减小存储的空间(对象序列话技术)而且不需要在使用时进行无用的查找,只要第一次初始化中将这些对象都读取出来。        2、界面的实现:在实现这个文件系统时使用了两种方案,一种是直接在java控制台来进行输入输出,因为原本想着UNIX文件系统原本也是使用的命令行语句,所以在控制台上实现也很接近。后来在老师的建议下又将整个程序重新修改,改成在UI界面上进行输入输出,这样确实界面美观舒服了不少,只不过两者用的技术很不一样,前者主要使用的是系统的输入输出流,后者使用java监听器。        3、权限的实现:在实现多用户的权限方面,我给文件和文件夹各定义了三级权限1、访问:在文件中是可以查看文件的内容,在文件夹中是可以进入该文件夹。2、修改:文件中是可以对文件进行编辑,文件夹中是可以在该文件夹中创建新的文件或目录。3、删除:顾名思义。文件或文件夹的创建者拥有最高级别的权限,只有拥有最高级权限的用户才可以给其他用户针对该文件或文件夹进行授权和授权操作。在每次对文件或文件夹进行访问修改删除操作时都会检查当前用户在该文件或文件夹所拥有的权限,只有拥有的权限大于想要实现的权限时才可以进行该操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AryCra_07

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

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

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

打赏作者

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

抵扣说明:

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

余额充值