JAVA集中学习第二周项目实践[图书管理系统]

系列文章目录

第一章 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]);
        }
    }

}
  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值