java基础练习缺少项目?看这篇文章就够了(下)!

news2024/7/6 9:33:31

公众号:全干开发 。 专注分享简洁但高质量的动图技术文章!

回顾

在上节内容中,我们实现了用户开户的功能createAccount

    public void start(){
        System.out.println("===欢迎您进入到了ATM系统===");
        System.out.println("1、用户登录");
        System.out.println("2、用户开户");
        System.out.println("请选择:");
        int command = sc.nextInt();
        switch (command) {
            case 1:
                //用户登录  TODO
                // login()  等待开发的功能!
                break;
            case 2:
                //用户开户
                createAccount();
                start();
                break;
            default:
                System.out.println("操作错误!");
                start();
        }
    }

现在,我们要实现另一个核心功能:用户登录。登录后,用户还可以进行转账等一些列操作,这也是我们要完善的功能。

用户登录

我们先来看一下用户登录的login功能

登录的流程大致如下:

  • 如果系统没有任何账户对象,则不允许登录
  • 让用户输入登录的卡号,先判断卡号是否正确,如果不正确要给出提示
  • 如果卡号正确,再让用户输入账户密码,如果密码不正确要给出提示;如果密码也正确,则给出登录成功的提示
private void login(){
    System.out.println("===欢迎您登录系统===");
    // 如果系统中没有账户,直接退出
    if(accounts.size()==0){
        System.out.println("抱歉,当前系统没有账户,请先创建!");
        return;
    }
    // 系统中存在账户,开始进行登录操作
    while (true) {
        System.out.println("请您输入卡号!");
        String cardId = sc.next();
        // 根据卡号获取用户对象
        Account acc = getAccountByCardId(cardId);
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
                System.out.println("请输入密码");
                String password = sc.next();
                // 判断用户输入的密码与账户对象中储存的密码是否一致
                if(password.equals(acc.getPassWord())){
                    System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
                    // TODO: 登录后的其他操作,如转账等等....
                }else {
                    System.out.println("密码输入错误");
                }
            }
        }
    }
}

现在,我们在start中执行这个方法即可

 public void start(){
    // ...省略...
    switch (command) {
        case 1:
            //用户登录
            login();
            // 用户操作完,重新进入系统首页
            start();
            break;
        case 2:
            //用户开户
            createAccount();
            // 开户完,重新进入系统首页
            start();
            break;
        default:
            System.out.println("操作错误!");
            // 输入错误重新进入开始页
            start();
    }
}

账户操作

框架搭建

用户登录成功,我们需要进入账户处理界面

我们定义一个showUserCommand方法来实现

// 登录成功后的操作
private void showUserCommand(){
    while (true) {
        System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
        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、注销账户");
        int command = sc.nextInt();
        switch (command){
            case 1:
                //查询操作
                break;
            case 2:
                //存款
                break;
            case 3:
                //取款
                break;
            case 4:
                //转账
                break;
            case 5:
                //密码修改
                break;
            case 6:
                //退出
                break;
            case 7:
                //注销账户
                break;
            default:
                System.out.println("您的操作有误!请重新输入");
        }
    }
}

这里的loginAcc是我们储存的用户登录成功后的账户信息,详细的代码如下:

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();

    private Account loginAcc; // 储存登录成功后的用户信息

    // .....
    // 用戶登录
    private void login(){
        // .....
                 
        // 判断用户输入的密码与账户对象中储存的密码是否一致
        if(password.equals(acc.getPassWord())){
            loginAcc = acc;
            System.out.println("恭喜您"+acc.getUserName()+"您登录成功!您的卡号是:" + cardId);
            // 登录后的其他操作,如转账等等....
            // 展示用户操作界面
            showUserCommand();
        }else {
            System.out.println("密码输入错误");
        }

        // .....
    }
    // 登录成功后的操作
    private void showUserCommand(){
        while (true) {
            System.out.println(loginAcc.getUserName() + "您可以选择如下功能进行账户处理========");
            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、注销账户");
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    break;
                case 2:
                    //存款
                    break;
                case 3:
                    //取款
                    break;
                case 4:
                    //转账
                    break;
                case 5:
                    //密码修改
                    break;
                case 6:
                    //退出
                    break;
                case 7:
                    //注销账户
                    break;
                default:
                    System.out.println("您的操作有误!请重新输入");
            }
        }
    }
}

现在,我们逐个完善showUserCommand中的方法即可

查询操作

在上述代码中,我们使用了loginAcc储存了登录用户的信息,我们创建个query方法,用于展示loginAcc对象中储存的信息

private void showLoginAccount(){
    System.out.println("卡号:" + loginAcc.getCardId());
    System.out.println("姓名:" + loginAcc.getUserName());
    System.out.println("性别:" + loginAcc.getSex());
    System.out.println("余额:" + loginAcc.getMoney());
    System.out.println("每次取现额度:" + loginAcc.getLimit());
}

我们在showUserCommand()方法中执行下

 private void showUserCommand(){
        while (true) {
            // ....
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    showLoginAccount();
                    break;
                // ....
                case 7:
                    //注销账户
                    break;
                default:
                    System.out.println("您的操作有误!请重新输入");
            }
        }
    }

退出操作

退出操作,不需要执行额外的方法,我们只要能回到登录页即可。退出前我们进行简单的提示即可

 private void showUserCommand(){
    while (true) {
        // ...
        switch (command){
            // ...
            case 6:
                //退出
                System.out.println(loginAcc.getUserName() + "您已经成功退出");
                break;
            // ...
        }
    }
 }

注意,当用户输出6后,break会结束switch语句,但无法跳出while循环,switch会重新执行。

所以,我们需要把break改成return结束当前程序。

 private void showUserCommand(){
    while (true) {
        // ...
        switch (command){
            // ...
            case 6:
                //退出
                System.out.println(loginAcc.getUserName() + "您已经成功退出");
                breturn;
            // ...
        }
    }
 }

现在,我们就跳出了showUserCommand()程序,回到了login方法里。

private void login(){
    // ...
    // 系统中存在账户,开始进行登录操作
    while (true) {
        // ...
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
               // ...
               showUserCommand();
               // ...
            }
        }
    }
}

同样的,我们需要结束login方法中的while循环,回到start方法中

private void login(){
    // ...
    // 系统中存在账户,开始进行登录操作
    while (true) {
        // ...
        if(acc == null){
            System.out.println("卡号输入错误!请重新输入");
        }else{
            // 卡号存在,输入密码
            while (true) {
               // ...
               showUserCommand();
               // ...
               return;
            }
        }
    }
}

我们测试下:

存款及取款

存款

我们定义depositMoney的存款方法,在showUserCommand()的switch 中执行。

这次骚一点,我们用编译器的快捷键帮我们生成方法。在switch中直接执行depositMoney,然后点击【alt+enter】键就可以自动帮我们创建好这个方法了!

  private void depositMoney() {
        System.out.println("==存钱操作==");
        System.out.println("请您输入存款金额:");
        double money = sc.nextDouble();
        loginAcc.setMoney( loginAcc.getMoney()+ money);
        System.out.println("您已经存入"+money + "元,当前账户余额" + loginAcc.getMoney());
    }

取款

private void showUserCommand(){
        while (true) {
            // ...
            int command = sc.nextInt();
            switch (command){
                case 1:
                    //查询操作
                    showLoginAccount();
                    break;
                case 2:
                    //存款
                    depositMoney();
                    break;
                case 3:
                    //取款
                    drawMoney();
                    break;
                // ...
            }
        }
    }
    private void drawMoney() {
        System.out.println("==取钱操作==");
        // 1、判断账户余额是否达到了100元,如果不够100,不让用户取钱
        if(loginAcc.getMoney() < 100){
            System.out.println("您的账户不足100,不能取钱");
            return;
        }
        // 2、让用户输入金额
        while (true) {
            System.out.println("请输入取款金额");
            double money = sc.nextDouble();
            // 3.判断账户余额是否足够
            if(loginAcc.getMoney()>= money){
                // 钱是足够的
                // 判断当前取款金额是否超出了限额
                if(money>loginAcc.getLimit()){
                    System.out.println("超出限额!");
                }else {
                    loginAcc.setMoney(loginAcc.getMoney()-money);
                    System.out.println("取款成功!剩余:" + loginAcc.getMoney());
                    break;
                }
            }else {
                System.out.println("账户余额不足!您的余额是:" + loginAcc.getMoney());
            }
        }
    }

转账

private void showUserCommand(){
        while (true) {
            // ...
            int command = sc.nextInt();
            switch (command){
                // ...
                case 4:
                    //转账
                    transferMoney();
                    break;
                // ...
            }
        }
    }
private void transferMoney() {
        System.out.println("==用户转账==");
        // 1 系统中是否存在其他账户
        if(accounts.size() < 2){
            System.out.println("当前系统只有一个账户,无法转账");
            return;
        }
        // 2 判断自己的账户是否有钱
        if(loginAcc.getMoney() == 0){
            System.out.println("您没钱!别转了!");
            return;
        }
        while (true) {
            // 3 开始转账
            System.out.println("请输出对方卡号");
            String cardId = sc.next();

            // 4 判断账号是否正确
            Account acc = getAccountByCardId(cardId);
            if(acc==null){
                System.out.println("输入的卡号不对");
            }else {
                //5 账户存在,确认姓名
                String name = "*" + acc.getUserName().substring(1);
                System.out.println("请输入:"+name+"的姓氏");
                String preName = sc.next();
                // 判断姓氏是否正确
                if(acc.getUserName().startsWith(preName)){
                    // 认证通过,开始转账
                    System.out.println("请输入转账金额");
                    double money = sc.nextDouble();
                    // 6 判断是否超出自己的金额
                    if(loginAcc.getMoney() >=money){
                        //转给对方了
                        //变更自己的账户余额
                        loginAcc.setMoney(loginAcc.getMoney()-money);
                        //更新对方的余额
                        acc.setMoney(acc.getMoney() + money);
                        return;
                    }else {
                        System.out.println("账户余额不足");
                    }
                }else {
                    System.out.println("输入的姓名有有误");
                }
            }
        }
    }

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

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

相关文章

思伟老友记 | 厦门路桥翔通海砼建材有限公司与思伟软件携手走过23年

23年 感恩相伴 携手成长 2001年-2023年&#xff0c;厦门路桥翔通海砼建材有限公司已携手上海思伟软件有限公司走过23年。从最初的半手动生产模式到如今的自动生产一体化系统&#xff0c;海砼公司通过思伟软件生产混凝土累计超过1000万m&#xff0c;思伟软件则借助海砼公司的实…

拜托!佛系点,你只是给社区打工而已

社区人到年底了各种要写的东西很烦啊&#xff01;突然看到这个&#xff0c;真的谢谢啊&#xff01; 家人们谁懂啊&#xff1f;&#xff01;&#xff01;平时写个东西起码两三天&#xff0c;试了一下这东西&#xff01;输入需求&#xff0c;一键生成&#xff0c;写好了&#xf…

数据结构与算法编程题5

从有序表中删除重复元素&#xff0c;使表中所有元素值均不相同。 #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;void Init_…

斐波那契数列,剑指offer,力扣

目录 题目地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题思路&#xff08;动态规划&#xff09;&#xff1a; 代码实现&#xff1a; 补充说明&#xff1a; 代码&#xff08;优化&#xff09;&…

常用 API 异常

常用 API & 异常 对之前那篇 API 文章的补充学习 1.API 1.1 API概述【理解】 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&am…

Redis ACL 规则说明

Redis ACL 规则说明 前情回顾ACL 定义规范启用和禁用用户允许和禁止调用命令允许或禁止访问某些 Key为用户配置有效密码 ACL 命令说明 前情回顾 上一篇文章 我们整体性的介绍了 Redis 的 ACL&#xff0c;我们来回顾下 ACL 的两种配置方式。 redis 使用 acl 有两种方式可以配置…

【从入门到起飞】JavaSE—带你了解Map,HashMap,TreeMap的使用方法

&#x1f38a;专栏【Java基础】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The truth that you leave】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f33a;双列集合的特点&#x1f384;Map&#x1f354;Ma…

inBuilder低代码平台新特性推荐-第八期

今天来给大家带来的是inBuilder低代码平台特性推荐系列第八期——定时任务&#xff01; inBuilder计划任务框架支持快速开发&#xff0c;任务开发完成后&#xff0c;只需发布成bean&#xff0c;并通过配置界面绑定所需触发器&#xff0c;即可到点触发。 一、 概念介绍 定时任…

Java的IO流-打印流

打印流 PrintStream public void println&#xff08;&#xff09;自动换行 PrintWriter package com.itheima.println;import java.io.FileInputStream; import java.io.PrintStream; import java.io.PrintWriter;public class Test2 {public static void main(String[] arg…

HarmonyOS脚手架:快捷实现ArkTs中json转对象

前言 在上篇《HarmonyOS开发&#xff1a;UI开展前的阶段总结》中提到了未来的规划&#xff0c;既能让大家学会鸿蒙开发&#xff0c;也能让大家在以后的开发中如虎添翼&#xff0c;最终决定&#xff0c;便以脚手架为产出物&#xff0c;结合实际的业务需求&#xff0c;进行相关技…

读《Segment Anything in Defect Detection》

摘要 (好像只是说把SAM应用到了红外缺陷分割领域) 引言 无损检测得到红外图像&#xff0c;根据热能观察异常 贡献&#xff1a; •从两个光学脉冲热成像系统构建广泛的缺陷热数据库&#xff0c;包括各种材料并释放它们。 • 开发DefectSAM&#xff0c;这是第一个用于缺陷检测…

什么是美颜SDK?直播美颜SDK技术深度剖析

在实现实时美颜的过程中&#xff0c;美颜SDK扮演着关键的角色&#xff0c;它为开发者提供了一套强大的工具&#xff0c;使得实时美颜效果能够轻松应用于直播平台。 一、美颜SDK的基本概念 美颜SDK是一种软件工具包&#xff0c;通过集成了丰富的图像处理算法和实时计算技术&a…

香港身份和内地身份可以共存吗?

香港身份和内地身份可以共存吗&#xff1f; 很多朋友在刚开始了解香港身份的时候&#xff0c;都会对香港永居身份、居民身份、内地户口等等名词产生疑惑&#xff0c;搞不清它们之间的区别。 还有一部分人误以为拿到香港身份就意味着要放弃内地户口。 今天银河君就来具体解释…

java springboot在测试类中启动一个web环境

我们在开发过程中 可以对数据层 业务层做测试 那我们的表现层能做测试吗&#xff1f; 答案自然是可以的 但是 前提 我们要有一个web环境 我们现在 测试类运行 明显是个很普通的java程序 还是这个 SpringBootTest 它有一个 webEnvironment 我们可以先这样写 package com.examp…

大数据-之LibrA数据库系统告警处理(ALM-12057 元数据未配置周期备份到第三方服务器的任务)

告警解释 系统安装完成后会检查元数据是否有周期备份到第三方服务器的任务&#xff0c;然后每1小时会检查一次。如果元数据未配置周期备份到第三方服务器的任务&#xff0c;将发送严重告警。 在用户创建元数据周期备份到第三方服务器的任务后&#xff0c;告警消除。 告警属性…

单链表相关面试题--1.删除链表中等于给定值 val 的所有节点

/* 解题思路&#xff1a;从头节点开始进行元素删除&#xff0c;每删除一个元素&#xff0c;需要重新链接节点 */ struct ListNode* removeElements(struct ListNode* head, int val) {if(head NULL)return NULL;struct ListNode* cur head;struct ListNode* prev NULL;while…

打造自己的3D模型AI 自动纹理工具

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 为 3D 模型创建纹理可能比您想象的要容易。虽然注意细节很重要&#xff0c;但有很多方法可以制…

你好,我叫Python,欢迎你认识派森。(来自关于Python语言的全方位自我介绍。

文章目录 自我简介一、Python的发展历程二、Python的特色1.语言特色2.语法特色 三、Python2与Python3的比较1.print 函数2.Unicode3.除法运算4.异常5.八进制字面量表示6.不等运算符7.python 3.0严格使用tab键进行缩进 四、Python适用开发场景及成果1.应用领域2.Python开发出的应…

二百零六、Flume——Flume1.9.0单机版部署脚本(附截图)

一、目的 在实际项目部署时&#xff0c;要实现易部署易维护&#xff0c;需要把安装步骤变成安装脚本实现快速部署 二、部署脚本在Linux中文件位置 文件夹中只有脚本文件flume-install.sh和tar包apache-flume-1.9.0-bin.tar.gz 三、Flume安装脚本 #!/bin/bash #获取服务器名…