模拟实现ATM系统——Java

news2025/7/27 12:00:11

目录

一、内容简介

二、基本流程

三、具体步骤 

1.定义Account类

2.菜单栏

3.账户注册

(1)根据卡号查询账户信息

(2)生成随机卡号

(3)注册账户

4.账户登录

(1)验证码

 (2)登录

5.账户展示界面

6.用户操作

(1)查询账户

(2)存款

(3)取款

(4)转账

(5)修改密码 

(6)退出登录

(7)注销账户

四、代码实现

五、效果展示

1.账户注册

2.账户登录 

3.用户操作界面

(1)查询

(2)存款 

(3)取款 

(4)转账 

(5)修改密码 

(6)注销账户

(7)登录【西门吹雪】的账号 


一、内容简介

模拟实现ATM的基本功能,包括注册账号、存款、取款、转账、查询、注销账号等功能。

二、基本流程

  1. 定义Account类。
  2. 注册账户。
  3. 账户登录。 

三、具体步骤 

在正式开始之前,我们需要定义Account类的ArraysList集合,存放用户信息。

//创建Account类型的集合
        ArrayList<Account> accounts=new ArrayList<>();

1.定义Account类

Account类中包含用户名、金额、密码、ID、单次取款限额等属性,并提供相应的getter()、setter()方法。

class Account {
    private String cardId;//id
    private String username;//用户名
    private double Money;//金额
    private double Limitmoney;//单次取款限额
    private String Password;//密码

    public String getPassword() {
        return Password;
    }

    public void setPassword(String password) {
        Password = password;
    }


    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 double getMoney() {
        return Money;
    }

    public void setMoney(double money) {
        Money = money;
    }

    public double getLimitmoney() {
        return Limitmoney;
    }

    public void setLimitmoney(double limitmoney) {
        Limitmoney = limitmoney;
    }
}

2.菜单栏

public static void menu(){
        System.out.println("=================================欢迎您来到九州银行===================================");
        System.out.println("1.账户注册");
        System.out.println("2.账户登录");
        System.out.println("请您选择:");
    }

3.账户注册

(1)根据卡号查询账户信息

  1. 这个功能是为了使生成的随机卡号不重复,如果找到,返回相应的账户信息;如果没找到,返回null。
  2. 这个功能在后续的实现中会多次用到,故单独拿出来,作为一个方法。
/**
     * 根据卡号获取账户信息
     * @param cardid 卡号
     * @param accounts 集合
     */
    private static Account getAccountBycardid(String cardid, ArrayList<Account> accounts) {
        for (int i = 0; i < accounts.size(); i++) {
            Account account= accounts.get(i);
            if(cardid.equals(account.getCardId()))
                return account;
        }
        return null;
    }
}

(2)生成随机卡号

生成16位的随机卡号并不困难,关键在于不重复。

在这里,用到了3.(1)的功能,每生成一个卡号就判断返回值是否为null,如果不是,代表已经有了该卡号存在,需要重新生成;如果是,说明该卡号不存在,生成成功。

 /**
     * 得到随机卡号
     * @param accounts 集合
     * @return 卡号
     */
    private static String getCardid(ArrayList<Account> accounts) {
        Random ran=new Random();
        while (true) {
            String cardid="";
            for (int i = 0; i < 16; i++) {
                cardid+=ran.nextInt(10);
            }
            if(getAccountBycardid(cardid,accounts)==null)
                return cardid;
        }
    }

(3)注册账户

每成功注册一个账户不要忘记添加到集合中。

/**
     * 账户注册
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void registerAccount(ArrayList<Account> accounts, Scanner sca) {
        //创建账户对象
        Account acc=new Account();
        //输入用户名
        System.out.println("请您输入用户名:");
        String name=sca.next();
        acc.setUsername(name);
        //输入密码
        while (true) {
            System.out.println("请您输入密码:");
            String password=sca.next();
            System.out.println("请您再次输入密码:");
            String okpassword=sca.next();
            if(password.equals(okpassword))
            {
                acc.setPassword(password);
                break;
            }
            else {
                System.out.println("您两次输入的密码不一致,请您重新输入!");
            }
        }
        //输入单次限额
        System.out.println("请您输入单次限额:");
        double limitmoney=sca.nextDouble();
        acc.setLimitmoney(limitmoney);
        //随机生成唯一的卡号
        String Cardid=getCardid(accounts);
        acc.setCardId(Cardid);
        System.out.println("恭喜您,账户注册成功!");
        System.out.println("尊敬的 【"+acc.getUsername()+"】 先生/女士您好,您的卡号是:"
                +acc.getCardId()+" 请您妥善保管!");
        accounts.add(acc);//添加账户到集合中
    }

4.账户登录

(1)验证码

随机生成4位数字和字母(包含大小写)作为登录验证码。

/**
     * 获取验证码
     * @return 验证码
     */
    private static String getCode() {
        Random ran=new Random();
        String add="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String code="";
        for (int i = 0; i < 4; i++) {
            int index=ran.nextInt(add.length());
            code+=add.charAt(index);
        }
        return code;
    }

 (2)登录

首先,判断集合中账户的数目,为0时不能登录,需要先注册。

其次,根据用户输入的卡号查询是否有相应的账户信息,如果没有,让用户重新输入。

/**
     * 账户登录
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void loginAccount(ArrayList<Account> accounts, Scanner sca) {
        //判断此时系统中有无账户
        if(accounts.size()==0)
        {
            System.out.println("当前系统中暂无账户,请您先注册后再登录!");
            return;
        }
        while (true) {
            System.out.println("请您输入您的卡号:");
            String ID= sca.next();
            Account acc=getAccountBycardid(ID,accounts);
            if(acc==null)
            {
                System.out.println("您输入的卡号无效,请您重新输入!");
            }
            else {
                while (true) {
                    System.out.println("请您输入密码");
                    String passWord=sca.next();
                    String Code=getCode();
                    System.out.println("验证码:"+Code);
                    System.out.println("请您输入验证码:");
                    String add=sca.next();
                    if(passWord.equals(acc.getPassword()))
                    {
                        if(Code.equalsIgnoreCase(add))
                        {
                            System.out.println("恭喜您,登录成功!");
                            showAccount(acc,sca,accounts);
                            return;
                        }
                        else {
                            System.out.println("验证码错误,请您重新输入!");
                        }
                    }
                    else {
                        System.out.println("您输入的密码有误,请您重新输入!");
                    }
                }
            }
        }
    }

5.账户展示界面

 /**
     * 账户展示界面
     * @param acc 用户登录的账户
     * @param sca 扫描器
     * @param accounts 集合
     */
    private static void showAccount(Account acc, Scanner sca, ArrayList<Account> accounts) {
        while (true) {
            System.out.println("================================欢迎来到用户操作界面==================================");
            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.println("请您选择:");
            int input=sca.nextInt();
            switch(input)
            {
                case 1:
                    //查询
                    inquire(acc);
                    break;
                case 2:
                    //存款
                    deposit(acc,sca);
                    break;
                case 3:
                    //取款
                    withdrawal(acc,sca);
                    break;
                case 4:
                    //转账
                    transferAccounts(acc,accounts,sca);
                    break;
                case 5:
                    //修改密码
                    changePassword(acc,sca);
                    return;
                case 6:
                    //退出登录
                    exit();
                    return;
                case 7:
                    //注销账户
                    if(unsubscribe(accounts,acc,sca))
                        return;
                    else
                        break;
            }
        }
    }

6.用户操作

(1)查询账户

/**
     * 查询账户
     * @param acc 当前登录的账户
     */
    private static void inquire(Account acc) {
        System.out.println("======================================查询账户======================================");
        System.out.println("卡号:"+acc.getCardId());
        System.out.println("户主:"+acc.getUsername());
        System.out.println("余额:"+acc.getMoney());
        System.out.println("单次限额:"+acc.getLimitmoney());
    }

(2)存款

  /**
     * 存款
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void deposit(Account acc, Scanner sca) {
        System.out.println("=======================================存款========================================");
        System.out.println("请您输入存款金额");
        double money=sca.nextDouble();
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存款成功!您当前余额为:"+acc.getMoney()+"元");
    }

(3)取款

/**
     * 取款
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void withdrawal(Account acc, Scanner sca) {
        System.out.println("=======================================取款========================================");
        if(acc.getMoney()==0)
        {
            System.out.println("您当前账户没有余额,请先存款吧!");
            return;
        }
        while (true) {
            System.out.println("请您输入取款金额:");
            double money=sca.nextDouble();
            if(money>acc.getLimitmoney())
            {
                System.out.println("您当前输入的金额大于单次取款限额,请您重新输入:");
            }
            else{
                if(money>acc.getMoney())
                    System.out.println("您当前输入的金额大于余额,请您重新输入:");
                else {
                    acc.setMoney(acc.getMoney()-money);
                    System.out.println("取款成功,您当前余额为:"+acc.getMoney()+"元");
                    return;
                }
            }
        }
    }

(4)转账

 /**
     * 转账
     * @param acc 当前登录的账户
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void transferAccounts(Account acc, ArrayList<Account> accounts, Scanner sca) {
        System.out.println("======================================转账=========================================");
        if(accounts.size()<2)
        {
            System.out.println("当前系统中只有1个账户,请您在注册后再转账!");
            return;
        }
        while (true) {
            System.out.println("请您输入对方卡号:");
            String ID=sca.next();
            if(ID.equals(acc.getCardId()))
            {
                System.out.println("您输入的是自己的卡号,请您重新输入!");
            }
            else{
                Account otheracc=getAccountBycardid(ID,accounts);
                if(otheracc==null)
                {
                    System.out.println("系统查无此人,请您重新输入!");
                }
                else{
                    while (true) {
                        //验证身份
                        String authenName=authenticate(ID,accounts);
                        System.out.println("请您输入【"+authenName+"】的完整姓名,以验证身份:");
                        String inputName=sca.next();
                        if(inputName.equals(otheracc.getUsername()))
                        {
                            System.out.println("输入正确,身份验证成功!");
                            while (true) {
                                System.out.println("请您输入转账金额:");
                                double money=sca.nextDouble();
                                if(money>acc.getMoney())
                                {
                                    System.out.println("您输入的金额大于您的余额,您当前最多可转账 "+acc.getMoney()+" 元!");
                                    System.out.println("请您重新输入转账金额!");
                                }
                                else {
                                    acc.setMoney(acc.getMoney()-money);
                                    otheracc.setMoney(otheracc.getMoney()+money);
                                    System.out.println("转账成功,您当前的余额为:"+acc.getMoney()+"元!");
                                    return;
                                }
                            }
                        }
                        else {
                            System.out.println("输入错误,请您重新输入!");
                        }
                    }
                }
            }
        }

    }

转账中的authenticate()方法是将待转账用户的姓名隐藏,让转账的用户输入,以验证身份。

比如,张三给李四转账,authenticate()方法就会返回李*,让张三输入完整的姓名。

/**
     * 验证身份
     * @param id 输入的卡号
     * @param accounts 集合
     * @return 张**,隐藏的对方的姓名
     */
    private static String authenticate(String id, ArrayList<Account> accounts) {
        Account otherUser=getAccountBycardid(id,accounts);
        String name=otherUser.getUsername();
        int flag=name.length();
        if(flag==2)
            return name=name.replace(name.substring(1),"*");
        if(flag==3)
            return name=name.replace(name.substring(1),"**");
        else
            return name=name.replace(name.substring(2),"**");
    }

这个方法不是太准确,是根据姓名的长度来区分的:

  1. 姓名长度为2,默认以第一个字符为姓。
  2. 姓名长度为3,默认以第一个字符为姓。
  3. 姓名长度为4,默认前两个字符为姓。

(5)修改密码 

/**
     * 修改密码
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void changePassword(Account acc, Scanner sca) {
        System.out.println("=====================================修改密码=======================================");
        while (true) {
            System.out.println("请您输入原密码:");
            String code=sca.next();
            if(code.equals(acc.getPassword()))
            {
                while (true) {
                    System.out.println("请您输入新密码:");
                    String password=sca.next();
                    System.out.println("请您再次输入新密码:");
                    String okpassword=sca.next();
                    if(password.equals(okpassword))
                    {
                        acc.setPassword(okpassword);
                        System.out.println("密码修改成功!");
                        return;
                    }
                    else {
                        System.out.println("您两次输入的密码不一致,请您重新输入!");
                    }
                }
            }
            else {
                System.out.println("密码错误,请您重新输入!");
            }
        }
    }

(6)退出登录

 /**
     * 退出登录
     */
    private static void exit() {
        System.out.println("=====================================退出登录=======================================");
        System.out.println("退出成功!");
        return;
    }

(7)注销账户

如果账户中余额大于0,不能注销账户!

 /**
     * 注销账户
     * @param accounts 集合
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static boolean unsubscribe(ArrayList<Account> accounts,Account acc, Scanner sca) {
        System.out.println("======================================注销账户======================================");
        if(acc.getMoney()>0)
        {
            System.out.println("您当前账户中还有余额 "+acc.getMoney()+" 元,不能注销账户!");
            return false;
        }

        System.out.println("您确定要注销账户吗? 是/否");
        String input=sca.next();
        switch(input)
        {
            case "是":
                accounts.remove(acc);
                System.out.println("注销账户成功!");
                return true;
        }
        return false;
    }

四、代码实现

除了上述的主要功能,还有一些小细节需要注意,在完整代码中已经用注释写出。

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

public class ATM02 {
    public static void main(String[] args) {
        //创建Account类型的集合
        ArrayList<Account> accounts=new ArrayList<>();
        Scanner sca=new Scanner(System.in);
        while (true) {
            menu();
            int input=sca.nextInt();
            switch(input)
            {
                case 1:
                    //账户注册
                    registerAccount(accounts,sca);
                    break;
                case 2:
                    //账户登录
                    loginAccount(accounts,sca);
                    break;
                default:
                    System.out.println("您输入的命令有误,请您重新输入!");
            }
        }
    }

    public static void menu(){
        System.out.println("=================================欢迎您来到九州银行===================================");
        System.out.println("1.账户注册");
        System.out.println("2.账户登录");
        System.out.println("请您选择:");
    }
    /**
     * 账户登录
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void loginAccount(ArrayList<Account> accounts, Scanner sca) {
        //判断此时系统中有无账户
        if(accounts.size()==0)
        {
            System.out.println("当前系统中暂无账户,请您先注册后再登录!");
            return;
        }
        while (true) {
            System.out.println("请您输入您的卡号:");
            String ID= sca.next();
            Account acc=getAccountBycardid(ID,accounts);
            if(acc==null)
            {
                System.out.println("您输入的卡号无效,请您重新输入!");
            }
            else {
                while (true) {
                    System.out.println("请您输入密码");
                    String passWord=sca.next();
                    String Code=getCode();
                    System.out.println("验证码:"+Code);
                    System.out.println("请您输入验证码:");
                    String add=sca.next();
                    if(passWord.equals(acc.getPassword()))
                    {
                        if(Code.equalsIgnoreCase(add))
                        {
                            System.out.println("恭喜您,登录成功!");
                            showAccount(acc,sca,accounts);
                            return;
                        }
                        else {
                            System.out.println("验证码错误,请您重新输入!");
                        }
                    }
                    else {
                        System.out.println("您输入的密码有误,请您重新输入!");
                    }
                }
            }
        }
    }

    /**
     * 获取验证码
     * @return 验证码
     */
    private static String getCode() {
        Random ran=new Random();
        String add="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        String code="";
        for (int i = 0; i < 4; i++) {
            int index=ran.nextInt(add.length());
            code+=add.charAt(index);
        }
        return code;
    }

    /**
     * 账户展示界面
     * @param acc 用户登录的账户
     * @param sca 扫描器
     * @param accounts 集合
     */
    private static void showAccount(Account acc, Scanner sca, ArrayList<Account> accounts) {
        while (true) {
            System.out.println("================================欢迎来到用户操作界面==================================");
            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.println("请您选择:");
            int input=sca.nextInt();
            switch(input)
            {
                case 1:
                    //查询
                    inquire(acc);
                    break;
                case 2:
                    //存款
                    deposit(acc,sca);
                    break;
                case 3:
                    //取款
                    withdrawal(acc,sca);
                    break;
                case 4:
                    //转账
                    transferAccounts(acc,accounts,sca);
                    break;
                case 5:
                    //修改密码
                    changePassword(acc,sca);
                    return;
                case 6:
                    //退出登录
                    exit();
                    return;
                case 7:
                    //注销账户
                    if(unsubscribe(accounts,acc,sca))
                        return;
                    else
                        break;
            }
        }
    }

    /**
     * 转账
     * @param acc 当前登录的账户
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void transferAccounts(Account acc, ArrayList<Account> accounts, Scanner sca) {
        System.out.println("======================================转账=========================================");
        if(accounts.size()<2)
        {
            System.out.println("当前系统中只有1个账户,请您在注册后再转账!");
            return;
        }
        while (true) {
            System.out.println("请您输入对方卡号:");
            String ID=sca.next();
            if(ID.equals(acc.getCardId()))
            {
                System.out.println("您输入的是自己的卡号,请您重新输入!");
            }
            else{
                Account otheracc=getAccountBycardid(ID,accounts);
                if(otheracc==null)
                {
                    System.out.println("系统查无此人,请您重新输入!");
                }
                else{
                    while (true) {
                        //验证身份
                        String authenName=authenticate(ID,accounts);
                        System.out.println("请您输入【"+authenName+"】的完整姓名,以验证身份:");
                        String inputName=sca.next();
                        if(inputName.equals(otheracc.getUsername()))
                        {
                            System.out.println("输入正确,身份验证成功!");
                            while (true) {
                                System.out.println("请您输入转账金额:");
                                double money=sca.nextDouble();
                                if(money>acc.getMoney())
                                {
                                    System.out.println("您输入的金额大于您的余额,您当前最多可转账 "+acc.getMoney()+" 元!");
                                    System.out.println("请您重新输入转账金额!");
                                }
                                else {
                                    acc.setMoney(acc.getMoney()-money);
                                    otheracc.setMoney(otheracc.getMoney()+money);
                                    System.out.println("转账成功,您当前的余额为:"+acc.getMoney()+"元!");
                                    return;
                                }
                            }
                        }
                        else {
                            System.out.println("输入错误,请您重新输入!");
                        }
                    }
                }
            }
        }

    }

    /**
     * 验证身份
     * @param id 输入的卡号
     * @param accounts 集合
     * @return 张**,隐藏的对方的姓名
     */
    private static String authenticate(String id, ArrayList<Account> accounts) {
        Account otherUser=getAccountBycardid(id,accounts);
        String name=otherUser.getUsername();
        int flag=name.length();
        if(flag==2)
            return name=name.replace(name.substring(1),"*");
        if(flag==3)
            return name=name.replace(name.substring(1),"**");
        else
            return name=name.replace(name.substring(2),"**");
    }

    /**
     * 注销账户
     * @param accounts 集合
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static boolean unsubscribe(ArrayList<Account> accounts,Account acc, Scanner sca) {
        System.out.println("======================================注销账户======================================");
        if(acc.getMoney()>0)
        {
            System.out.println("您当前账户中还有余额 "+acc.getMoney()+" 元,不能注销账户!");
            return false;
        }

        System.out.println("您确定要注销账户吗? 是/否");
        String input=sca.next();
        switch(input)
        {
            case "是":
                accounts.remove(acc);
                System.out.println("注销账户成功!");
                return true;
        }
        return false;
    }

    /**
     * 修改密码
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void changePassword(Account acc, Scanner sca) {
        System.out.println("=====================================修改密码=======================================");
        while (true) {
            System.out.println("请您输入原密码:");
            String code=sca.next();
            if(code.equals(acc.getPassword()))
            {
                while (true) {
                    System.out.println("请您输入新密码:");
                    String password=sca.next();
                    System.out.println("请您再次输入新密码:");
                    String okpassword=sca.next();
                    if(password.equals(okpassword))
                    {
                        acc.setPassword(okpassword);
                        System.out.println("密码修改成功!");
                        return;
                    }
                    else {
                        System.out.println("您两次输入的密码不一致,请您重新输入!");
                    }
                }
            }
            else {
                System.out.println("密码错误,请您重新输入!");
            }
        }
    }

    /**
     * 取款
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void withdrawal(Account acc, Scanner sca) {
        System.out.println("=======================================取款========================================");
        if(acc.getMoney()==0)
        {
            System.out.println("您当前账户没有余额,请先存款吧!");
            return;
        }
        while (true) {
            System.out.println("请您输入取款金额:");
            double money=sca.nextDouble();
            if(money>acc.getLimitmoney())
            {
                System.out.println("您当前输入的金额大于单次取款限额,请您重新输入:");
            }
            else{
                if(money>acc.getMoney())
                    System.out.println("您当前输入的金额大于余额,请您重新输入:");
                else {
                    acc.setMoney(acc.getMoney()-money);
                    System.out.println("取款成功,您当前余额为:"+acc.getMoney()+"元");
                    return;
                }
            }
        }
    }

    /**
     * 查询账户
     * @param acc 当前登录的账户
     */
    private static void inquire(Account acc) {
        System.out.println("======================================查询账户======================================");
        System.out.println("卡号:"+acc.getCardId());
        System.out.println("户主:"+acc.getUsername());
        System.out.println("余额:"+acc.getMoney());
        System.out.println("单次限额:"+acc.getLimitmoney());
    }

    /**
     * 退出登录
     */
    private static void exit() {
        System.out.println("=====================================退出登录=======================================");
        System.out.println("退出成功!");
        return;
    }

    /**
     * 存款
     * @param acc 当前登录的账户
     * @param sca 扫描器
     */
    private static void deposit(Account acc, Scanner sca) {
        System.out.println("=======================================存款========================================");
        System.out.println("请您输入存款金额");
        double money=sca.nextDouble();
        acc.setMoney(acc.getMoney()+money);
        System.out.println("存款成功!您当前余额为:"+acc.getMoney()+"元");
    }

    /**
     * 账户注册
     * @param accounts 集合
     * @param sca 扫描器
     */
    private static void registerAccount(ArrayList<Account> accounts, Scanner sca) {
        //创建账户对象
        Account acc=new Account();
        //输入用户名
        System.out.println("请您输入用户名:");
        String name=sca.next();
        acc.setUsername(name);
        //输入密码
        while (true) {
            System.out.println("请您输入密码:");
            String password=sca.next();
            System.out.println("请您再次输入密码:");
            String okpassword=sca.next();
            if(password.equals(okpassword))
            {
                acc.setPassword(password);
                break;
            }
            else {
                System.out.println("您两次输入的密码不一致,请您重新输入!");
            }
        }
        //输入单次限额
        System.out.println("请您输入单次限额:");
        double limitmoney=sca.nextDouble();
        acc.setLimitmoney(limitmoney);
        //随机生成唯一的卡号
        String Cardid=getCardid(accounts);
        acc.setCardId(Cardid);
        System.out.println("恭喜您,账户注册成功!");
        System.out.println("尊敬的 【"+acc.getUsername()+"】 先生/女士您好,您的卡号是:"
                +acc.getCardId()+" 请您妥善保管!");
        accounts.add(acc);//添加账户到集合中
    }

    /**
     * 得到随机卡号
     * @param accounts 集合
     * @return 卡号
     */
    private static String getCardid(ArrayList<Account> accounts) {
        Random ran=new Random();
        while (true) {
            String cardid="";
            for (int i = 0; i < 16; i++) {
                cardid+=ran.nextInt(10);
            }
            if(getAccountBycardid(cardid,accounts)==null)
                return cardid;
        }
    }

    /**
     * 根据卡号获取账户信息
     * @param cardid 卡号
     * @param accounts 集合
     */
    private static Account getAccountBycardid(String cardid, ArrayList<Account> accounts) {
        for (int i = 0; i < accounts.size(); i++) {
            Account account= accounts.get(i);
            if(cardid.equals(account.getCardId()))
                return account;
        }
        return null;
    }
}

class Account {
    private String cardId;//id
    private String username;//用户名
    private double Money;//金额
    private double Limitmoney;//单次取款限额
    private String Password;//密码

    public String getPassword() {
        return Password;
    }

    public void setPassword(String password) {
        Password = password;
    }

    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 double getMoney() {
        return Money;
    }

    public void setMoney(double money) {
        Money = money;
    }

    public double getLimitmoney() {
        return Limitmoney;
    }

    public void setLimitmoney(double limitmoney) {
        Limitmoney = limitmoney;
    }
}

五、效果展示

1.账户注册

2.账户登录 

3.用户操作界面

(1)查询

(2)存款 

(3)取款 

(4)转账 

(5)修改密码 

(6)注销账户

 

注销掉【孤独求败】的账号后我们发现再次使用他原有的账号已经无法登录。 

(7)登录【西门吹雪】的账号 

 刚才【孤独求败】给【西门吹雪】转账的3000元已成功到账。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/35320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

旋转的骰子(二)

1.动画——旋转的骰子 上一次我们做了一个旋转的骰子(参看第2讲),这次我们想要点击按钮,让骰子旋转到特定的点数停下来! 2.分析需求——庖丁解牛 a.立方体特定的朝向

LiveData源码分析

先放整理流程图&#xff1a; 1.postValue调2次只触发1次&#xff1f; postValue本质是把新值保存到LiveData的mPendingData成员变量里&#xff0c;版本号1&#xff0c;把执行Runnable post到主线程&#xff0c;在主线程setValue。 多次调用会更新mPendingData的值&#xff0c…

opencv的极线几何

一、理论介绍 当我们使用针孔相机拍摄图像时&#xff0c;我们会丢失一个重要的信息&#xff0c;即图像的深度。一个解决方案如我们的眼睛的方式使用两个相机&#xff08;两只眼睛&#xff09;&#xff0c;这就是所谓的立体视觉。 PO1O2为极平面&#xff0c;l1和l2为极线,e1和…

基于webrtc的数据传输研究总结

什么是webrtc WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&…

最新阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能详解

阿里云ECS服务器S6/C6/G6/N4/R6/sn2ne/sn1ne/se1ne处理器CPU性能怎么样&#xff1f;阿里云服务器优惠活动机型有云服务器S6、计算型C6、通用型G6、内存型R6、云服务器N4、云服务器sn2ne、云服务器sn1ne、云服务器se1ne处理器CPU性能详解及使用场景说明。 1、阿里云服务器活动机…

全局唯一ID

文章目录前言MongoDB ObjectIdTwitter SnowflakeUUID前言 基于数据库设置其实初始值&#xff0c;以及增量步长。基于ZK,Redis,改良雪花集中式服务生成&#xff0c;远程调用获取id。基于并行空间划分&#xff0c;Snowflake&#xff08;8Byte字节64bit位&#xff09;&#xff0c…

供应化学试剂mPEG-Azide,mPEG-N3,甲氧基-聚乙二醇-叠氮,CAS:89485-61-0

1、名称 英文&#xff1a;mPEG-Azide&#xff0c;mPEG-N3 中文&#xff1a;甲氧基-聚乙二醇-叠氮 2、CAS编号&#xff1a;89485-61-0 3、所属分类&#xff1a;Azide PEG Methoxy PEG 4、分子量&#xff1a;可定制&#xff0c;甲氧基-聚乙二醇-叠氮 5k、甲氧基-PEG-叠氮 10…

Higress 实战: 30行代码写一个 Wasm Go 插件

前言 在11月15号的直播 《Higress 开源背后的发展历程和上手 Demo 演示》中&#xff0c;为大家演示了 Higress 的 Wasm 插件如何面向 Ingress 资源进行配置生效&#xff0c;本文对当天的 Demo 进行一个回顾&#xff0c;并说明背后的原理机制。 本文中 Demo 运行的前提&#x…

PPOCR车牌定位模型推理后处理优化研究

综述 最近在研究基于PPOCR算法的车牌识别&#xff08;LPR&#xff09;&#xff0c;部署模型后发现之前关于OCR文本定位的后处理策略在车牌识别中存在定位精度不够高&#xff0c;文本框偏移的问题&#xff0c;如&#xff1a; 经分析发现是之前的OCR后处理策略存在一定局限&am…

java刷题day 03

选择题&#xff1a; 解析&#xff1a; 父类private的成员变量&#xff0c;根据权限修饰符的访问控制范围&#xff0c;只有在类内部才能被访问&#xff0c;就算是他的子类&#xff0c;也不能访问。这里如果将Person p new Child();改成 Person p new Person();代码依然无法通过…

乐趣国学—品读《弟子规》中的“余力学文”之道

文章目录余力学文不力行 但学文 长浮华 成何人但力行 不学文 任己见 昧理真读书法 有三到 心眼口 信皆要方读此 勿慕彼 此未终 彼勿起宽为限 紧用功 工夫到 滞塞通心有疑 随札记 就人问 求确义房室清 墙壁净 几案洁 笔砚正墨磨偏 心不端 字不敬 心先病列典籍 有定处 读看毕 还原…

信号完整性测试,关于SMA装配的细节,很多人都忽视了

作者 | 萧隐君&#xff0c;仿真秀专栏作者 SMA转接头是射频微波、天线和高速电路测试经常用到的一种连接器&#xff0c;应用非常广泛&#xff0c;种类也很多。在信号完整性的测试夹具中&#xff0c;2.92mm的SMA用的较多&#xff0c;它的带宽可以到40GHz&#xff0c;对于25Gbps…

【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第2章 信息化规划与组织

文章目录&#x1f525; 11 年 4 月《信息资源管理》真卷选择题名词解释综合分析题&#x1f525; 11 年 7 月《信息资源管理》真卷选择题名词解释题简答题⭐ 12 年 4 月《信息资源管理》真卷选择题简答题⭐ 12 年 7 月《信息资源管理》真卷选择题简答题⭐ 13 年 4 月《信息资源管…

计算机网络--- 电子邮件

&#xff08;一&#xff09;电子邮件系统的组成 电子邮件是一种异步通信方式&#xff0c;通信时不需要双方同时在场。电子邮件把邮件发送到收件人使用的邮件服务器&#xff0c;并放在其中的收件人邮箱中&#xff0c;收件人可以随时上网到自己使用的邮件服务器进行读取。 一…

补盲激光雷达大爆发,各路产品谁领风骚?

11月伊始车载激光雷达赛道上演了冰火两重天的景象。国外Ouster与Velodyne LiDAR宣布合并以抱团取暖&#xff0c;主打OPA技术的Quanergy甚至股市停牌&#xff0c;一时风声鹤唳&#xff0c;寒意阵阵&#xff1b;而反观国内&#xff0c;禾赛、速腾、亮道相继发布纯固态补盲激光雷达…

龙格-库塔法(Runge-Kutta methods)

非线性的常微分方程通常是难以求出解析解的&#xff0c;只能通过多次迭代求近似的数值解。 龙格&#xff0d;库塔法&#xff08;Runge-Kutta methods&#xff09;是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。简写做RK法。 对于任意的Yf(X),假设某点(Xi,Yi)的斜…

固定资产管理系统能帮助企业解决哪些问题?

固定资产管理系统是企业信息化转型中重要的工具之一。固定资产在企业整体资金和运营管理中的占比非同一般&#xff0c;因此企业管理者对固定资产的重视程度也逐渐提升。随着企业固定资产数量和种类的增多、人员的增多&#xff0c;以及分支机构和部门的增多&#xff0c;单纯依靠…

数据安全治理白皮书4.0(附下载link)

数据安全治理白皮书是国内最早的数据安全治理白皮书系列&#xff0c;围绕数据安全治理&#xff0c;“新理论、新技术、新实践”&#xff0c;一次系统汇总、梳理分析与集中呈现&#xff0c;2018年-2021年&#xff0c;已发布1.0/2.0/3.0三个版本&#xff0c;2022年&#xff0c;已…

LeetCode | 循环队列的爱情【恋爱法则——环游世界】

兜兜转转⚪还是你❤✒前言环形队列的概念拓展&#xff1a;生产者与消费者一、题目描述二、思路分析&#x1f351;初次遇见她♀【是心动的感觉】&#x1f351;阻碍一&#xff1a;队空还是队满不好区分【性格互异】&#x1f351;解决方案&#x1f351;阻碍二&#xff1a;很难获取…

Git之借助Commitizen规范化提交代码

文章目录一、约定式提交规范1.1 概述1.2 规范1.3 好处二、Commitizen2.1 安装2.2 安装并配置cz-customizable依赖2.2.1 安装依赖2.2.2 配置package.json2.2.3 添加cz-config配置文件2.3 使用2.4 问题一、约定式提交规范 1.1 概述 约定式提交规范是一种基于提交信息的轻量级约…