JAVA-案列练习-ATM项目

news2024/11/13 9:32:18

        在JAVA入门学习后进行的项目练习——模拟ATM系统。

目录

1.设计内容和要求

 2.代码实现

(1)ATM账号类的定义

(2)ATM类中的操作

(3)操作说明

3.总结


6b654bbdc6bb4b388bdf961499992ae0.png

1.设计内容和要求

01  系统架构搭建,欢迎页设计

02  开户功能实现

03  登录功能实现
04 操作页展示,查询账户,退出账户
05 存款,取款功能实现
06 转账功能实现
07 销户功能实现
08 用户密码修改

 2.代码实现

(1)ATM账号类的定义

package ATM;

public class Account {
    private String id;
    private String name;
    private char sex;
    private String password;
    private double money;
    private double limit; //限额

    public String getId() {
        return id;
    }

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

    public String getName() {
        return name + (sex == '男'? "先生":"女士");
    }

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

    public char getSex() {
        return sex;
    }

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

    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 getLimit() {
        return limit;
    }

    public void setLimit(double limit) {
        this.limit = limit;
    }

    public Account() {
    }
}

(2)ATM类中的操作

package ATM;

import javax.accessibility.AccessibleContext;
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
   private ArrayList<Account> list = new ArrayList<>();
   private Scanner sc= new Scanner(System.in);
   Account loginacc;

   private void creatAccount(){
       System.out.println("==系统开户操作==");
       Account account = new Account();

       System.out.println("请您输入您的账户名称");
       String name = sc.next();
       account.setName(name);

       while(true) {
           System.out.println("请您输入您的性别");
           char sex = sc.next().charAt(0);
           if(sex == '男' || sex == '女'){account.setSex(sex);break;}
           else{
               System.out.println("输入错误,只能是男或者女");
           }
       }

       while(true) {
           System.out.println("请您输入您的密码");
           String password = sc.next();

           System.out.println("请您确认您的密码");
           String password1 = sc.next();

           if(password.equals(password1)){
               account.setPassword(password);
               break;
           }
           else{
               System.out.println("您输入的两次密码不相同,请重新输入");
           }
       }

       System.out.println("请您输入每次取款限额");
       double limit = sc.nextDouble();
       account.setLimit(limit);

       //生成一个卡号 8位数字(卡号且不能重复)
       String id = createCardid();
       account.setId(id);
       //
       list.add(account);
       System.out.println("恭喜您"+account.getName()+ "开户成功");
       System.out.println("您的卡号为" + account.getId());

       return;
   }
   private String createCardid(){
       while(true){
       String id ="";
       Random r = new Random();
       for (int i = 0; i < 8; i++) {
           int data = r.nextInt(10);
           id += data;
       }
       Account acc = getAccountbyId(id);
       if(acc == null){ return id;}
       }
   }
   private Account getAccountbyId(String id){
       for (int i = 0; i < list.size(); i++) {
           Account acc = list.get(i);
           if(acc.getId().equals(id)){return acc;}
       }
       return null;
   }

   private void login(){
       System.out.println("==系统登录操作==");
       if(list.size() == 0){
           System.out.println("系统内无用户 请开户");return;
       }
       while(true) {
           System.out.println("请您输入您的登录卡号");
           String id = sc.next();
           Account acc = getAccountbyId(id);
           if (acc == null) {
               System.out.println("该卡号不存在");
           }
           while(true) {
               System.out.println("请你输入您的密码");
               String password = sc.next();
               if (acc.getPassword().equals(password)) {
                   loginacc = acc;
                   System.out.println("恭喜您," + acc.getName());
                   System.out.println("成功登录系统,您的卡号是"+acc.getId());
                   showUserCommand();return;
               }
               else {
                   System.out.println("密码不正确 请确认");
               }
           }
       }
   }

   private void showUserCommand(){

       while(true) {

           System.out.println(loginacc.getName());
           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:
                   showLoginacc();
                   break;
               case 2:
                   depositMoney();
                   break;
               case 3:
                   drawMoney();
                   break;
               case 4:
                   transferMoney();
                   break;
               case 5:
                   updatePassword();return;
               case 6:
                   System.out.println(loginacc.getName()+"您已经成功退出系统");
                   return;
               case 7:
                   if(deleteAccount()){return;}
                   break;
               default:
                   System.out.println("操作不存在");
           }
       }
   }

   private void showLoginacc(){
       System.out.println("==当前您的账户信息==");
       System.out.println("卡号:" + loginacc.getId());
       System.out.println("姓名:" + loginacc.getName());
       System.out.println("性别:" + loginacc.getSex());
       System.out.println("余额:" + loginacc.getMoney());
       System.out.println("取现额度:3"+ loginacc.getLimit());
   }

   private void depositMoney(){
       System.out.println("==存款操作==");
       System.out.println("请您输入存款金额");
       double money = sc.nextDouble();
       loginacc.setMoney(loginacc.getMoney()+money);
       System.out.println("==存款成功==");
   }

   private void transferMoney(){
       System.out.println("用户转账");

       if(list.size() < 2){
           System.out.println("系统中只有一个用户,无法转账");
           return;
       }
       if(loginacc.getMoney() == 0){
           System.out.println("您账户内余额为0");
           return;
       }
       while(true) {
           System.out.println("请您输入对方的卡号");
           String id = sc.next();

           Account acc = getAccountbyId(id);
           if (acc == null) {
               System.out.println("您输入的对方卡号不存在");
           }
           else {
               String name ="*"+acc.getName().substring(1);
               System.out.println( "请您输入【"+name+"】的姓氏");
               String prename = sc.next();
               if(acc.getName().startsWith(prename)){
                   System.out.println("清输入转账金额");
                   double money = sc.nextDouble();
                   if(loginacc.getMoney() >= money){
                       loginacc.setMoney(loginacc.getMoney() - money);
                       acc.setMoney(acc.getMoney() + money);
                       return;
                   }
                   else{
                       System.out.println("余额不足,您的余额为"+loginacc.getMoney());
                   }
               }
               else{
                   System.out.println("您认证的姓氏有问题");
               }
           }
       }
   }

   private void drawMoney(){
       System.out.println("==取款操作==");
       if(loginacc.getMoney() < 100){
           System.out.println("您的余额不足100 无法取款");return;
       }
       while(true) {
           System.out.println("请您输入取款金额");
           double money = sc.nextDouble();
           if (loginacc.getMoney() < money) {
               System.out.println("余额不足 您账户中的余额为:" + loginacc.getMoney());break;
           }
           else {
               if (money > loginacc.getLimit()) {
                   System.out.println("您当前取款金额超过限额,您每次最多取款" + loginacc.getLimit());break;
               } else {
                   loginacc.setMoney(loginacc.getMoney() - money);
                   System.out.println("==取款成功==");
                   System.out.println("取款后剩余" + loginacc.getMoney());
                   return;
               }
           }
       }
   }

   private boolean deleteAccount(){
       System.out.println("==销户操作==");
       System.out.println("请问您确认销户嘛");
       String command = sc.next();
       switch (command){
           case "y":
               if(loginacc.getMoney() == 0){
                   list.remove(loginacc);
                   System.out.println("您好 您的账户已经成功销户");
                   return true;
               }
               else {
                   System.out.println("对不起 您的账户中存在金额 不允许销毁");
                   return false;
               }
           default:
               System.out.println("好的,您的账户保留!!");
               return false;
       }

   }

   private void updatePassword(){
       System.out.println("==账号密码修改==");
       System.out.println("请您输入当前账户密码");
       String pass = sc.next();

       if(loginacc.getPassword().equals(pass)){
           while(true) {
               System.out.println("请您输入新密码");
               String newpass = sc.next();

               System.out.println("请您确认新密码");
               String newpass1 = sc.next();

               if (newpass.equals(newpass1)) {
                   loginacc.setPassword(newpass);
                   System.out.println("您的密码修改成功");
                   return;
               }
               else {
                   System.out.println("您输入的两次密码不一致");
               }
           }
       }
       else{
           System.out.println("密码错误");
       }
   }
   public void start(){

        while(true){
            System.out.println("==欢迎您进入到ATM系统==");
            System.out.println("==    1.用户登录   ==");
            System.out.println("==    2.用户开户   ==");
            System.out.println("请选择");

            int n = sc.nextInt();
            switch(n){
                case 1:login();break;
                case 2:creatAccount(); break;
                case 0: return;
                default:
                    System.out.println("输出有误 重新输入");
            }
        }
    }
}
package ATM;

public class Text {
    public static void main(String[] args) {
        ATM a = new ATM();
        a.start();
    }
}

(3)操作说明

 

 

 

3.总结

        关于这个案例实际并不复杂,功能的实现和代码思路和C语言学习时是一致的,只是JAVA提供了API,更快捷的实现了一些原本要自己手写的功能。主要还是对于面向对象编程,把功能交给对象自己去完成,以及集合这种存储数据的容器的学习和理解,目前这个案例算是对前面入门的知识一个小的复习。后续就可以进行比较系统深入的学习了。

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

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

相关文章

Spring Cloud全解析:注册中心之Eureka架构介绍

Eureka架构介绍 Eureka在设计时采用的是AP原则&#xff0c;是Netflix的一个子模块&#xff0c;用于微服务的服务注册与发现 P:Partition tolerance,网络分区容错。类似多机房部署&#xff0c;保证服务稳定性A: Availability&#xff0c;可用性C:Consistency &#xff0c;一致…

【时时三省】(C语言基础)函数递归

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ——csdn时时三省 什么是递归 程序调用自身的编程技巧称为递归。递归做为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法&#xff0c;它通常把一个大型复杂…

Jenkin:动态选择Git分支

Jenkin&#xff1a;动态选择Git分支 build时输入分支 构建的时候添加一个字符参数 选择设置的变量&#xff0c;需要用${}括起来 构建时的效果 build时下拉选择分支 安装Git 参数插件 添加git参数 选择设置的变量&#xff0c;需要用${}括起来 构建时的效果

如何在不同设备上检查您的 IP 地址?

IP 地址&#xff08;Internet 协议地址&#xff09;是网络上设备的唯一标识符。了解如何查找 IP 地址对于解决网络问题、设置网络设备和维护网络安全非常重要。本文将详细介绍如何在不同设备上检查 IP 地址&#xff0c;包括 Windows 计算机、Mac 计算机、智能手机&#xff08;A…

计算机网络快速入门---百年前人们不敢想象的黑科技

目录 1.引言 2.快递VS网络 3.网络模型 3.1两个模型 3.2传输过程 4.IP 4.1IP简介 4.2解决方案一 5.局域网和互联网 5.1局域网说明 5.2互联网说明 6.网络攻击 1.引言 注意&#xff0c;这个只是一个快速入门&#xff0c;不是我开始进行系统学习了&#xff0c;这个博客…

【unity小技巧】unity性能优化以及如何进行性能测试

文章目录 前言GPU性能优化打包素材 CPU性能优化代码执行优化 性能测试Vector2.Distance 和 sqrMagnitude哪个好&#xff1f;动画切换优化shader属性优化 URP渲染器资产优化对象池优化删除没必要的空函数图片、音乐音效、贴图等素材压缩ScriptableObject优化参数参考完结 前言 …

数据结构与算法-15高级数据结构_树论(堆树)

堆树 1 简介 1.1 什么是堆树 定义&#xff1a;堆树是一种特殊的完全二叉树&#xff0c;其中每个节点的值都遵循一定的堆属性。具体来说&#xff0c;堆分为最大堆和最小堆。 最大堆&#xff1a;在最大堆中&#xff0c;每个父节点的值都大于或等于其任何子节点的值。这意味着…

SpringMVC02

1.拦截器 1.1基本概念 SpringMVC 中的Interceptor拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆等操作。对于SpringMVC拦截器的定义方式 有两种: 实现接口:org.springframework.web.ser…

CAD-文字、图块、多行文字,沿多段线对齐到多段线的顶点,沿直线进行均分,都可以操作

图块和文字对齐直线-均布直线-对齐多段线顶点-旋转平行 (defun c:duiqi () ;将图块与直线对齐&#xff0c;并均分。;先创建的图块排最右;先等分的坐标排最右;刚好对应了(defun MoveToPosition (Blockname p_list / ent refPoint dx dy) ;移动对象到指定坐标(prompt "\nSel…

【Git-驯化】一文学会git中对代码进行存储操作:git stash技巧

【Git-驯化】一文学会git中对代码进行存储操作&#xff1a;git stash技巧 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内…

@change事件传参

change事件传参 change"(value)>handleChange(value, item,index)" 这样可以接收index参数区分是哪一个组件事件&#xff0c;又可以接收子组件传的value值 <div class"boxItem" v-for"(item, index) in checkPeopleList" :key"inde…

VUE实现TAB切换不同页面

VUE实现TAB切换不同页面 实现效果 资源准备 ReceiveOrderList, TodoListMulti, SignList 这三个页面就是需要切换的页面 首页代码 <template><div><el-tabs v-model"activeTab" type"card" tab-click"handleTabClick"><…

用于相位解包的卷积和空间四向 LSTM 联合网络

原文&#xff1a;A Joint Convolutional and Spatial Quad-Directional LSTM Network for Phase Unwrapping 作者&#xff1a;Malsha V. Perera 和 Ashwin De Silva 摘要&#xff1a; 相位展开是一个经典的病态问题&#xff0c;其目标是从包裹相位中恢复真实的相位。本文&…

鸿蒙(API 12 Beta2版)NDK开发【使用Node-API扩展能力接口】

简介 [扩展能力接口]进一步扩展了Node-API的功能&#xff0c;提供了一些额外的接口&#xff0c;用于在Node-API模块中与ArkTS进行更灵活的交互和定制&#xff0c;这些接口可以用于创建自定义ArkTS对象等场景。 Node-API接口开发流程参考[使用Node-API实现跨语言交互开发流程]…

非负数、0和正整数 限制最大值且保留两位小数在elementpuls表单中正则验证

一、结构 <el-form-item label"单价&#xff1a;" prop"price"><el-inputv-model.trim"formData.price"placeholder"请输入"blur"formMethod.fixTwo"><template #append>(元)</template></el-i…

基础算法:离散化(C++实现)

文章目录 1. 离散化的定义2. 离散化例题2.1 离散化二分2.2 离散化哈希表 1. 离散化的定义 离散化是一种在程序设计和算法优化中常用的技术&#xff0c;其核心思想是将无限空间中有限的个体映射到有限的空间中去&#xff0c;以此提高算法的时空效率。具体来说&#xff0c;离散化…

Docker 安装 GitLab教程

本章教程,主要介绍如何在Docker 中安装GitLab。 GitLab 是一个开源的 DevOps 平台,提供了一整套工具,用于软件开发生命周期的各个阶段,从代码管理到 CI/CD(持续集成和持续交付/部署),再到监控和安全分析。 一、拉取镜像 docker pull gitlab/gitlab-ce:latest二、创建 G…

【React】探讨className的正确使用方式

文章目录 一、className的正确用法二、常见错误解析三、实例解析四、错误分析与解决五、注意事项六、总结 在React开发中&#xff0c;正确使用className属性对组件进行样式设置至关重要。然而&#xff0c;由于JavaScript和JSX的特殊性&#xff0c;开发者常常会犯一些小错误&…

ShardingSphere实战(2)- 水平分表

上篇博客&#xff0c;我们讲了 ShardingSphere实战&#xff08;1&#xff09;- 分库分表基础知识&#xff0c;这篇博客&#xff0c;正式开始实操。 项目环境&#xff1a; JDK11 MySQL 8.0.30 Springboot 2.7.4 Mybatis ShardingSphere HikariCP 连接池 一、Maven 依赖 <…

filebeat发送日志

filebeat: 1.可以在本机收集日志 2.也可以远程收集日志 3.轻量级的日志收集系统&#xff0c;可以在非Java环境运行 logstash是在jvm环境中运行&#xff0c;资源消耗很高&#xff0c;启动一个logstash需要消耗500M左右的内存 filebeat只消耗10M左右的内存 test3是装有logstash的…