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

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

项目概述

本教程适合刚学习完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 - 9cardId += 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 - 9cardId += 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 - 9cardId += 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.mzph.cn/news/150004.shtml

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

相关文章

如何在 Linux 上部署 RabbitMQ

如何在 Linux 上部署 RabbitMQ 文章目录 如何在 Linux 上部署 RabbitMQ安装 Erlang从预构建的二进制包安装从源代码编译 Erlang RabbitMQ 的安装使用 RabbitMQ Assistant 连接 RabbitMQ Assistant 是一款优秀的RabbitMQ 可视化管理工具&#xff0c;提供丰富的管理功能。下载地址…

9、传统计算机视觉 —— 边缘检测

本节介绍一种利用传统计算机视觉方法来实现图片边缘检测的方法。 什么是边缘检测? 边缘检测是通过一些算法来识别图像中物体之间,或者物体与背景之间的边界,也就是边缘。 边缘通常是图像中灰度变化显著的地方,标志着不同区域的分界线。 在一张图像中,边缘可以是物体的…

2024有哪些免费的mac苹果电脑内存清理工具?

在我们日常使用苹果电脑的过程中&#xff0c;随着时间的推移&#xff0c;可能会发现设备的速度变慢了&#xff0c;甚至出现卡顿的现象。其中一个常见的原因就是程序占用内存过多&#xff0c;导致系统无法高效地运行。那么&#xff0c;苹果电脑内存怎么清理呢&#xff1f;本文将…

【SpringCloud】Eureka基于Ribbon负载均衡的调用链路流程分析

文章目录 前言1.调用形式2.LoadBalancerInterceptor3.负载均衡流程分析3.1 调用流程图3.2 intercept&#xff08;&#xff09;方法3.3 execute&#xff08;&#xff09;方法3.4 getServer()方法3.4 子类的chooseServer&#xff08;&#xff09;方法3.5 getLoadBalancerStats().…

基于Spring Boot 框架的试卷自动生成系统的设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。你想解决的问题&#xff0c;今天给大家介绍…

2024年测试工程师必看系列之fiddler设置手机端抓包全套教程

fiddler设置手机端抓包 安卓手机抓包 第一步&#xff1a;配置电脑和安卓的相关设置 1、手机和fiddler位于同一个局域网内&#xff1b;首先从fiddler处获取到ip地址和端口号&#xff1a; &#xff0c;点击online&#xff0c;最后一行就是ip地址 2、路径&#xff1a;Tools》Op…

基于单片机的智能家居安保系统(论文+源码)

1.系统设计 本次基于单片机的智能家居安保系统设计&#xff0c;在功能上如下&#xff1a; 1&#xff09;以51单片机为系统控制核心&#xff1b; 2&#xff09;温度传感器、人体红外静释电、烟雾传感器来实现检测目的&#xff1b; 3&#xff09;以GSM模块辅以按键来实现远/近程…

SpringCloud微服务 【实用篇】| Eureka注册中心、Ribbon负载均衡

目录 一&#xff1a;Eureka注册中心 1. Eureka原理 2. 动手实践 ①搭建EurekaServer ②服务注册 ③服务发现 二&#xff1a;Ribbon负载均衡 1. 负载均衡原理 2. 负载均衡策略 3. 懒加载 一&#xff1a;Eureka注册中心 前面已经分析了&#xff0c;无论是SpringCloud还…

【前端学java】复习巩固-Java中的对象比较(14)

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学 java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08…

南京--ChatGPT/GPT4 科研实践应用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

云计算赛项容器云2023搭建

部署容器云平台[5 分] 使 用 OpenStack 私 有 云 平 台 创 建 两 台 云 主 机 &#xff0c; 云 主 机 类 型 使 用 4vCPU/12G/100G 类型&#xff0c;分别作为 Kubernetes 集群的 Master 节点和 node 节点&#xff0c; 然后完成 Kubernetes 集群的部署&#xff0c;并完成 Istio …

澳洲猫罐头真实水平如何?我家亲自喂养过的优质猫罐头推荐给大家

当我们选择猫罐头时&#xff0c;要关注它的营养配方是否完整均衡、原料是否新鲜优质以及生产工艺是否科学可靠。只有满足这三个条件的猫罐头&#xff0c;才能称得上是高品质的。 猫罐头要营养均衡&#xff0c;好的配方不能少&#xff1b;猫罐头成品要优质&#xff0c;原材料要…

查询数据库DQL

DQL 查询基本语法 -- DQL :基本语法; -- 1查询指定的字段 name entrydate 并返回select name , entrydate from tb_emp;-- 2 查询 所有字段 并返回select id, username, password, name, gender, image, job, entrydate, create_time, update_time from tb_emp;-- 2 查询…

C++ 继承和派生 万字长文超详解

本文章内容来源于C课堂上的听课笔记 继承和派生基础 继承是一种概念&#xff0c;它允许一个新创建的类&#xff08;称为子类或派生类&#xff09;获取另一个已经存在的类&#xff08;称为父类或基类&#xff09;的属性和行为。这就好比是子类继承了父类的特征。想象一下&…

【文末附资料链接】2023年第十三届亚太杯数学建模竞赛(APMCM)优秀参考论文思路指导(持续更新中ing)

一、赛事介绍 数学建模作为一门跨学科的科学&#xff0c;不仅需要对数学知识的熟练掌握&#xff0c;还需要对实际问题的深刻理解和解决问题的创新思维。亚太杯数学建模竞赛旨在激发青年学子的创造力和团队协作精神&#xff0c;培养其在实际问题中运用数学方法解决现实挑战的能力…

HarmonyOS ArkTS开发语言介绍(三)

1 引言 Mozilla创造了JS&#xff0c;Microsoft创建了TS&#xff0c;Huawei进一步推出了ArkTS。 从最初的基础的逻辑交互能力&#xff0c;到具备类型系统的高效工程开发能力&#xff0c;再到融合声明式UI、多维状态管理等丰富的应用开发能力&#xff0c;共同组成了相关的演进脉…

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

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

分享职业技术培训类型

职业技术培训类型包括&#xff1a;Python技术应用、人工智能应机器学习、大数据分析、机器学习。 一、“Python技术应用工程师” “Python技术应用工程师”职业技术认证是由工业和信息化部教育与考试中心推出一套专业化、科学化、系统化的人才考核标准&#xff0c;涉及在互…

【前端学java】Java中的异常处理(15)完结

往期回顾&#xff1a; 【前端学java】JAVA开发的依赖安装与环境配置 &#xff08;0&#xff09;【前端学java】java的基础语法&#xff08;1&#xff09;【前端学java】JAVA中的packge与import&#xff08;2&#xff09;【前端学java】面向对象编程基础-类的使用 &#xff08;…

Windows系统搭建VisualSVN服务并结合内网穿透实现公网访问

目录 前言 1. VisualSVN安装与配置 2. VisualSVN Server管理界面配置 3. 安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4. 固定公网地址访问 总结 前言 SVN 是 subversion 的缩写&#xff0c;是一个开放源…