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

news2024/11/24 2:16:59

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

项目概述

本教程适合刚学习完java基础语法的同学,涉及if语句、循环语句、类的封装、集合等基础概念,使用大量gif图帮助读者演示代码操作、效果等,是一个非常不错的巩固练习教程!不涉及任何java框架等内容,可以放心食用!

本教程将使用控制台模拟一个ATM取款机!

基础需求演示

ATM机主要有用户开户用户登录(登录后可以转账等)功能,我们简单演示一下用户开户功能!

系统架构

根据我们的需求,我们可以知道,我们的这个程序应该主要包含两个类

  • 账户类Account:包含卡号、姓名、性别、密码、余额、额度等属性
  • ATM类:代表ATM系统,负责提供业务需求,具备欢迎页、转账、开通账户等功能

项目搭建

创建项目

打开编译器,创建名为Project_ATM的项目

创建Account类

Account类用来表示账户信息,包含卡号、姓名、性别、密码、余额、额度等属性,我们创建这个类,并完善一些基本属性

Acount的基本属性创建完毕后,我们需要给这些属性创建get和set方法,用来方便快捷的更改读取这些数值。

我们使用IDEA的快捷操作:

光标放在Account类内部,右键点击【Generate】,点击【Getter and Setter】,点住ctrl键不放,选中Acoount的所有属性,点击【ok】即可

生成的代码如下:

public class Account {
    private String cardId;    // 卡号
    private String userName;  // 名称
    private char sex;         // 性别
    private String passWord;  // 密码
    private double money;     // 资产
    private double limit;     // 限额

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

创建ATM类

ATM类用来模拟ATM系统的一些功能,最重要的,它应该能储存不同用户的账户信息(accounts),并且这个账户信息应该是私有的(private),不能随便被访问到。

我们创建这个类,并定义好所有用户的信息集合 accounts

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

import java.util.ArrayList;

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

我们的欢迎页是在控制台显示的,长下面这个样子

我们用代码实现一下这个逻辑

import java.util.ArrayList;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    // 创建一个新的Scanner对象,名为sc。Scanner对象用于获取用户键盘输入的值。
    private Scanner sc = new Scanner(System.in);
    public void start(){
        System.out.println("===欢迎您进入到了ATM系统===");
        System.out.println("1、用户登录");
        System.out.println("2、用户开户");
        System.out.println("请选择:");
        // 调用nextInt()方法,等待用户输入一个整数,并将这个整数存储在变量command中。
        int command = sc.nextInt();
        switch (command) {
            case 1:
                //用户登录
                break;
            case 2:
                //用户开户
                break;
            default:
                System.out.println("操作错误!");
                // 输入错误重新进入开始页
                start();
        }
    }
}

现在,我们可以测试一下了。

创建Test类

想要验证我们的ATM功能是否ok,我们需要创建个Test类验证下:

public class Text {
    public static void main(String[] args) {
        // 创建atm类,代表一个ATM系统
        ATM atm = new ATM();
        //启动ATM系统
        atm.start();
    }
}

我们执行这个函数试试效果

不错,很完美!

开户功能完善

功能简介

开户功能就是新增一个账户,也就是向系统的账户集合添加一个账户对象, 这个账户对象应该包含用户输入的姓名、性别、密码及每次取现的额度信息;同时,还有一个系统生成的随机卡号(8位数字,不能重复)。

生成基础信息

我们在ATM类中创建一个开户操作createAccount方法

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    // 创建一个新的Scanner对象,名为sc。Scanner对象用于获取用户键盘输入的值。
    private Scanner sc = new Scanner(System.in);
    public void start(){
    	// .....
    }
    // 用户开户操作
    private void createAccount(){
        
  }
}

这个createAccount方法应该做三件事儿:

  • 创建一个账户对象,用于封装用户的开户信息
  • 需要用户输入自己的开户信息,赋值给账户对象
  • 把这个账户对象,存入到账户集合中去

第二步中,我们首先需要用户输入账户名称

private void createAccount(){
        // 1、创建一个账户对象,用于封装用户的开户信息
        Account account = new Account();
        
        // 2、需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        String name = sc.next() ;
        account.setUserName(name);
        
        // 3、把这个账户对象,存入到账户集合中去
  }

sc.next()用于输出字符串

然后,需要用户输入性别

// 2、需要用户输入自己的开户信息,赋值给账户对象

// ....

System.out.println("请输入性别");
char sex = sc.next().charAt(0);
if (sex == '男' || sex == '女') {
    account.setSex(sex);
} else {
    System.out.println("输入无效,请输入男或女。");
}

// 3、把这个账户对象,存入到账户集合中去

注意:我们在Account类中定义性别用的是基本类型char,所以这里的sex用 char修饰。sc.next()返回的是字符串String类,所以我们用charAt(0)获取到这个字符串的第一个字符,将其转换成了char类型

上述代码中,如果用户没有按照我们的预期输入性别,我们应该让它重新输入,所以需要循环这部分代码。我们借助编译器添加while循环语句:选中代码,点击crtl+alt+T,选择while;if语句中,我们需要终止循环

最后,我们完善下其他方法

// 用户开户操作
    private void createAccount(){
        // 1、创建一个账户对象,用于封装用户的开户信息
        Account account = new Account();

        // 2、需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        // sc.next()用于返回字符串
        String name = sc.next() ;
        account.setUserName(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 okPassWord = sc.next();
            // 判断2次密码是否一样。
            if(okPassWord.equals(passWord)) {
                account.setPassWord(okPassWord);
                break;
            } else {
                System.out.println("您输入的2次密码不一致,请您确认~~");
            }
        }

        System.out.println("请您输入您的取现额度:");
        double limit = sc.nextDouble();
        account.setLimit(limit);

        // 3、把这个账户对象,存入到账户集合中去

注:卡号的生成比较复杂,我们先暂时忽略

现在,我们进行第三步,把生成的账户对象,存入到账户集合中。

// 3、把这个账户对象,存入到账户集合中去
accounts.add(account);
System.out.println("恭喜您,"+ account.getUserName() + "开户成功,您的卡号是:");

我们在Account类中完善一下getUserName方法

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

OK,现在我们在start方法中运行下createAccount()方法

然后再Tset类中运行程序试试看

丝滑流畅!

生长卡号信息

卡号是一个8位的数字,且和已有卡号不能重复,它的创建分为以下几个步骤

定义一个string类型的变量记住8位数字作为一个卡号

String cardId = "";

使用循环,循环8次,每次产生一个随机数给cardId连接起来

Random r = new Random();
for (int i = ; i < 8; i++) {
  int data = r.nextInt( bound: 10); // 0 - 9
  cardId += data;
}

判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新卡号返回.

Account acc = getAccountByCardId(cardId);
if(acc == null){
  // 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做为一个新卡号
  return cardId;
}

详细代码如下

    public void start(){ ... }

    // 用户开户操作
    private void createAccount(){ ... }

   //  返回一个8位 数字的卡号,而且这个卡号不能与其他账户的卡号重复
    private String createCardId(){
        while (true) {
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10); // 0 - 9
                cardId += data;
            }
            // 判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新卡号返回.
            Account acc = getAccountByCardId(cardId);
            if(acc == null){
                // 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做为一个新卡号
                return cardId;
            }
        }
    }
    //  根据卡号查询账户对象返回 accounts = [c1,c2,c3。]
    private Account getAccountByCardId(String cardId){
        // 遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            // 判断这个账户对象acc 中的卡号是否是我们要找的卡号
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null; // 查无此账户,这个卡号不存在的
    }
  • get(int index):是集合特有的方法,用于返回指定位置的元素
  • Random是一个类,它提供了生成各种类型的随机数的方法。
  • nextInt(10)生成0-9之间的随机数

现在,我们就可以完善开户功能了!

    // 用户开户操作
    private void createAccount(){
        // ...
        String newCard = createCardId();
        account.setCardId(newCard);
        // 3、把这个账户对象,存入到账户集合中去
        accounts.add(account);
        System.out.println("恭喜您,"+ account.getUserName() + "开户成功,您的卡号是:" + newCard);
  }

结语

至此,我们的开户功能就完成了!下面是开户功能的完整代码!

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class ATM {
    private ArrayList<Account> accounts = new ArrayList<>();
    // 创建一个新的Scanner对象,名为sc。Scanner对象用于获取用户键盘输入的值。
    private Scanner sc = new Scanner(System.in);
    public void start(){
        System.out.println("===欢迎您进入到了ATM系统===");
        System.out.println("1、用户登录");
        System.out.println("2、用户开户");
        System.out.println("请选择:");
        // 调用nextInt()方法,等待用户输入一个整数,并将这个整数存储在变量command中。
        int command = sc.nextInt();
        switch (command) {
            case 1:
                //用户登录
                break;
            case 2:
                //用户开户
                createAccount();
                break;
            default:
                System.out.println("操作错误!");
                // 输入错误重新进入开始页
                start();
        }
    }

    // 用户开户操作
    private void createAccount(){
        // 1、创建一个账户对象,用于封装用户的开户信息
        Account account = new Account();

        // 2、需要用户输入自己的开户信息,赋值给账户对象
        System.out.println("请您输入您的账户名称:");
        // sc.next()用于返回字符串
        String name = sc.next() ;
        account.setUserName(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 okPassWord = sc.next();
            // 判断2次密码是否一样。
            if(okPassWord.equals(passWord)) {
                account.setPassWord(okPassWord);
                break;
            } else {
                System.out.println("您输入的2次密码不一致,请您确认~~");
            }
        }

        System.out.println("请您输入您的取现额度:");
        double limit = sc.nextDouble();
        account.setLimit(limit);

        String newCard = createCardId();
        account.setCardId(newCard);
        // 3、把这个账户对象,存入到账户集合中去
        accounts.add(account);
        System.out.println("恭喜您,"+ account.getUserName() + "开户成功,您的卡号是:" + newCard);
  }

   //  返回一个8位 数字的卡号,而且这个卡号不能与其他账户的卡号重复
    private String createCardId(){
        while (true) {
            String cardId = "";
            Random r = new Random();
            for (int i = 0; i < 8; i++) {
                int data = r.nextInt(10); // 0 - 9
                cardId += data;
            }
            // 判断cardId中记住的卡号,是否与其他账户的卡号重复了,没有重复,才可以做为一个新卡号返回.
            Account acc = getAccountByCardId(cardId);
            if(acc == null){
                // 说明cardId没有找到账户对象,因此cardId没有与其他账户的卡号重复,可以返回它做为一个新卡号
                return cardId;
            }
        }
    }
    //  根据卡号查询账户对象返回 accounts = [c1,c2,c3。]
    private Account getAccountByCardId(String cardId){
        // 遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            // 判断这个账户对象acc 中的卡号是否是我们要找的卡号
            if(acc.getCardId().equals(cardId)){
                return acc;
            }
        }
        return null; // 查无此账户,这个卡号不存在的
    }
}

接下来,我们会完成这个项目的另一个核心功能:用户登录及登录后的转账等等功能!

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

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

相关文章

【LeetCode刷题-字符串】--6.N字形变换

6.N字形变换 方法&#xff1a;使用二维矩阵模拟 根据题意&#xff0c;当在矩阵中填写字符时&#xff0c;会向下填写r个字符&#xff0c;然后向右继续填写r - 2个字符&#xff0c;最后回到第一行&#xff0c;因此Z字形变换的周期是t r r - 2 2r - 2&#xff0c;是|/,每个周期…

Cesium点位弹窗

1.弹窗没法向加入点位一样加入到地图内部&#xff0c;entity没法实现 2.使用绝对定位&#xff0c;将地图组件通过定位加入到地图上&#xff0c;注意弹窗层级一定在地图上 3.通过判断点击位置是否是点位来获取entity信息&#xff0c;将信息显示在弹窗 4.将点击处点位的经纬度转为…

在Vue3中使用Element-Plus分页(Pagination )组件

开发过程中数据展示会经常使用到&#xff0c;同时分页功能也会添加到页面中。 记&#xff1a;在Vue3中使用Element-Plus分页组件与表格数据实现分页交互。 开始实现 引入表格和分页组件的H5标签。 <strong>Element-Plus分页组件使用</strong> <div><el-t…

视频监控管理平台EasyCVR告警查询拖动条无法显示,该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…

linux镜像的下载,系统下载(个人使用)

文章目录 一、系统之家二、国内镜像源三、Centos官网四、安装成功截图五、镜像类型的区别参考文档 一、系统之家 系统之家官网 二、国内镜像源 下载镜像地址&#xff1a; 1、官网地址&#xff1a;https://www.centos.org/ 2、阿里镜像站&#xff1a;https://mirrors.aliyu…

广西柳州机械异形零部件三维扫描3D抄数全尺寸测绘建模-CASAIM中科广电

一、背景介绍 复杂机械异形零部件具有不规则的形状和复杂的结构&#xff0c;给生产制造带来了很大的检测难度。为了确保零部件的制造质量和精度&#xff0c;需要对零部件进行全面的尺寸检测和分析。 CASAIM三维扫描仪在机械异形零部件全尺寸检测应用可以实现对机械异形零部件…

ATFX汇市:欧元区10月CPI年率终值不变,EURUSD逼近1.1000心理关口

ATFX汇市&#xff1a;据欧盟统计局11月17日发布的数据&#xff0c;欧元区10月名义CPI年率终值2.9%&#xff0c;与10月末公布的初值持平。欧央行对通胀率的长期调控目标为2%左右&#xff0c;10月份名义CPI年率已经非常接近目标范围&#xff0c;欧央行继续加息的紧迫性降低。10月…

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

公众号&#xff1a;全干开发 。 专注分享简洁但高质量的动图技术文章&#xff01; 回顾 在上节内容中&#xff0c;我们实现了用户开户的功能createAccount public void start(){System.out.println("欢迎您进入到了ATM系统");System.out.println("1、用户登录&…

思伟老友记 | 厦门路桥翔通海砼建材有限公司与思伟软件携手走过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;这是第一个用于缺陷检测…