自学Java做的第一个入门项目:ATM银行系统

2023-11-11

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<>();
        while (true) {
            System.out.println("----------欢迎使用ATM系统----------");
            System.out.println("1.登录账号");
            System.out.println("2.注册账号");
            System.out.println("请选择你要进行的操作:");
            Scanner sc = new Scanner(System.in);
            int command = sc.nextInt();
            switch (command) {
                case 1:
                    login(accounts, sc);
                    break;
                case 2:
                    register(accounts, sc);
                    break;
                default:
                    System.out.println("命令错误!");
            }
        }
    }

    /**
     * 注册账户
     *
     * @param accounts 存储账户对象的集合
     * @param sc       扫描器
     * @return
     */
    private static void register(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("==========欢迎进入到注册操作==========");
        //1.创建一个账户对象,用于后期封装账户信息
        Account account = new Account();

        //2.为这个账户对象录入信息
        System.out.println("请输入账号名称:");
        String name = sc.next();
        account.setName(name);

        while (true) {
            System.out.println("请输入账户密码:");
            String password = sc.next();
            System.out.println("请输入确认密码:");
            String password2 = sc.next();
            if (password.equals(password2)) {
                account.setPassword(password);
                break;
            } else {
                System.out.println("两次输入密码不一致!");
            }
        }

        System.out.println("请设置单次取现额度:");
        double restrictMoney = sc.nextDouble();
        account.setRestrictMoney(restrictMoney);

        String id = getRandomId(accounts);
        account.setId(id);
        System.out.println("恭喜您," + name + ",您的账户注册成功,您的卡号是:" + id);
        accounts.add(account);
    }

    /**
     * 为账户生成8位与其他账户不同的卡号
     *
     * @return
     */
    private static String getRandomId(ArrayList<Account> accounts) {
        Random r = new Random();
        while (true) {
            //1.生成8位数字
            String id = "";
            for (int i = 0; i < 8; i++) {
                id += r.nextInt(10);
            }

            //2.判断该卡号是否与其他账户卡号重复
            Account account = getAccountById(accounts, id);
            if (account == null) {
                return id;
            }
        }
    }

    /**
     * 根据卡号查询账户对象
     *
     * @param accounts
     * @param id
     * @return
     */
    private static Account getAccountById(ArrayList<Account> accounts, String id) {
        for (int i = 0; i < accounts.size(); i++) {
            Account account = accounts.get(i);
            if (account.getId().equals(id)) {
                return account;
            }
        }
        return null;
    }

    /**
     * 登录账户
     *
     * @param accounts 存储账户对象的集合
     * @param sc       扫描器
     * @return
     */
    private static void login(ArrayList<Account> accounts, Scanner sc) {
        System.out.println("==========欢迎进入到登陆操作==========");
        //1.判断当前系统中有无账号存在
        if (accounts.size() == 0) {
            System.out.println("当前系统无任何账户,请注册后登录!");
            return;
        }

        //2.登陆账号
        while (true) {
            System.out.println("请输入登录的卡号:");
            String id = sc.next();
            Account account = getAccountById(accounts, id);
            if (account != null) {
                while (true) {
                    System.out.println("请输入登陆密码:");
                    String password = sc.next();
                    if (password.equals(account.getPassword())) {
                        System.out.println("登陆成功!欢迎你:" + account.getName() + ",进入操作系统,请开始办理你的业务:");
                        showUserCommand(accounts, sc, account);
                        return;
                    } else {
                        System.out.println("密码错误!请重新输入!");
                    }
                }
            } else {
                System.out.println("卡号不存在!请确认后重新输入!");
            }
        }
    }

    /**
     * 登录操作
     *
     * @param accounts
     * @param sc
     * @param account
     */
    private static void showUserCommand(ArrayList<Account> accounts, Scanner sc, Account account) {
        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 command = sc.nextInt();
            switch (command) {
                case 1:
                    inquire(account);
                    break;
                case 2:
                    deposit(account, sc);
                    break;
                case 3:
                    withdrawals(account, sc);
                    break;
                case 4:
                    transfer(accounts, account, sc);
                    break;
                case 5:
                    changePassword(account, sc);
                    return;
                case 6:
                    return;
                case 7:
                    logout(accounts, account, sc);
                    return;
                default:
                    System.out.println("命令不存在!");
            }
        }
    }

    /**
     * 查询账户对象信息
     *
     * @param account
     */
    private static void inquire(Account account) {
        System.out.println("==========您当前账户详情信息如下==========");
        System.out.println("卡号:" + account.getId());
        System.out.println("户主:" + account.getName());
        System.out.println("余额:" + account.getMoney());
        System.out.println("当前取现额度:" + account.getRestrictMoney());
    }

    /**
     * 向账户内存款
     *
     * @param account
     * @param sc
     */
    private static void deposit(Account account, Scanner sc) {
        System.out.println("==========欢迎进入存款操作==========");
        System.out.println("请输入存款金额:");
        double money = sc.nextDouble();
        account.setMoney(money + account.getMoney());
        System.out.println("存款成功!");
        inquire(account);
    }

    /**
     * 从账户内取款
     *
     * @param account
     * @param sc
     */
    private static void withdrawals(Account account, Scanner sc) {
        System.out.println("==========欢迎进入账户取款操作==========");

        while (true) {
            System.out.println("请输入取钱的金额:");
            double withdrawalsMoney = sc.nextDouble();
            if (withdrawalsMoney > account.getRestrictMoney()) {
                System.out.println("超出每次取款限额!");
            } else {
                if (withdrawalsMoney > account.getMoney()) {
                    System.out.println("您的余额不足!");
                } else {
                    account.setMoney(account.getMoney() - withdrawalsMoney);
                    System.out.println("取款成功!请及时取走您的钱!您当前余额为:" + account.getMoney());
                    return;
                }
            }
        }

    }

    /**
     * 转账
     *
     * @param accounts
     * @param account
     * @param sc
     */
    private static void transfer(ArrayList<Account> accounts, Account account, Scanner sc) {
        System.out.println("==========欢迎进入到转账系统==========");
        if (accounts.size() == 1) {
            System.out.println("该系统中没有其他用户,请注册后再进行转账!");
            return;
        }
        while (true) {
            System.out.println("请输入你要转账的卡号:");
            String id = sc.next();
            //1.判断一:被转账卡号是否为该用户卡号
            if (id.equals(account.getId())) {
                System.out.println("不能给自己转账!");
                continue;
            }
            Account account1 = getAccountById(accounts, id);
            //2.判断二:转账卡号是否存在
            if (account1 != null) {
                String name1 = account1.getName();
                String tip = "*" + name1.substring(1);
                System.out.println("请您输入" + tip + "的姓氏来确认");
                String preName = sc.next();
                //3.判断三:让用户确认被转账人姓名
                if (name1.startsWith(preName)) {
                    while (true) {
                        System.out.println("请输入转账的金额" + "(您最多可以转账:" + account.getMoney() + "元):");
                        double transferAmount = sc.nextDouble();
                        //4.判断四:判断转账金额是否大于余额
                        if (transferAmount <= account.getMoney()) {
                            account.setMoney(account.getMoney() - transferAmount);
                            account1.setMoney(account1.getMoney() + transferAmount);
                            System.out.println("转账成功!你的余额为:" + account.getMoney());
                            return;
                        } else {
                            System.out.println("余额不足!");
                        }
                    }
                } else {
                    System.out.println("你输入的对方信息有误!");
                }
            } else {
                System.out.println("该卡号不存在请重新输入!");
            }
        }
    }

    /**
     * 修改密码
     *
     * @param account
     */
    private static void changePassword(Account account, Scanner sc) {
        while (true) {
            System.out.println("请输入当前密码进行认证:");
            String password1 = sc.next();
            if (password1.equals(account.getPassword())) {
                while (true) {
                    System.out.println("请输入新密码:");
                    String password2 = sc.next();
                    System.out.println("请确认新密码:");
                    String password3 = sc.next();
                    if (password2.equals(password3)) {
                        account.setPassword(password2);
                        System.out.println("修改成功!");
                        return;
                    } else {
                        System.out.println("两次密码不一致!");
                    }
                }
            } else {
                System.out.println("密码错误!请重新确认!");
            }
        }
    }

    /**
     * 注销账号
     *
     * @param account
     * @param sc
     */
    private static void logout(ArrayList<Account> accounts, Account account, Scanner sc) {
        while (true) {
            System.out.println("请您输入密码确认注销:");
            String password = sc.next();
            if (password.equals(account.getPassword())) {
                accounts.remove(account);
                System.out.println("注销成功!");
                break;
            } else {
                System.out.println("密码错误!");
            }
        }
    }
}

有问题请指出!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自学Java做的第一个入门项目:ATM银行系统 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • MP3:一种以毫秒为单位获取任何给定字节位置的位置的方法?

    我创建了一个 servlet 它返回从客户端请求的任何给定字节位置开始的流 来自 MP3 文件 这允许客户端在任何给定字节位置立即开始播放 而无需进行任何本地查找 现在 我有一个滑块可以直观地显示进度 我正在使用当前字节位置来更新滑块 但是
  • 使用 Checkstyle Plugin 时从插件调用代码时出现问题:“org.eclipse.jface”

    我正在尝试在 Rational Software Architect 7 0 0 4 上使用 eclipse cs 插件 我最近卸载了旧的 beta2 版本并安装了 beta3 插件本身按照之前的配置工作 但是每当我尝试通过 Windows
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • Java替换特定字符

    这是我在这个网站上的第一个问题 所以我会尽量不要成为一个十足的菜鸟 我目前正在用java 创建刽子手游戏 所以我问你的问题是我们是否被赋予了 幽灵 这个词 并将 Ghost 替换为 hiddenWord ghost length for i
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 参数动态时如何构建 JPQL 查询?

    我想知道是否有一个好的解决方案来构建基于过滤器的 JPQL 查询 我的查询太 富有表现力 我无法使用 Criteria 就像是 query Select from Ent if parameter null query WHERE fiel
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • Spock模拟inputStream导致无限循环

    我有一个代码 gridFSFile inputStream bytes 当我尝试这样测试时 given def inputStream Mock InputStream def gridFSDBFile Mock GridFSDBFile
  • Path2D 上的鼠标指针检测

    我构建了一个Path2D http docs oracle com javase 7 docs api java awt geom Path2D html表示由直线组成的未闭合形状 我希望能够检测何时单击鼠标并且鼠标指针靠近路径 在几个像素
  • Java中获取集合的幂集

    的幂集为 1 2 3 is 2 3 2 3 1 2 1 3 1 2 3 1 假设我有一个Set在爪哇中 Set
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public

随机推荐

  • Uni-App 获取用户已装应用列表

    获取用户已装应用列表 plus android importClass java util ArrayList plus android importClass android content pm PackageInfo plus and
  • 【老生谈算法】matlab实现连续时间系统的频域分析与仿真——频域分析

    matlab连续时间系统的频域分析与仿真 1 文档下载 本算法已经整理成文档如下 有需要的朋友可以点击进行下载 序号 文档 点击下载 本项目文档 老生谈算法 matlab连续时间系统的频域分析与仿真 doc 2 算法详解 内 容 摘 要 M
  • Java集合、多线程、反射和Spring框架总结,源码解析

    Java集合 多线程 反射和Spring框架总结 源码解析 一 集合 通过不同的数据结构存储以及操作数据的工具 1 1 Collection 1 1 1 ArrayList Vector 1 1 1 1 底层原理 ArrayList和Vec
  • uniapp踩坑系列之二

    今天在用真机在小程序上预览的时候 发现无法预览 一直报错超过微信最大2m 总共也才3个页面 怎么就那么大 经过小程序包分析工具发现 打包以后的vender js文件达到1 7m 最后发现 在main js中引入了一些无用的第三方库 包括ec
  • WEB页面通过ajax进行图片上传实例(附代码)

    背景 公司需要一个签约页面 支持拍照或选择图片上传 应用场景主要在手机端 页面代码 1 2 3 4 5 6
  • pbr公式推导过程,很好

    渲染基础理论的介绍 1 Tags math computer graphics 基础概念 辐射度学 Radiometry 辐射度学是指测量电磁辐射 包括可见光 的一系列技术 它是和观察者无关的 而近似的光度学 photometric 是观察
  • vlc activex调用

    首先是在html页面调用 第一种方式 下面直接给出的是调用函数 function doGo targetURL port var options new Array vlc input repeat 1 aspect ratio 704 4
  • 代码的认爹之路: 面向对象继承

    面向对象 继承 前言 Hello 各位同学朋友大家好啊 今天给大家分享的技术呢 是面向对象三大特征之一的继承 我们今天主要按照以下几个点 展开继承的讲解 目录 继承的介绍 继承的好处和弊端 继承中成员访问特点 成员变量 继承中成员访问特点
  • 苏宁!你还挺得过去吗?(苏宁大幅裁员)

    前两天才写了一篇 作为一个江苏人 我眼中的苏宁 说实话 我内心是有点不太相信 偌大的苏宁会走到今天这步田地 可一件件传闻都慢慢变成了实锤 一 苏宁大裁员 一位多年老友刚跳槽去了苏宁 入职一个月 就面临整个部门裁员 据说要直接裁掉4成研发人员
  • 解决报错: `defaultValue` is invalid for `getFieldDecorator` will set `value`, please use `option...

    报错原因 当我的input 绑定了v decorator的时候 又设置了default value默认值 如下
  • 小波去噪及其matlab实现方法

    小波去噪是小波分析的一个应用 小波分析是一种数学工具 用于将信号分解成不同的频率分量 小波去噪的目的是利用小波变换将噪声从信号中去除 MATLAB Matrix Laboratory 是一种基于数值计算的高级工具 广泛用于工程 科学和金融等
  • C语言-字符串(单个字符)

    一 字符串 单个字符 的定义 1 单个字符的定义 char i x 单个字符的定义 字符串创建后为常量无法修改 2 一维字符串数组的定义 char i xxxx 此方式定义的一维字符串数组必须立刻赋值 char i 4 此方式相当于在存储器
  • 多线程批量执行任务简单实例(CompletableFuture)

    创建线程的四种方式 1 extendds Thred类 start 2 implements Runnable接口 new Thread new MyRun start 3 ListenableFuture CompletableFutur
  • C++11 并发指南五(std condition_variable 条件变量 详解)

    C 11 并发指南五 std condition variable 详解 前面三讲 C 11 并发指南二 std thread 详解 C 11 并发指南三 std mutex 详解 分别介绍了 std thread std mutex st
  • 计算机毕业设计Node.js+Vue基于Web的网络教学系统(程序+源码+LW+部署)

    该项目含有源码 文档 程序 数据库 配套开发软件 软件安装教程 欢迎交流 项目运行 环境配置 Node js Vscode Mysql5 7 HBuilderX Navicat11 Vue Express 项目技术 Express框架 No
  • k8s学习-DaemonSet(模板、创建、更新、回滚、删除等)

    目录 概念 模板 实战 创建 更新 回滚 回滚到上一版本 回滚到指定版本 删除 参考 概念 DaemonSet 守护进程集 在kubectl中缩写为ds 在所有节点或者是匹配的节点上都部署一个Pod 当有节点加入集群时 也会为他们新增一个
  • Unity Cinemachine之第三人称摄像机CinemachineFreeLook属性详解

    演示 CinemachineFreeLook是一个第三人称视角相机插件 功能非常强大 内置了很多属性可以供开发者根据需求进行调整 创建 首先是Cinemachine插件的导入 如果是2018以后的Unity版本 应该 可以直接从Unity顶
  • C++之:struct和class的区别

    一 数据封装和成员访问权限 1 结构体 struct 在struct中 默认的成员访问权限是public 这意味着 在结构体外部 我们可以直接访问其成员变量和成员函数 下面是一个简单的例子 struct Point int x y Poin
  • ggplot2入门

    ggplot2入门 二 3 5 几何对象 geom 和统计变换 stat 几何对象执行着图层的实际渲染 控制着生成的图像类型 各种类型图如下 示例代码如下 head mtcars library ggplot2 p lt ggplot mt
  • 自学Java做的第一个入门项目:ATM银行系统

    import java util ArrayList import java util Random import java util Scanner public class ATMSystem public static void ma