首页 > 编程语言 >从0到1,实现Java控制台版本的ATM管理系统

从0到1,实现Java控制台版本的ATM管理系统

时间:2023-09-24 12:45:06浏览次数:56  
标签:Java String 账户 ATM System 卡号 println 控制台 out

从0到1,实现Java控制台版本的ATM管理系统

​ 其实作为一名Java的程序猿,无论你是初学也好,大神也罢,管理系统一直都是一个非常好的例子,初学者主要是用数组、List等等来写出一个简易的管理系统.牛逼一点的大神则用数据库+swing来做一个有界面的管理系统,其实都并不会太难。

​ 今天我就先写一个简单的管理系统:用List来实现银行的ATM管理系统

1.ATM系统技术选型分析

技术点分析

1.1 面向对象编程

每个用户对象要对应一个账户对象,所以需要设计账户类Account

1.2 程序流程控制

需要结合分支、循环、跳转等相关操作控制程序的业务逻辑

1.3 使用集合容器

系统需要提供一一个容器用于存储这些账户对象的信息,我们选ArrayList集合,因为ArrayList底层是可变的数组,操作起来相比于数组较为方便一些

1.4 使用常见API

内容比较,分析,数据处理等需要用到String等常用API

2.学习收获

2.1 优秀的面向对象编程能力,清晰、缜密的业务、数据分析能力

2.2 形成良好的编码习惯,获得一定的编码经验

2.3 熟练使用程序流程技术来控制计算机完成自己的想法

2.4 形成Java编程的业务思维,和解决问题的能力,让基础知识形成体系,为后续学习Java高级技术做有
力支撑

3.功能分析

3.1 账户类、首页设计

分析:

①每个用户一个账户对象,需要设计账户类,账户类至少包含(卡号、用户名、余额、取现额度、密码)

1、用户的账户信息,系统如何表示的?

  • 定义账户类Account, 定义系统关心的属性信息。

一个标准类的书写应当包括如下细节:

  • 成员属性私有化

  • 提供空参/满参的构造方法

  • 提供get/set方法


public class Account {
  //成员属性

  //卡号
  private String cardID;

  //用户名
  private String userName;

  //密码
  private String passWord;

  //余额
  private double money;

  //取现额度
  private double quotaMoney;

  //提供空参/满参的构造方法

  public Account() {
  }

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

  //提供get/和set方法


  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;
  }
}

②系统采用什么来存储账户对象?

  • 需要定义一个ArrayList的集合用于存储账户对象。
//定义集合对象,存储所有账户信息
ArrayList<Account> accountList = new ArrayList<>();

③需要展示欢迎页包含2个功能:注册开户、登录账户。

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

===========================================

3.2 用户开户功能实现

开户功能的实现需要哪几步操作,需要注意什么问题?

  • 开户功能 应该独立定义成方法,并传入当前集合对象给该方法。
  • 卡号 是通过设计的方法随机返回8个数字代表卡号,注意:卡号不能重复
  • 把开户的信 息封装成Account对象,存入到集合中。

分析

①开户功能应该独立定义成方法,并传入当前集合对象给该方法。

private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner)

②需要提示用户输入个人信息,开户的卡号是系统自动生成的8位数。

private static String createCardID(ArrayList<Account> accountList)

③注意:自动生成的卡号不能与其他用户的卡号重复。

private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID)

④最终把用户开户的信息封装成Account对象,存入到集合中。

Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//满参构造,初始化数据
accountList.add(account);

运行效果

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

===========================================

请输入命令1、2、3. 选择对应的操作: 2

==========欢迎您进入黑马银行用户办卡界面==========

请输入您的姓名: 常州陪彭于晏

请输入您的密码: 9527

请再次输入您的密码: 9527

请设置当次取现额度: 15000

尊敬的常州陪彭于晏贵宾先生/女士,您的账户已经开卡成功,您的卡号是: 65301297.

注册成功~~~

3.3 用户登录功能实现

1、登录功能如何实现的?

  • 根据卡号去集合中查询对应的账户对象。
  • 如果找到了账户对象, 说明卡号存在,继续输入密码。
  • 如果密码也正确, 则登录成功。

分析
①需要根据卡号去集合中查询对应的账户对象。

private static Account isCardIDExisting(ArrayList<Account> accountList, String cardID) 

②如果找到了账户对象,说明卡号存在,继续输入密码。
③如果密码也正确,则登录成功。

运行效果

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

=========================================

请输入命令1、2、3. 选择对应的操作: 1

==========黑马银行ATM系统登录界面==========

请输入您的卡号: 77711112

请输入您的密码: 9527

登录成功~~~

3.4 用户操作页设计、查询账户、退出账户功能

分析
①用户登录成功后,需要进入用户操作页。

 private static void showCommand(Account account, ArrayList<Account> accountList, Scanner scanner) 

②查询就是直接展示当前登录成功的账户对象的信息。

 private static void showAccountInfo(Account account) 

③退出账户是需要回到首页的。

运行效果

==========黑马银行ATM系统登录界面==========

请输入您的卡号: 37682957

请输入您的密码: 9527

登录成功~~~

尊敬的常州彭于晏贵宾先生/女士,您可以办理如下业务,您的卡号是37682957~~~

==========欢迎您进入黑马银行用户操作界面==========

1.查询.

2.存款.

3.取款.

4.转账.

5.修改密码.

6.退出.

7.注销当前账户.

============================================

请选择相关操作数:6

成功退出黑马银行用户操作界面~~~

==========欢迎您进入黑马银行ATM系统==========

1. 登录账户.

2. 注册账户.

3. 退出.

=========================================

请输入命令1、2、3. 选择对应的操作: 

3.5 用户存款、取款功能设计

分析
①存款和取款都是拿到当前用户的账户对象。

②通过调用账户对象的set方法修改其余额。

运行效果

尊敬的常州彭于晏贵宾先生/女士,您可以办理如下业务,您的卡号是18209986~~~

==========欢迎您进入黑马银行用户操作界面==========

1.查询.

2.存款.

3.取款.

4.转账.

5.修改密码.

6.退出.

7.注销当前账户.

============================================

请选择相关操作数:2

==========欢迎您进入黑马银行用户存款界面==========

请输入存款的金额:15000

==========欢迎您进入黑马银行用户详情界面==========

您的账户信息如下: 

卡号: 18209986

姓名: 常州彭于晏

余额: 15000.0元

当次取现额度: 15000.0元

===========================================

您已经存款成功~~~
    
==========欢迎您进入黑马银行用户取款界面==========

请输入取款的金额:26000

此次取款金额超出了当次取现额度~~~

请输入取款的金额:1000

==========欢迎您进入黑马银行用户详情界面==========

您的账户信息如下: 

卡号: 18209986

姓名: 常州彭于晏

余额: 14000.0元

当次取现额度: 15000.0元

===========================================

您已经取款成功~~~

3.6 用户转账功能设计

分析
①转账功能要分析对方账户是否存在的问题。
②还要分析自己的余额是否足够的问题。

3.7 用户密码修改功能、销户功能

分析
①修改密码就是把当前对象的密码属性使用set方法进行更新。
②销户是从集合对象中删除当前对象,并回到首页。

至此,ATM管理系统就在这里,是不是很简单呢?

4.部分源码展示

public class ATMSystem {

  public static void main(String[] args) {

    //定义集合对象,存储所有账户信息
    ArrayList<Account> accountList = new ArrayList<>();

    //键盘录入的对象
    Scanner scanner = new Scanner(System.in);


    //操作数
    int keyWord = 0;

    //循环标志
    boolean runningFlag = true;

    //登录/注册操作的返回值 成功/失败
    boolean status = true;

    while (runningFlag) {

      System.out.println("==========欢迎您进入黑马银行ATM系统==========\n");
      System.out.println("1. 登录账户.\n");
      System.out.println("2. 注册账户.\n");
      System.out.println("3. 退出.\n");
      System.out.println("=========================================\n");
      System.out.print("请输入命令1、2、3. 选择对应的操作: ");
      keyWord = scanner.nextInt();
      System.out.println();


      switch (keyWord) {
        case 1:
          //1. 登录 待实现
          //System.out.println("登录 待实现\n");
          status = loginAccount(accountList, scanner);
          if (status) {
            //System.out.println("登陆成功~~~\n");
          } else
            System.out.println("登录失败~~~\n");
          break;
        case 2:
          //2. 注册 待实现
          //System.out.println("注册 待实现\n");
          status = registerAccount(accountList, scanner);
          if (status)
            System.out.println("注册成功~~~\n");
          else
            System.out.println("注册失败~~~\n");
          break;
        case 3:
          runningFlag = false;
          System.out.println("成功退出黑马银行ATM系统,欢迎您下次使用~~~\n");
          break;
        default:
          System.out.println("\n您当前输入的命令不合法,请重新输入~~~\n");
          break;
      }
    }
  }

注册

  private static boolean registerAccount(ArrayList<Account> accountList, Scanner scanner) {
    System.out.println("==========欢迎您进入黑马银行用户办卡界面==========\n");

    System.out.print("请输入您的姓名: ");
    scanner.nextLine();
    String userName = scanner.nextLine();

    System.out.println();


    String passWord = "", rePassWord = "";

    while (true) {
      System.out.print("请输入您的密码: ");
      passWord = scanner.nextLine(); // 读取用户输入的密码
      System.out.println();

      System.out.print("请再次输入您的密码: "); // 再次确认密码
      rePassWord = scanner.nextLine(); // 读取用户再次输入的密码
      System.out.println();

      //检验用户两次输入的密码是否相同
      if (passWord.equals(rePassWord)) {
        break;
      } else {
        System.out.println("您2次输入的密码不一致,请核对后重新输入~~~\n");
      }
    }

    //银行系统生成银行卡号,开户的卡号是系统自动生成的8位数
    String cardID = createCardID(accountList);


    //现阶段还未学到日期类,没法统计每天取多少钱,本次只作当次取现额度,等日后学习至日期类,再作变更
    System.out.print("请设置当次取现额度: ");//一次最多取多少钱
    double quotaMoney = scanner.nextDouble();
    System.out.println();

    Account account = new Account(cardID, userName, passWord, 0.0, quotaMoney);//满参构造,初始化数据

    accountList.add(account);

    System.out.println("尊敬的" + account.getUsername() + "贵宾先生/女士,您的账户已经开卡成功,您的卡号是: " + account.getCardID() + ".\n");

    return true;
  }

完整代码详见:https://gitee.com/AIITCherry/to-do-list

程序运行演示视频详见:https://www.bilibili.com/video/BV1J84y1D75i/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=2b0d1f971a9cdc1466c16aeece19350d

标签:Java,String,账户,ATM,System,卡号,println,控制台,out
From: https://www.cnblogs.com/iflytek-aiit319102020329/p/17725835.html

相关文章

  • java如何实现Socket的长连接和短连接
    讨论Socket必讨论长连接和短连接一、长连接和短连接的概念1、长连接与短连接的概念:前者是整个通讯过程,客户端和服务端只用一个Socket对象,长期保持Socket的连接;后者是每次请求,都新建一个Socket,处理完一个请求就直接关闭掉Socket。所以,其实区分长短连接就是:整个客户和服务端的通......
  • java---集合(数据结构)(重点)[上]
    13.1概念以前存储一组相同类型的数据使用数组,固定大小,具有连续性的存储空间。比如,5个长度的数组再存入数据时,如果现在已经存满,存入第六个元素,这时数组空间不够,扩容。Arrays.copyOf(),很不方便,如果扩容频率太高,也影响你程序运行效率。集合来解决数组固定,如果扩容又影响效率的问......
  • java——mybatis随笔
    教程:https://www.cnblogs.com/xiaobaibailongma/p/17019484.html    本地示例:https://www.cnblogs.com/xiaobaibailongma/p/17019676.html      =========================================================================      gitee:示例......
  • Could not open client transport with JDBC Uri: jdbc:hive2://node1:10000: java.n
    今天发现连接beeline是时候连接不上,不应该啊昨晚还可以的qaq  破案了,我启动了metastore之后忘记去启动hiveserver2hiveserver2都没启动能连上就怪了 一定一定要记得启动顺序!!!hadoop+metastore+hiveserver2+beeline ......
  • 无涯教程-JavaScript - PERCENTRANK.INC函数
    描述PERCENTRANK.INC函数返回数据集中的值的排名,作为数据集的百分比(包括0..1)。此功能可用于判断数据集中值的相对位置。语法PERCENTRANK.INC(array,x,[significance])争论Argument描述Required/OptionalArrayThearrayorrangeofdatawithnumericvaluesthat......
  • 哪个JavaScript混淆工具更好用?测评葡萄牙的JScrambler和中国的JShaman
    两款顶级JavaScript混淆工具测评:JScrambler和JShaman出于JavaScript代码安全需求,JavaScript混淆已经被广泛使用。在这个领域中,有免费的小工具,也有专业、商业级的产品。商业产品在功能强度、保护效果、稳定性等各方面都是全优于免费小工具的。本文将对两款专业、商业JavaScript......
  • 深入了解Java中的StringJoiner类
    在Java编程中,字符串的拼接是一个常见的操作。Java提供了多种方法来实现字符串拼接,其中之一就是StringJoiner类。本文将详细介绍StringJoiner的用法和功能。StringJoiner简介StringJoiner是Java8引入的一个用于拼接字符串的工具类。它允许我们以指定的分隔符将一组字符串连接成一个......
  • JavaScript-实例对象与 new 命令
    对象是什么 面向对象编程(ObjectOrientedProgramming,缩写为OOP)是目前主流的编程范式。它将真实世界各种复杂的关系,抽象为一个个对象,然后由对象之间的分工与合作,完成对真实世界的模拟。每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。对象可以......
  • java学习路线(一)
    各位晚上好,今天跟大家稍微说一下,对于小白,我认为的入门路线简述javaSE首先就是javaSE(也就是java基础语法,比如数据类型,集合,if,循环语句,多线程,异常捕获,反射等最基本操作,也是最重要的,万丈高楼平地起,这就相当于地基,所以兄弟们,一定不要偷懒)简述MySQL然后就是MySQL(众所周知,后端是必然少......
  • java基础——随笔04
    JavaObject类JavaObject类是所有类的父类,也就是说Java的所有类都继承了Object,子类可以使用Object的所有方法。Object类位于java.lang包中,编译时会自动导入,我们创建一个类时,如果没有明确继承一个父类,那么它就会自动继承Object,成为Object的子类。Object类可以显......