系列文章目录
第一章 JAVA集中学习第一周学习记录(一)
第二章 JAVA集中学习第一周项目实践
第三章 JAVA集中学习第一周学习记录(二)
第四章 JAVA集中学习第一周课后习题
第五章 JAVA集中学习第二周学习记录(一)
第六章 JAVA集中学习第二周项目实践
文章目录
前言
本文讲述了复习Java后进行的第二个项目实践,图书管理系统的做法。重点使用的知识点有方法、数组、循环判断的嵌套 等。本文旨于服务想要系统进行Java复习的Java学习者,帮助他们快速熟练循环与选择的应用。
一、图书管理系的项目需求是什么?
功能:使用Java语言,图书管理系统要包括以下功能:
1、新增图书(已有的图书不在新增)
2、查看全部图书列表
3、删除图书(已借出的图书无法删除)
4、借阅图书
5、归还图书(每借出1天,应支付1元,归还时应算出应付金额)
6、图书排行榜(冒泡排序)
7、退出程序
菜单示例如下:
二、项目分析
1.自己思考
不要着急看下文,请给自己一些思考时间,如何实现本项目,难点重点在哪里,可以给自己掐表5分钟,全力思考其中一个功能如何实现。这一过程非常重要,请务必不要忽略 !!!
2.重难点分析
我认为本项目最难的部分在于删除、借阅、归还 时方法内不断地循环嵌套判断 ,但反过来说,这三种写出一种,另外两种也就迎刃而解了,这里我们使用删除图书来进行分析。
3.删除图书实现思路
将上图的内容代码化:
public static void deleteBook(){
//获取用户输入
for (){//遍历所有图书
if (){//判断是否书名相同
if (){//判断是否可借
for (){
//将后面的书向前移一位
//可以加判断,如果后面没有书了,停止循环return;
if (){
//后面还有书,把后一位赋给前一位
}
else {
//后面没有书,把此位上的值赋为null
//return;
}
}
}
else {
//提示书已被借走,无法删除
//return;
}
}
}
//提示书没有找到,无法删除
//return;
}
借书和还书方法与此方法极其相似,只需删除里层循环,并改一些判断条件!
三、项目代码及其分析
1.自行编写代码,实现项目需求
有一定Java基础的人可以尝试根据上面的解题思路,自行设计代码,会获得很大的成就感和对自己写代码的自信;
没那么会的也要尽量尝试,写不完没关系,重要的是你写的时候产生的逻辑思维和项目分解的思维
2.定义类名主函数
整体的代码我会放在文章最下方,着急的可以直接翻到篇尾
import org.omg.CosNaming.BindingIterator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//Take all 44.31 2errors
public class BookMenagementSystemAllCodeMemoryTest {
static Scanner scanner = new Scanner(System.in);
static String[] names = new String[50];
static String[] status = new String[50];
static String[] rentTime = new String[50];
static int[] count = new int[50];
public static void main(String[] args) {
init();
menu();
}
}
代码说明:
最上方的ParseException、SimpleDateFormat、Date是用于计算时间的,Scanner类是我们输入时所需要的类。
Take all 44.31 2errors代表我背写着打(可以复制自己在此篇代码中编写的代码,可以使用tab键快速补全)所用分钟以及bug数量。
BookMenagementSystemAllCodeMemoryTest代表这个类的名字是BookMenagementSystemAllCodeMemoryTest,类名因人而异,
public static void main(String[] args)是声明主函数的入口,所有程序的主函数入口都要写成这样,主函数名前篇一律。
我们在main主函数中运行init添加三本书,调用菜单方法。
2.init方法向数组添加书目
public static void init(){
names[0] = "八仙";
status[0] = "已借出";
rentTime[0] = "2024-01-01";
count[0] = 55;
names[1] = "把茄子";
status[1] = "可借";
rentTime[1] = "\t\t";
count[1] = 11;
names[2] = "八个";
status[2] = "可借";
rentTime[2] = "\t\t";
count[2] = 11;
names[3] = "七十一";
status[3] = "已借出";
rentTime[3] = "2024-04-01";
count[3] = 11;
}
代码运行结果:
代码说明:
分别为下标为0、1、2、3的数组位置添加一本书的信息。
3.menu与returnMenu实现循环进行功能的实现
public static void menu(){
System.out.println("*********************");
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.print("请输入您需要的功能数字:");
int i = scanner.nextInt();
switch (i){
case 1:
System.out.println("--->新增图书");
addBook();
returnMenu();
break;
case 2:
System.out.println("--->查看图书");
viewBook();
returnMenu();
break;
case 3:
System.out.println("--->删除图书");
deleteBook();
returnMenu();
break;
case 4:
System.out.println("--->借阅图书");
rentBook();
returnMenu();
break;
case 5:
System.out.println("--->归还图书");
returnBook();
returnMenu();
break;
case 6:
System.out.println("--->图书排行榜");
bookRank();
returnMenu();
break;
case 7:
System.out.println("--->退出系统");
break;
default:
System.out.println("您输入有误,请输入功能对应数字,请输入0后重新输入");
returnMenu();
break;
}
}
public static void returnMenu(){
System.out.println("*********************");
System.out.println("输入0返回菜单");
int i = scanner.nextInt();
if (i == 0)
menu();
}
代码运行结果:
代码说明:
menu()部分代码很简单,menu()大多是输出语句,获取用户要执行的功能后,最后使用switch来判断选的是哪个。
returnMenu()方法用于判断用户是否需要执行下一个功能,如果不需要,执行流返回menu()执行break语句结束循环,如果需要,返回menu()进行循环。
4.新增图书addBook()
public static void addBook(){
System.out.println("请输入要新增图书的名字:");
String name = scanner.next();
int i = 0;
for (i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
System.out.println("图书已存在,无法新增,输入0返回主函数");
return;
}
}
names[i] = name;
status[i] = "可借";
rentTime[i] = "\t\t";
count[i] = 0;
return;
}
代码运行结果:
提示:这里应该加一个新增成功的反馈语句的,在下犯懒了
代码说明:
实现新增图书的功能,如果已经存在该图书,则无法新增,通知使用者并返回。
5.查看图书列表viewBook()
public static void viewBook(){
System.out.println("序号\t名称\t状态\t借出时间\t\t借出次数");
for (int i = 0; i < names.length && names[i] != null; i++){
System.out.println((i + 1) + "\t" + names[i] + "\t" + status[i] + "\t" + rentTime[i] + "\t" + count[i]);
}
return;
}
代码运行结果:
代码说明:
从数组下标为0的元素开始输出所有书,碰到空值时停止。
6.删除图书deleteBook()
public static void deleteBook(){
System.out.println("请输入要删除图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("可借")){
for (int j = i; j < names.length && names[j] != null; j++){
if (names[j + 1] != null){
names[j] = names[j + 1];
status[j] = status[j + 1];
rentTime[j] = rentTime[j + 1];
count[j] = count[j + 1];
}
else {
names[j] = null;
status[j] = null;
rentTime[j] = null;
count[j] = 0;
System.out.println(name + "删除成功!");
return;
}
}
}
else {
System.out.println(name + "已被借走,无法删除,删除失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法删除,删除失败");
return;
}
代码运行结果:
代码说明:
遍历所有图书,看有没有同名书,如果有,就判断是否没被借出,如果没被借出,将所有被删除数后的书都向前提一位,如果被借出,反馈无法删除结束方法,若循环所有书没找到同名书,反馈无法删除结束方法。
5.借阅图书rentBook()
public static void rentBook(){
System.out.println("请输入要租借的图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("可借")){
System.out.println("图书已找到,处于可借状态,请输入租借日期");
String time = scanner.next();
status[i] = "已借出";
rentTime[i] = time;
count[i]++;
System.out.println("借书成功!");
return;
}
else {
System.out.println(name + "已被借走,无法借出,借出失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法借出,借出失败");
return;
}
代码运行结果:
代码说明:
借书方法与删除方法外侧完全一致,只是借出没有内侧循环,只有改变被借书的状态。
5.归还图书returnBook()以及计算时间方法countTime()
public static void returnBook(){
System.out.println("请输入要归还的图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("已借出")){
System.out.println("图书已找到,处于已借出状态,请输入归还日期");
String time = scanner.next();
int money = countTime(rentTime[i], time);
System.out.println("请支付" + money);
status[i] = "可借";
rentTime[i] = "\t\t";
System.out.println("还书成功!");
return;
}
else {
System.out.println(name + "未被借走,无法还书,还书失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法还书,还书失败");
return;
}
public static int countTime(String rent1, String return1){
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
Date rent2 = sdFormat.parse(rent1);
long rent3 = rent2.getTime();
Date return2 = sdFormat.parse(return1);
long return3 = return2.getTime();
return ((int)((return3 - rent3)/1000/60/60/24));
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
代码运行结果:
代码说明:
还书方法跟借书方法一致,一个是判断是否借出了,另一个是判断是否没被借出
重点讲一下不同点:计算时间方法,归还时要用归还时间减去借书时间来计算代付金额,我们先设定yyyy-MM-dd的格式化输入,将字符型转化成Date型,再将Date型转化为距离1900-01-01-00-00-00的毫秒数,最后两毫秒数相减,÷1000÷60÷60÷24转化成天数,返回给还书方法。
5.图书排行榜bookRank()
public static void bookRank(){
int number = 0;
for (; number < names.length && names[number] != null; number++);
for (int i = 0; i < number - 1; i++){
for (int j = i; j < number - i - 1; j++){
if (count[j] < count[j + 1]){
String middleName = names[j];
names[j] = names[j + 1];
names[j + 1] = middleName;
String middleStatus = status[j];
status[j] = status[j + 1];
status[j + 1] = middleStatus;
String middleRentTime = rentTime[j];
rentTime[j] = rentTime[j + 1];
rentTime[j + 1] = middleRentTime;
int middleCount = count[j];
count[j] = count[j + 1];
count[j + 1] = middleCount;
}
}
}
System.out.println("借出次数\t名称");
for (int i = 0; i < number; i++){
System.out.println(count[i] + "\t" + names[i]);
}
}
代码运行结果:
代码说明:
使用冒泡排序的算法
冒泡排序:命名原因是水中的泡泡,由于水压原因,越往上(靠近水面)的泡泡越大。冒泡算法的原理与其类似:每外轮确定一个最大的,让他浮出水面(排在数组最前面);每内轮确定这外轮中哪个元素是最大的(如果碰到更大的,让更大的先浮出水面)
转换成逻辑的思路来说:每内轮确定一个最大的,外轮确定需要的次数(共有n个数,外轮的轮数为n-1轮,因为倒数第二轮派的时候,最小的就被确定了)(现执行了外轮x轮,需要进行内轮n-x-1轮【例如只剩两个数未进行排序了(n-x=2),这时我们只需要判断一轮就可以排好顺序】)
按照上面的逻辑,我们的排序就排好了,最后通过for循环输出。
总结
本文介绍了如何使用Java语言编写图书管理系统,主要知识点有方法、数组、循环判断的多层嵌套,实现了增、删、查、借、还、排行的功能,对理解以上知识点有一定帮助。全部学会的同学可以试着盲打(可以复制自己刚写的),尽量在40分钟内完成上面代码,并在评论区晒出你的成绩!另外推下Simon Pegg的搞笑电影,超搞笑!!!!!
全部代码:
import org.omg.CosNaming.BindingIterator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//Take all 44.31 2errors
public class BookMenagementSystemAllCodeMemoryTest {
static Scanner scanner = new Scanner(System.in);
static String[] names = new String[50];
static String[] status = new String[50];
static String[] rentTime = new String[50];
static int[] count = new int[50];
public static void main(String[] args) {
init();
menu();
}
public static void init(){
names[0] = "八仙";
status[0] = "已借出";
rentTime[0] = "2024-01-01";
count[0] = 55;
names[1] = "把茄子";
status[1] = "可借";
rentTime[1] = "\t\t";
count[1] = 11;
names[2] = "八个";
status[2] = "可借";
rentTime[2] = "\t\t";
count[2] = 11;
names[3] = "七十一";
status[3] = "已借出";
rentTime[3] = "2024-04-01";
count[3] = 11;
}
public static void menu(){
System.out.println("*********************");
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.print("请输入您需要的功能数字:");
int i = scanner.nextInt();
switch (i){
case 1:
System.out.println("--->新增图书");
addBook();
returnMenu();
break;
case 2:
System.out.println("--->查看图书");
viewBook();
returnMenu();
break;
case 3:
System.out.println("--->删除图书");
deleteBook();
returnMenu();
break;
case 4:
System.out.println("--->借阅图书");
rentBook();
returnMenu();
break;
case 5:
System.out.println("--->归还图书");
returnBook();
returnMenu();
break;
case 6:
System.out.println("--->图书排行榜");
bookRank();
returnMenu();
break;
case 7:
System.out.println("--->退出系统");
break;
default:
System.out.println("您输入有误,请输入功能对应数字,请输入0后重新输入");
returnMenu();
break;
}
}
public static void returnMenu(){
System.out.println("*********************");
System.out.println("输入0返回菜单");
int i = scanner.nextInt();
if (i == 0)
menu();
}
public static void addBook(){
System.out.println("请输入要新增图书的名字:");
String name = scanner.next();
int i = 0;
for (i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
System.out.println("图书已存在,无法新增,输入0返回主函数");
return;
}
}
names[i] = name;
status[i] = "可借";
rentTime[i] = "\t\t";
count[i] = 0;
return;
}
public static void viewBook(){
System.out.println("序号\t名称\t状态\t借出时间\t\t借出次数");
for (int i = 0; i < names.length && names[i] != null; i++){
System.out.println((i + 1) + "\t" + names[i] + "\t" + status[i] + "\t" + rentTime[i] + "\t" + count[i]);
}
return;
}
public static void deleteBook(){
System.out.println("请输入要删除图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("可借")){
for (int j = i; j < names.length && names[j] != null; j++){
if (names[j + 1] != null){
names[j] = names[j + 1];
status[j] = status[j + 1];
rentTime[j] = rentTime[j + 1];
count[j] = count[j + 1];
}
else {
names[j] = null;
status[j] = null;
rentTime[j] = null;
count[j] = 0;
System.out.println(name + "删除成功!");
return;
}
}
}
else {
System.out.println(name + "已被借走,无法删除,删除失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法删除,删除失败");
return;
}
public static void rentBook(){
System.out.println("请输入要租借的图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("可借")){
System.out.println("图书已找到,处于可借状态,请输入租借日期");
String time = scanner.next();
status[i] = "已借出";
rentTime[i] = time;
count[i]++;
System.out.println("借书成功!");
return;
}
else {
System.out.println(name + "已被借走,无法借出,借出失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法借出,借出失败");
return;
}
public static void returnBook(){
System.out.println("请输入要归还的图书的名字:");
String name = scanner.next();
for (int i = 0; i < names.length && names[i] != null; i++){
if (name.equals(names[i])){
if (status[i].equals("已借出")){
System.out.println("图书已找到,处于已借出状态,请输入归还日期");
String time = scanner.next();
int money = countTime(rentTime[i], time);
System.out.println("请支付" + money);
status[i] = "可借";
rentTime[i] = "\t\t";
System.out.println("还书成功!");
return;
}
else {
System.out.println(name + "未被借走,无法还书,还书失败");
return;
}
}
}
System.out.println(name + "没有被找到,无法还书,还书失败");
return;
}
public static int countTime(String rent1, String return1){
SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
Date rent2 = sdFormat.parse(rent1);
long rent3 = rent2.getTime();
Date return2 = sdFormat.parse(return1);
long return3 = return2.getTime();
return ((int)((return3 - rent3)/1000/60/60/24));
} catch (ParseException e) {
e.printStackTrace();
}
return 0;
}
public static void bookRank(){
int number = 0;
for (; number < names.length && names[number] != null; number++);
for (int i = 0; i < number - 1; i++){
for (int j = i; j < number - i - 1; j++){
if (count[j] < count[j + 1]){
String middleName = names[j];
names[j] = names[j + 1];
names[j + 1] = middleName;
String middleStatus = status[j];
status[j] = status[j + 1];
status[j + 1] = middleStatus;
String middleRentTime = rentTime[j];
rentTime[j] = rentTime[j + 1];
rentTime[j + 1] = middleRentTime;
int middleCount = count[j];
count[j] = count[j + 1];
count[j + 1] = middleCount;
}
}
}
System.out.println("借出次数\t名称");
for (int i = 0; i < number; i++){
System.out.println(count[i] + "\t" + names[i]);
}
}
}
标签:status,JAVA,names,System,第二周,集中学习,println,图书,out
From: https://blog.csdn.net/howwickhappy/article/details/140659691