Java实战案例————ATM

news2024/12/23 15:23:20

需求分析

首先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.注销账户

以上就是所有基本功能!

感谢阅读!!

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

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

相关文章

独家揭秘:卢松松拍摄视频背后的创作过程

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 一条视频刚刚发几分钟&#xff0c;有个粉丝就过来评论说&#xff1a; 抛开广告性&#xff0c;越来越有感觉了。 于是今天的这篇文章就来了&#xff0c;也顺便给大家分享下近期我拍视频、编辑视频的…

css实现最简单的3d透视效果,通过旋转可以直观感受到

css的3d效果还是非常复杂的&#xff0c;我今天简单学习了一下入门&#xff0c;实现了一个超级简单的效果&#xff0c;帮助我自己理解这个3d的过程&#xff0c;实现的效果动画如下&#xff1a;可以通过调整父元素旋转的角度&#xff0c;更加直观的感受这个3d效果&#xff1a; 实…

解决Wireshark分析RTMP抓包时Unknown问题

使用Wireshark抓包时&#xff0c;经常出现很多Unknown包&#xff0c;但实际上的字节流实际是正常的。 其实&#xff0c;RTMPT设置里有一个最大包大小的设置&#xff0c;默认是32768&#xff0c;而且默认RTMPT协议配置了从多个TCP流中重组RTMPT的功能(应当是考虑基于HTTP的传输…

基于java+swing+mysql五子棋小游戏(含实训报告)

基于javaswingmysql五子棋小游戏&#xff08;含实训报告&#xff09; 一、系统介绍二、功能展示四、其它1.其他系统实现五.获取源码 一、系统介绍 一、实验目的 1、熟练掌握基本网络编程技术。 2、掌握Swing图形用户界面编程。 3、掌握多线程编程的基本原理&#xff0c;能使用…

【并发编程】什么是死锁?死锁如何解决?线上发生死锁应该怎么办?

&#x1f4eb;作者简介&#xff1a;小明Java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

Simple_SSTI_1-WEB-bugku-解题步骤

——CTF解题专栏—— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 题目信息&#xff1a; 题目&#xff1a;Simple_SSTI_1 作者&#xff1a;valecalida 提示&#xff1a;无 场景&#xff1a; 解题…

面试数据库八股文十问十答第一期

面试数据库八股文十问十答第一期 作者&#xff1a;程序员小白条&#xff0c;个人博客 1.MySQL常见索引、 MySQL常见索引有: 主键索引、唯一索引、普通索引、全文索引、组合索引(最左前缀)主键索引特点&#xff1a;唯一性&#xff0c;非空&#xff0c;自增&#xff08;如果使用…

Azure Machine Learning - 使用 REST API 创建 Azure AI 搜索索引

本文介绍如何使用 Azure AI 搜索 REST AP和用于发送和接收请求的 REST 客户端以交互方式构建请求。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&…

Python zip函数及用法与lambda表达式及用法

Python zip函数及用法 zip() 函数可以把两个列表“压缩”成一个 zip 对象&#xff08;可迭代对象&#xff09;&#xff0c;这样就可以使用一个循环并行遍历两个列表。为了测试 zip() 函数的功能&#xff0c;我们可以先在交互式解释器中“试验”一下该函数的功能。 >>&g…

自定义类型-结构体,联合体和枚举-C语言

引言 能看到结构体&#xff0c;说明C语言想必学习的时间也不少了&#xff0c;在之前肯定也学习过基本数据类型&#xff0c;包括整型int&#xff0c;浮点型float等等。可是在日常生活中&#xff0c;想要描述一个事物并没有那么简单。比如&#xff0c;你要描述一本书&#xff0c…

简单搭建Python开发环境

Python环境安装 Python官网: Welcome to Python.org 1. 选择Python3.x版本下载&#xff0c;建议使用稳定版3.9.13&#xff08;Stable Releases&#xff09;&#xff0c;绝大数库对3.9版本Python已良好支持&#xff0c;但对3.10及以上支持不完全&#xff1a; https://www.…

【【FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验】】

FPGA 之 MicroBlaze 自定义IP核 之 呼吸灯实验 通过创建和封装 IP 向导的方式来自定义 IP 核&#xff0c;支持将当前工程、工程中的模块或者指定文件目录封装成 IP 核&#xff0c;当然也可以创建一个带有 AXI4 接口的 IP 核&#xff0c;用于 MicroBlaze 软核处理器和可编程逻辑…

误用STM32串口发送标志位 “USART_FLAG_TXE” “USART_FLAG_TC”造成的BUG

当你使用串口发送数据时是否出现过这样的情况&#xff1a; 1.发送时第一个字节丢失。 2.发送时出现莫名的字节丢失。 3.各种情况字节丢失。 1.先了解一下串口发送的流程图&#xff08;手动描绘&#xff09;&#xff1a; 可以假想USART_FLAG_TXE是用于检测"弹仓"&…

8、内部FLASH模拟EEPROM实验(STM32F407)

STM32编程方式 在线编程&#xff08;ICP,In-Circuit Programming&#xff09;: 通过JTAG/SWD协议或者系统加载程序(Bootloader)下载用户应用程序到微控制器中。 在程序中编程(IAP,In Application Programming):通过任何一种通信接口(如IO端口,USB,CAN,UART,I2C,SPI等)下载程…

记录 | photoshop移动选区

期望达到的效果&#xff1a; 选择一块区域&#xff0c;并移动它 操作&#xff1a; (1) 选择矩形选框工具&#xff0c; (2) 对区域进行选取&#xff0c; (3) 选择移动工具&#xff0c; (4) 移动选区&#xff0c;效果如下&#xff0c;

LED屏幕信息安全如何预防?

随着科技的不断进步&#xff0c;LED屏幕在我们生活和工作中扮演着越来越重要的角色&#xff0c;然而&#xff0c;随之而来的是信息安全面临的挑战。为了有效预防LED屏幕信息的泄露和被盗取&#xff0c;我们需要采取一系列的安全措施。以下是一些建议&#xff1a; 物理安全措施&…

VSCode主题自定义

记录vscode主题配置 {"editor.minimap.enabled": true,"files.autoSave": "afterDelay","security.workspace.trust.untrustedFiles": "open","markdown-preview-enhanced.previewTheme": "atom-light.css&…

oracle sql相关语法

SQL*PLUS 在SQL*PLUS执行&#xff0c;会在执行后显示查询的执行计划和统计信息 SET AUTOTRACE ON;SELECT * FROM your_table WHERE column_name value;SET AUTOTRACE OFF;PLSQL PLSQL查询sql界面&#xff0c;鼠标右键&#xff0c;点击执行计划&#xff0c;会出现sql的执行计…

09-命令者模式-C语言实现

命令者模式是一个高内聚的模式&#xff0c; 其定义为&#xff1a; Encapsulate a request as an object,thereby letting you parameterize clients with different requests,queue or log requests,and support undoable operations.&#xff08;将一个请求封装成一个对象&…

非得让你会之MyBatis插件与Java动态代理

引言 咱们今天聊聊Java动态代理&#xff0c;这东西在开发中真的太常见了。比如Spring AOP、RPC&#xff0c;它们都离不开动态代理。然后&#xff0c;咱们再来说说MyBatis插件&#xff0c;这可是MyBatis框架中的一个超实用的功能&#xff0c;它就像是给MyBatis加了个“超能力”…