【Java学习】实现图书管理系统

news2024/11/16 17:37:10

  所属专栏:Java学习  

在这里插入图片描述

🍁1. 功能演示 

用户分为普通用户和管理员,登录进系统之后可以对图书进行一系列操作,此时我们要明白,对图书的操作是通过书架来执行的,我们平常在图书馆上借书就是在书架上 

🍁2. 类的创建 

🍁2.3 创建图书类

来创建图书类,对图书的属性进行封装,并写上对应的get和set 方法

    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public Book() {
    }

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    /······get set toString······/

🍁2.4 创建书架类 

创建书架的类,书架上肯定不止一本书,所以这里选择数组来存储多个book对象,因为在一开始就有了一部分书,所以在创建书架的对象时,就要把图书的对象放进去

public class BookList {

    private Book[] books = new Book[10];//用到了组合
    private int usedSize = 0;//实际放的数量
    public BookList() {
        //创建对象之后就已经有了三本书
        books[0] = new Book("三国演义", "罗贯中", 20,"小说");
        books[1] = new Book("西游记", "吴承恩", 30,"小说");
        books[2] = new Book("红楼梦", "曹雪芹", 20,"小说");
        usedSize = 3;
    }
}

🍁2.5 创建用户类 

接着创建用户,而用户又分为普通用户和管理员,就可以通过继承来实现这种关系,这两种用户的菜单也不相同,就可以抽取出来,在子类进行重写

public abstract class User {
    //不同包的子类可以访问
    protected String name;

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();
}

来看menu方法的实现 

之后就可以在Main类里面以多态的方式,根据不同的对象调取不同的菜单 

public class Main {
    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名:");
        String name = sc.nextLine();
        System.out.println("请输入身份:1.管理员 2. 普通用户");
        int choice = sc.nextInt();
        if (choice == 1) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }

    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();
    }
}

🍁3. 功能的实现 

菜单里的操作可以通过接口来实现这个业务逻辑,
 

public interface IOPeration {
    void work(BookList bookList);
}

例如添加图书,直接去实现一个操作接口,具体的逻辑再在本类中进行重写

public class AddOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("添加图书");
    }
}

之后创建各种功能的接口

那么有了这些操作该怎么调用呢,无论时普通用户还是管理员,都是用户在操作,所以要在父类User中创建接口数组,再调用具体的方法实现操作

捋一下现在的逻辑

🍁4. 功能完善

下面是一个基本框架,包含了显示图书、查找图书、新增图书、借阅图书、归还图书和删除图书的功能。

🍁4.1 显示图书

  • 功能描述:展示当前系统中所有图书的列表,包括图书的书名、作者、价格,类型以及借阅状态(是否已借出)。
  • 实现要点:遍历图书数据集合,按一定格式(如表格)输出图书信息。

因为之前book是用数组存在BookList中的,所以只要遍历数组就可以了

BookList中要提供对应的get,set方法:

    public int getUsedSize() {
        return usedSize;
    }

    public Book getBook(int pos) {
        return books[pos];
    }

    public void setBook(int pos, Book book) {
        this.books[pos] = book;
    }

显示图书:

public class ShowOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        for(int i= 0;i < currentSize;i++){
            System.out.println(bookList.getBook(i));//输出当前书架上的所有书籍信息
        }
    }
}

🍁4.2 查找图书 

  • 功能描述:根据用户输入的关键字(书名)查找并显示匹配的图书信息。
  • 实现要点:遍历图书数据集合,匹配用户输入的关键字,返回匹配的图书列表。

明白了怎么遍历之后,查找图书就非常简单了

public class FindOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入查找的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                System.out.println(book);
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

🍁4.3 新增图书

  • 功能描述:允许用户输入新的图书信息(书名,类型,价格等),并将其添加到系统中。
  • 实现要点:接收用户输入,验证输入的有效性,然后将新图书信息添加到图书数据集合中。

新增图书时需要注意及时的更新书架的信息,如果书架满了的话就需要提示书架已满,添加之后要记得更改currentSize

public class AddOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        int currentSize = bookList.getUsedSize();
        if(currentSize == bookList.getBooks().length){
            System.out.println("书架已满,无法添加");
            return;
        }
        System.out.println("添加图书");
        System.out.println("请输入书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入价格:");
        int price = scanner.nextInt();
        scanner.nextLine();
        System.out.println("请输入类型:");
        String type = scanner.nextLine();

        Book book = new Book(name, author, price, type);
        //添加图书
        bookList.setBook(currentSize, book);
        bookList.setUsedSize(currentSize + 1);
        System.out.println("添加成功");
    }
}

🍁4.4 借阅图书 

  • 功能描述:允许用户根据图书名字借阅图书,更新图书的借阅状态。
  • 实现要点:首先检查图书是否存在且当前未被借出,然后更新图书的借阅状态为已借出,并记录借阅信息(如借阅人、借阅时间)。

借阅图书首先需要在书架上找到这本书才能借阅,所以就需要对书架进行遍历,并查看书的状态,借阅之后也需要及时的更新书架信息,还有书籍的状态

public class BorrowOperation implements IOPeration{
    public void work(BookList bookList) {
        System.out.println("请输入借阅的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for(int i = 0;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                //判断是否借出
                if(book.isBorrowed()){
                    System.out.println("该图书已被借阅");
                    return;
                }
                //修改借阅状态
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return;
            }
        }
        System.out.println("不存在该图书");
    }
}

🍁4.5 归还图书 

  • 功能描述:允许用户根据图书名称归还图书,更新图书的借阅状态。
  • 实现要点:检查图书是否已借出且归还的图书有效,然后更新图书的借阅状态为未借出,并记录归还信息(如归还时间)。

同理,归还图书时需要查看图书的状态,是否是已借出,归还之后也要及时修改图书的状态信息

public class ReturnOperation implements IOPeration{
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入归还的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (book.getName().equals(name)) {
                //判断是否借出
                if (book.isBorrowed()) {
                    //修改借阅状态
                    book.setBorrowed(false);
                    System.out.println("归还成功");
                    return;
                }
            }
        }
        System.out.println("此书未被借出");
    }
}

🍁4.6 删除图书 

  • 功能描述:允许用户根据图书ID删除图书,从系统中移除该图书信息。
  • 实现要点:检查图书是否存在,然后将其从图书数据集合中移除。注意,可能需要先检查图书是否已被借出,并提示用户处理借阅状态。

删除图书只需要把要删除的图书从书架上移除即可,由于是用顺序表存储的图书,所以当删除其中的一本书之后,这本书后面的图书都要往前移,并且如果查找不到删除的图书的信息,那么就需要给出提示

public class DeleteOperation implements IOPeration {
    @Override
    public void work(BookList bookList) {
        System.out.println("请输入删除的图书:");
        Scanner sc = new Scanner(System.in);
        String name = sc.nextLine();
        int i = 0,pos = 0;
        int currentSize = bookList.getUsedSize();
        for(;i < currentSize;i++){
            Book book = bookList.getBook(i);
            if(book.getName().equals(name)){
                pos = i;
                break;
            }
        }
        if(i == currentSize){
            System.out.println("没有找到该图书");
        }
        for(int j = pos;j < currentSize - 1;j++){
            Book book = bookList.getBook(j + 1);
            bookList.setBook(j,book);
        }
        bookList.setBook(currentSize - 1,null);
        //更新currentSize
        bookList.setUsedSize(currentSize - 1);
        System.out.println("删除成功");
    }
}

在这里插入图片描述

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

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

相关文章

简简单单用用perf

实践前提&#xff1a;正确安装 perf 和 FlameGrap。若没安装&#xff0c;心领神会亦可。 1 示例程序 #define m_loop() ({ for(int i0; i < 1000000; i); })void fb(void) {m_loop(); }void fj(void) {fb(); }void fy(void) {m_loop(); }void loop(void) {for (;;) {fy();…

实习教训,永远铭记

1.毕了业宁宁可收入低一点&#xff0c;但一定去那种开发产品有规章制度&#xff0c;有流程规范的公司。 永远不接受小公司&#xff0c;没有任何规范可言的小公司&#xff01;&#xff01;&#xff01;&#xff01; 永远不接受小公司&#xff0c;没有任何规范可言的小公司&…

Docker手动在虚拟机上部署前端、后端和数据库

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、项目准备 二、MySQL数据库部署 三、SpringBoot后端部署 四、Vue前端部署 一、项目准备 准备数据库、前端项目、后端项目。 准备一…

YOLOv8跑通POSE分类--姿态检测coco8-pos数据集

目录 1.数据集格式如下 2.训练的代码如下 3.训练的网络如下 4.训练的结果如下 简单留个备注&#xff0c;方便自己以后查找 1.数据集格式如下 txt里面的格式 类别 中心点x,y 宽高 姿态1的x,姿态1的y,姿态可见度。。。。 <class-index> <x> <y> <widt…

使用dockerDesktop下载x86,amd64,arm64镜像

开启梯子 修改dockerDesktop配置&#xff0c;将experimental的值设置成 true&#xff0c;意思是&#xff1a;开启manifest实验特性 重启docker后下载镜像 –platform后面就是架构版本&#xff0c;x86,amd64,arm64 C:\Users\dell> docker pull --platformarm64 nginx:late…

Linux--C语言之指针

文章目录 一、指针的引入二、指针概述三、指针变量&#xff08;一&#xff09;指针变量的定义语法&#xff1a;举例&#xff1a;注意&#xff1a; &#xff08;二&#xff09;指针变量的使用1. 指针变量的赋值2. 操作指针变量的值3. 操作指针变量指向的值4. 两个有关运算符的使…

【DA】《Augmentation for small object detection》

arXiv-2019 文章目录 1 Background and Motivation2 Related Work3 Advantages / Contributions4 Method4.1 Oversampling4.2 Augmentation4.3 Copy-Pasting Strategies 5 Experiments5.1 Datasets and Metrics5.2 Oversampling5.3 Augmentation5.4 Copy-Pasting strategies5.4…

Python入门级[ 基础语法 函数... ] 笔记 例题较多

本文是刚学习Python的笔记&#xff0c;当时使用的编辑器是交互式编程&#xff0c;所以很多代码可能在你们的编译器上面不能运行&#xff0c;我用快引用引起来了&#xff0c;还需要大家自己动手试一试。 内容涉及的比较简单&#xff0c;主要还是Python的语法部分&#xff1a;三…

Ubuntu20.04.4.LTS系统如何下载安装VirtualBox虚拟机?

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

Solidworks二次开发:变螺距螺旋线

在帮助文档中&#xff0c;找到变螺距螺旋线的VBA代码&#xff0c;如下&#xff1a; --------------------------------------------------------------Preconditions: Verify that the specified part document template exists.Postconditions:1. Creates a variable-pitch h…

Nginx 学习之 配置支持 IPV6 地址

目录 搭建并测试1. 下载 NG 安装包2. 安装编译工具及库文件3. 上传并解压安装包4. 编译5. 安装6. 修改配置7. 启动 NG8. 查看 IP 地址9. 测试 IP 地址9.1. 测试 IPV4 地址9.2. 测试 IPV6 地址 IPV6 测试失败原因1. curl: [globbing] error: bad range specification after pos …

SQL— DDL语句学习【后端 9】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…

20240819用SDDiskTool_v1.72写IMG固件到256GB的TF卡后再用它给飞凌OK3588-C核心板刷机

20240819用SDDiskTool_v1.72写IMG固件到256GB的TF卡后再用它给飞凌OK3588-C核心板刷机 2024/8/19 10:35 1、精简的配置HDMI0为主显示屏的步骤&#xff1a; 在串口终端中启动到uboot阶段&#xff0c;按空格进入 显示配置模式。 按 2 进入&#xff1a;2:Display type 按 a 两次…

2、Future与CompletableFuture实战

Future与CompletableFuture实战 Callable与Future与FutureTask介绍Callable详解Future介绍FutureTask使用使用案例&#xff1a;促销活动中商品信息查询 Future的局限性 CompletableFuture使用详解应用场景创建异步操作runAsync&supplyAsync 获取结果join&get 结果处理w…

《亿级流量系统架构设计与实战》第十一章 Timeline Feed服务

Timeline Feed服务 一、概述1、分类2、功能 二、设计原理1、拉模式与用户发件箱2、推模式与用户收件箱3、推拉模式结合 三、关键技术1、内容与用户收件箱的交互&#xff08;推模式&#xff09;2、推送拆分子任务3、收件箱模型设计 内容总结自《亿级流量系统架构设计与实战》 一…

[linux#39][线程] 详解线程的概念

线程&#xff1a;是进程内的一个执行分支。线程的执行粒度比进程要细 什么是线程&#xff1f; • 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程 是“一个进程内部的控制序列” • 一切进程至少都有一个执行线程 • …

使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台

目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version&#xff1a;qemu-7.2.0 Linux Version&#xff1a;linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…

基于vue框架的爱喵星人服务平台设计与实现80sgi(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,猫食分类,猫粮信息,养护知识,流浪猫信息,申请领养,志愿者招募,申请加入,猫咪品种,团队活动 开题报告内容 基于Vue框架的爱喵星人服务平台设计与实现 开题报告 一、研究背景与意义 1.1 研究背景 随着社会的快速发展和人们生活水…

使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验

title: 使用 onBeforeRouteUpdate 组合式函数提升应用的用户体验 date: 2024/8/15 updated: 2024/8/15 author: cmdragon excerpt: 摘要&#xff1a;本文介绍如何在Nuxt 3开发中使用onBeforeRouteUpdate组合式函数来提升应用用户体验。通过在组件中注册路由更新守卫&#xf…

Markdown导出为 Excel文件 Vue3

直接复制到单文件内即可使用 需要用到的插件 xlsx 0.17.5marked 14.0.0file-saver 2.0.5vue 3.4.29 直接SFC单文件内使用 <script setup> import {reactive} from vue; import xlsx from xlsx; import {marked} from marked; import {saveAs} from file-saver;const…