Java实战案例————ATM

需求分析

首先ATM银行系统包括两个基础大功能:开户和登陆账户(当然在系统中没有一个账户时不能登录,需要先开户)。

一名用户有6项基本信息描述:姓名、性别、银行卡号、银行卡密码、账户余额、取款限额。

在登录账户后又有7项功能:查询账户信息、存款、取款、转账、修改密码、退出、注销账户。

代码展示

// ATM.java

public class ATM {
    private int id;
    private String name;
    private char sex;
    private double moneyLeft;
    private double moneyCon;
    private String code;

    public ATM() {}

    public ATM(int id, String name, char sex, double moneyLeft, double moneyCon, String code) {
        this.id = id;
        this.name = name;
        this.sex = sex;
        this.moneyLeft = moneyLeft;
        this.moneyCon = moneyCon;
        this.code = code;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public double getMoneyLeft() {
        return moneyLeft;
    }

    public void setMoneyLeft(double moneyLeft) {
        this.moneyLeft = moneyLeft;
    }

    public double getMoneyCon() {
        return moneyCon;
    }

    public void setMoneyCon(double moneyCon) {
        this.moneyCon = moneyCon;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}
// ATMOperator.java

public class ATMOperator {
    ArrayList<ATM> ATMlist = new ArrayList<>();

    //开户
    public void register() {
        ATM user = new ATM();
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的用户名");
        String name = sc.next();
        user.setName(name);
        while (true) {
            System.out.println("请输入你的性别,‘男’ 或 ‘女’ ");
            String tmp = sc.next();
            char sex = tmp.charAt(0);
            if (sex != '男' && sex != '女') {
                System.out.println("请输入‘男’ 或 ‘女’");
            } else {
                user.setSex(sex);
                break;
            }
        }
        while (true) {
            System.out.println("请输入你的密码");
            String code = sc.next();
            System.out.println("请确认你的密码");
            String confirmCode = sc.next();
            if (code.equals(confirmCode)) {
                user.setCode(code);
                break;
            } else {
                System.out.println("两次密码不一致,请重新输入密码");
            }
        }
        System.out.println("请输入你的每次取款限额");
        double moneyCon = sc.nextDouble();
        user.setMoneyCon(moneyCon);

        String id = "";
        Random r = new Random();
        for (int i = 0; i < 7; i++) {
            int num = r.nextInt(10);
            id += num;
        }
        System.out.println("恭喜你,开户成功!卡号是:" + id);
        int id1 = Integer.parseInt(id);
        user.setId(id1);

        ATMlist.add(user);
    }

    //查询打印账户信息
    public void print(int n) {
        System.out.println("----------" + ATMlist.get(n).getName() + "先生的账户信息----------");
        System.out.println("账户卡号:" + ATMlist.get(n).getId());
        System.out.println("账户名:" + ATMlist.get(n).getName());
        System.out.println("性别:" + ATMlist.get(n).getSex());
        System.out.println("余额:" + ATMlist.get(n).getMoneyLeft());
        System.out.println("取款限额:" + ATMlist.get(n).getMoneyCon());
        System.out.println("--------------------------------");
    }

    //展示登录界面
    public void showLogon(int user) {
        Scanner sc = new Scanner(System.in);
        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、注销账户");
            String n = sc.next();
            switch (n) {
                case "1":
                    print(user);
                    break;
                case "2":
                    saveMoney(user);
                    break;
                case "3":
                    getMoney(user);
                    break;
                case "4":
                    transforAccounts(user);
                    break;
                case "5":
                    changePassword(user);
                    break;
                case "6":
                    return;
                case "7":
                    unsubscribe(user);
                    break;
                default:
                    System.out.println("请输入正确的指令");
                    break;
            }
        }
    }


    //登录账户
    public int logon() {
        if (ATMlist.size() == 0) {
            System.out.println("您还未开户,请先开户");
            throw new RuntimeException("Exception occurred");
        }
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的卡号");
        int id = sc.nextInt();
        int tmp = -1;
        for (int i = 0; i < ATMlist.size(); i++) {
            if (ATMlist.get(i).getId() == id) {
                System.out.println(ATMlist.get(i).getName() + "先生,您已经成功登录账户");
                tmp = i;
                break;
            }
        }
        if (tmp == -1) {
            System.out.println("您输入的卡号不存在");
            throw new RuntimeException("Exception occurred");
        } else {
            showLogon(tmp);
            return tmp;
        }
    }

    //存款
    public void saveMoney(int user) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要存的金额");
        double saveMoney = sc.nextDouble();
        double rs = saveMoney + ATMlist.get(user).getMoneyLeft();
        System.out.println("存钱成功!您的余额为:" + rs);
        ATMlist.get(user).setMoneyLeft(rs);
    }

    //取款
    public void getMoney(int user) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你要取的金额");
        double money = sc.nextDouble();
        if (money > ATMlist.get(user).getMoneyLeft()) {
            System.out.println("余额不足,取款失败");
        } else {
            double rs = ATMlist.get(user).getMoneyLeft() - money;
            ATMlist.get(user).setMoneyLeft(rs);
            System.out.println("取款成功!你的余额为:" + ATMlist.get(user).getMoneyLeft());
        }
    }

    //转账
    public void transforAccounts(int user) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入你的转账对象的卡号");
        int id = sc.nextInt();
        for (int i = 0; i < ATMlist.size(); i++) {
            if (id == ATMlist.get(i).getId()) {
                System.out.println("请问是要给*" + ATMlist.get(i).getName().substring(1) + "转账吗?");
                String tmp = sc.next();
                char answer = tmp.charAt(0);
                if (answer == (ATMlist.get(i).getName().charAt(0))) {
                    System.out.println("请输入你要转账的金额");
                    double money = sc.nextDouble();
                    if (money > ATMlist.get(user).getMoneyLeft()) {
                        System.out.println("你的余额不足,转账失败");
                        return;
                    } else {
                        if (money > ATMlist.get(user).getMoneyCon()) {
                            System.out.println("超出取款限额,请重试");
                            return;
                        } else {
                            double rs = ATMlist.get(user).getMoneyLeft() - money;
                            ATMlist.get(user).setMoneyLeft(rs);
                            double otherrs = ATMlist.get(i).getMoneyLeft() + money;
                            ATMlist.get(i).setMoneyLeft(otherrs);
                            System.out.println("转账成功!您的余额为:" + rs);
                        }
                    }
                } else {
                    System.out.println("你输入的对方账户姓氏不正确,请重试");
                    return;
                }
            }else System.out.println("卡号输入有误,请重试");
        }
    }

    //修改密码
    public void changePassword(int user) {
        Scanner sc = new Scanner(System.in);
        System.out.println("确认为本人,请输入你的新密码");
        String newcode = sc.next();
        System.out.println("请确认新密码");
        String confirmCode = sc.next();
        if (newcode.equals(confirmCode)) {
            ATMlist.get(user).setCode(newcode);
            System.out.println("修改密码成功!请牢记密码");
        } else {
            System.out.println("两次密码不一致,请重试");
            return;
        }
    }

    //退出
    public void exit() {
        ;
    }

    //注销账户
    public void unsubscribe(int user) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("你确定要注销该账户?y/n");
            String answer = sc.next();
            if (answer.equals("y")) {
                System.out.println("你已成功注销账户");
                ATMlist.remove(user);
                break;
            } else if (answer.equals("n")) {
                System.out.println("你选择了保留账户");
                break;
            } else {
                System.out.println("请输入 y/n");
            }
        }
    }

    public void start() {
        Scanner sc = new Scanner(System.in);
        while (true){
            System.out.println("请选择你要进行的操作");
            System.out.println(("1、开户"));
            System.out.println("2、登录账户");
            System.out.println("0、退出系统");
            String num = sc.next();
            switch (num) {
                case "0":
                    return;
                case "1":
                    register();
                    break;
                case "2":
                    int user = logon();
                    break;
                default:
                    System.out.println("请输入正确的指令");
                    break;
            }
        }
    }
}
// Test.java (测试用例)

public class Test {
    public static void main(String[] args) {
        ATMOperator ts = new ATMOperator();
        ts.start();
    }
}

场景测试

1、首先是在未开户情况下的登录账户操作:

2、开户

(一)性别乱填

(二)密码输入不一致

(三)正常开户

3、登录账户,但是登录密码错误

4、成功登录账户

a. 查询打印账户信息

b. 存款取款

c.转账(这里转账卡号输错情况写错了,截图懒得改了....)

转账需要2个用户,我先开2个用户,并给梨花存2000元:

现在我用梨花的账户给小王’转账2500:

余额不足,那我转1500:

超出梨花转账限额,那我转100:

 成功!

d.修改密码

e.注销账户

以上就是所有基本功能!

感谢阅读!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis的创建,简单易懂的一篇blog

文章目录 一、MyBatis是什么二、操作流程三.配置resource总结 一、MyBatis是什么 MyBatis 是⼀款优秀的持久层框架&#xff0c;它⽀持⾃定义 SQL、存储过程以及⾼级映射。MyBatis 去除了⼏乎所有的 JDBC 代码以及设置参数和获取结果集的⼯作。MyBatis 可以通过简单的 XML 或注…

Docker常见命令介绍

命令说明 docker pull 拉取镜像 docker push 推送镜像到DockerRegistry docker images 查看本地镜像 docker rmi 删除本地镜像 docker run 创建并运行容器&#xff08;不能重复创建&#xff09; docker stop 停止指定容器 docker start 启动指定容器 docker rest…

SpringBoot2.x整合WebService实现远程接口调用

一、添加依赖 <!-- SpringBoot 2.4 以下版本--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web-services</artifactId> </dependency><dependency><groupId>org.apach…

『测试基础』| 如何理解测试用例管理和缺陷管理?

『测试管理攻略』| 如何理解测试用例管理和缺陷管理&#xff1f; 1 测试用例定义2 测试用例设计原则3 测试用例的评审4 测试如何维护&#xff1f;5 用例的作用6 用例管理工具7 缺陷关注的重点8 缺陷分析9 缺陷管理工具 1 测试用例定义 测试用例&#xff08;TestCase&#xff0…

二叉树OJ题目——C语言

LeetCode 104.二叉树的最大深度 1. 题目描述&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例…

Docker数据卷

创建数据卷html、conf &#xff0c;分别与Nginx容器内部的html、conf目录关联。数据卷html、conf分别指向宿主机 /var/lib/docker/volumes/html/_data 目录和 /var/lib/docker/volumes/conf/_data 目录&#xff0c;将容器中的html、conf目录与宿主机的html、conf目录关联起来&a…

Leetcode—1657.确定两个字符串是否接近【中等】

2023每日刷题&#xff08;四十五&#xff09; Leetcode—1657.确定两个字符串是否接近 算法思想 源于灵神 实现代码 class Solution { public:bool closeStrings(string word1, string word2) {int len1 word1.size();int len2 word2.size();if(len1 ! len2) {return fa…

【代码】基于储能电站服务的冷热电多微网系统双层优化配置(完美复现)matlab/yalmip

程序名称&#xff1a;基于储能电站服务的冷热电多微网系统双层优化配置 实现平台&#xff1a;matlab-yalmip-cplex/gurobi 代码简介&#xff1a;代码主要做的是一个共享储能电站的双层优化配置模型&#xff0c;将储能电站服务应用到多维网系统中&#xff0c;建立了考虑不同时…

23.Python 图形化界面编程

目录 1.认识GUI和使用tkinter2.使用组件2.1 标签2.2 按钮2.3 文本框2.4 单选按钮和复选按钮2.5 菜单和消息2.6 列表框2.7 滚动条2.8 框架2.9 画布 3. 组件布局4.事件处理 1.认识GUI和使用tkinter 人机交互是从人努力适应计算机&#xff0c;到计算机不断适应人的发展过程&#…

Linux操作系统 2.Linux基础命令

Linux基础命令&#xff0c;掌握这一套清晰的讲解就够啦&#xff01; 本篇博客给大家带来的是Linux的基础命令和vi编辑器 感谢大家收看~ 一、Linux目录结构 Linux的目录结构是一个树形结构&#xff0c;Linux只有一个根目录 / 所有文件都存在/下面 Linux路径的描述方式 Linux系…

12.2_黑马Redis实战篇附近商铺用户签到UV统计

实战篇11 实战篇12 要先用test的方式把商铺的数据导入到idea当中&#xff0c;才可以进行查询噢。 代码&#xff1a; 实战篇13 thinking&#xff1a;插件mavenhelper&#xff1f; 方便处理pom文件。 实战篇15 实战篇16 thinking&#xff1a;XX.format(DateTimeFormatter.ofP…

6.8 Windows驱动开发:内核枚举Registry注册表回调

在笔者上一篇文章《内核枚举LoadImage映像回调》中LyShark教大家实现了枚举系统回调中的LoadImage通知消息&#xff0c;本章将实现对Registry注册表通知消息的枚举&#xff0c;与LoadImage消息不同Registry消息不需要解密只要找到CallbackListHead消息回调链表头并解析为_CM_NO…

23种设计模式之C++实践(一)

23种设计模式之C++实践 1. 简介2. 基础知识3. 设计模式(一)创建型模式1. 单例模式——确保对象的唯一性1.2 饿汉式单例模式1.3 懒汉式单例模式比较IoDH单例模式总结2. 简单工厂模式——集中式工厂的实现简单工厂模式总结3. 工厂方法模式——多态工厂的实现工厂方法模式总结4.…

TOP-K问题和向上调整算法和向下调整算法的时间复杂度问题的分析

TOP-K问题 TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一般情况下数据量都比较大 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等 对于Top-K问题&#xff0c;能想到的最简单直接的方式就是排序&#xff0c;但是…

LD_PRELOAD劫持、ngixn临时文件、无需临时文件rce

LD_PRELOAD劫持 <1> LD_PRELOAD简介 LD_PRELOAD 是linux下的一个环境变量。用于动态链接库的加载&#xff0c;在动态链接库的过程中他的优先级是最高的。类似于 .user.ini 中的 auto_prepend_file&#xff0c;那么我们就可以在自己定义的动态链接库中装入恶意函数。 也…

maven下载和安装

maven下载和安装 一、概述 Maven是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (Project Object Model)&#xff0c;一组标准集合&#xff0c;一个项目生命周期(Project Lifecycle)&#xff0c;一个依赖管理系统(Dependency Management System)&#xff0c;和用来…

算法通关村第十四关-白银挑战堆的经典问题

大家好我是苏麟 , 今天带来堆的一些经典问题 , 我们一起研究一下 . 大纲 数组中的第K个最大元素合并 K 个升序链表 数组中的第K个最大元素 描述 : 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k …

Hdoop学习笔记(HDP)-Part.14 安装YARN+MR

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

Java Throwable

如图展示了 Java 整个异常体系的关系。 Throwable 的 Java 异常体系的基类, 他的直接子类有 Error 和 Exception 2 个。 1 Error Error 表示的是由于系统错误, Java 虚拟机抛出的异常, 例如 Java 虚拟机崩溃, 内存不够等, 这种情况仅凭程序自身是无法处理的, 在程序中也不会…

VBA_MF系列技术资料1-232

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…