当前位置: 首页 > news >正文

Java实现图书管理系统

一、引言 

本篇介绍了一个简易的图书管理系统,面向管理员和普通用户分别给出了不同的菜单,实现了一些基本的图书操作功能,包括图书的增删查改、借阅、归还等

二、图书管理系统框架

图书管理系统,顾名思义,管理的是图书,所以需要定义一个类来存放书籍的信息,同时定义一个类来表示存放书籍的书架;在系统中需要进行查找图书、借阅图书、归还图书、新增图书、删除图书、显示图书、退出系统等操作,我们可以将这些功能定义在一个包里面,通过实现一个共同的接口,进而进行书籍的各项操作;之前所描述的菜单也可以定义在一个包中,管理员和普通用户分别定义为不同的类,继承自同一个父类,在创建不同的对象时进行不同的操作

2.1书籍

书籍类中需要包含书籍的基本信息以及使用这些信息的方法,包括

  • 书籍名称name
  • 书籍作者author
  • 书籍价格price
  • 书籍类型type
  • 被借阅情况isBorrowed
  • 相应的各个get-set方法
  • 显示所有信息的toString方法(需要重写)

2.2书架

创建一个Book类数组,用来存储书籍的数据,变量useSize表示有效的数据个数(实际存放的书的个数),相应的get-set方法,toString方法(需要被重写)

2.3功能接口

定义一个IOperations接口,通过接口实现具体的功能,使程序更有条理性

二、图书管理系统菜单

不同身份的人对于图书管理系统有着不同的需求,比如管理者需要进行图书的增删查改,普通用户则需要进行图书的借阅和归还,在程序中体现在根据不同身份给出不同的系统菜单

定义一个User类,实现两个类共有的成员变量以及成员方法

3.1管理员菜单

新建一个AdminUser类,继承User类,需要重写父类的方法,并实现自己菜单的打印

  1. 查找图书
  2. 新增图书
  3. 删除图书
  4. 显示图书
  5. 退出系统

3.2普通用户菜单

新建一个NormalUser类,继承User类,需要重写父类的方法,并实现自己菜单的打印

  1. 查找图书
  2. 借阅图书
  3. 归还图书
  4. 退出系统

四、图书管理系统功能

4.1新增图书

首先需要判断书架是否是满的,若是满的,输出信息,否则进行新增书籍的信息的录入。在获取到新增书籍的信息之后,需要判断一下这本书在书架上是否存在,若存在,输出错误信息,不存在,正常录入,同时需要修改usedSize的值

4.2借阅图书

输入需要借阅的书籍名称,在书架上查找该书,找到后判断该书籍的借阅状态,若已被借阅,输出错误信息,若未被借阅,修改借阅状态,借阅成功,若是未找到该书,输出错误信息

4.3删除图书

输入需要删除的书籍名称,在书架上查找该书,若存在,查找要删除的书籍所在下标,从该下标开始,通过元素覆盖的方式,删除书籍信息,删除后要记得修改对应的usedSize的值。同样的,要是被删除的书籍不存在,输出错误信息

4.4查找图书

遍历数组,通过书籍的名字进行图书的查找,这里需要用到书架的usedSize作为循环的终止条件,找到后打印书籍信息,否则输出错误信息

4.5归还图书

和借阅图书过程类似,输入书籍名称,遍历书架,找到被借走的书籍的信息,将书籍的状态改成未借阅,如果没有找到该书,则输出错误信息

4.6展示图书

遍历书架,逐个打印书籍信息

4.7退出系统

使用exit方法退出系统

五、图书管理系统完整代码实现

5.1总体框架

5.2book包

5.2.1ioperations包
5.2.1.1AddOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperations implements IOperations{public void work(BookList bookList){System.out.println("新增图书...");int currentsize = bookList.getUsedSize();if(currentsize == bookList.getBooks().length){System.out.println("书架已满,新增失败");}Scanner scanner = new Scanner(System.in);System.out.println("请输入书名:");String name = scanner.nextLine();System.out.println("请输入作者名:");String author = scanner.nextLine();System.out.println("请输入价格:");int price = scanner.nextInt();System.out.println("请输入书籍类型:");String type = scanner.nextLine();Book newbook = new Book(name,author,price,type);for (int i = 0; i < currentsize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)) {System.out.println("此书已存在,插入失败");return;}bookList.setBook(currentsize,newbook);bookList.setUsedSize(currentsize++);System.out.println("新增图书成功!");}}
}
5.2.1.2BorrowOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperations implements IOperations{public void work(BookList bookList){System.out.println("借阅图书...");Scanner scanner = new Scanner(System.in);System.out.println("请输入要借阅的图书名:");String name = scanner.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("该书已被借阅...");book.setBorrowed(false);return;}else{System.out.println("借阅成功!");return;}}}System.out.println("未找到此书,借阅失败!");}
}
5.2.1.3DeleteOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class DeleteOperations implements IOperations{public void work(BookList bookList){System.out.println("删除图书...");Scanner scanner = new Scanner(System.in);System.out.println("请输入要删除的图书名:");String name = scanner.nextLine();int currentsize = bookList.getUsedSize();int pos = -1;int i = 0;for (; i < currentsize; i++) {Book book = bookList.getBook(i);if(book.getName().equals(name)) {pos = i;break;}}if(i == currentsize){System.out.println("该图书不存在,无法删除!");return;}for(int j = pos; j < currentsize - 1; j++){Book book = bookList.getBook(j+1);bookList.setBook(j,book);}bookList.setBook(currentsize-1,null);bookList.setUsedSize(currentsize-1);System.out.println("《"+name+"》"+"删除成功");}
}
5.2.1.4ExitOperations类
package book.ioperations;import book.BookList;public class ExitOperations implements IOperations{public void work(BookList bookList){System.out.println("退出系统...");System.exit(0);}
}
5.2.1.5FindOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperations implements IOperations{public void work(BookList bookList){System.out.println("借阅图书...");Scanner scanner = new Scanner(System.in);System.out.println("请输入要查找的图书名:");String name = scanner.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("已找到...\n书籍信息为:");System.out.println(book);return;}}System.out.println("未找到此书...");}
}
5.2.1.6ReturnOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperations implements IOperations{public void work(BookList bookList){System.out.println("归还图书...");Scanner scanner = new Scanner(System.in);System.out.println("请输入要归还的图书名:");String name = scanner.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("归还成功!");book.setBorrowed(false);return;}}System.out.println("未找到此书,归还失败!");}}
}
5.2.1.7ShowOperations类
package book.ioperations;import book.Book;
import book.BookList;import java.sql.SQLOutput;public class ShowOperations implements IOperations{public void work(BookList bookList){System.out.println("显示书籍信息...");int currentsize = bookList.getUsedSize();for (int i = 0; i < currentsize; i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}
5.2.1.8IOperations接口
package book.ioperations;import book.BookList;public interface IOperations {void work(BookList bookList);
}
5.2.2Book类
package book;public class Book {private String name;private String author;private int price;private String type;private boolean isBorrowed;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public String getType() {return type;}public void setType(String type) {this.type = type;}public boolean isBorrowed() {return isBorrowed;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrowed?" 已借出":" 未借出")+'}';}
}
5.2.3BookList类
package book;import java.util.Arrays;public class BookList {private Book[] books = new Book[10];private int usedSize;public BookList(){this.books[0] = new Book("西游记","吴承恩",20,"小说");this.books[1] = new Book("水浒传","施耐恩",20,"小说");this.books[2] = new Book("三国演义","罗贯中",20,"小说");this.usedSize = 3;}public Book[] getBooks() {return books;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos,Book book) {this.books[pos] = book;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}@Overridepublic String toString() {return "BookList{" +"books=" + Arrays.toString(books) +'}';}
}

5.3Main包

5.3.1test类
package Main;import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class test {public static User login(){Scanner scanner = new Scanner(System.in);System.out.println("请输入您的姓名:");String name = scanner.nextLine();System.out.println("请选择您的身份:1.管理员 2.普通用户");int choice = scanner.nextInt();while(true){if(choice==1){return new AdminUser(name);}else if(choice==2){return new NormalUser(name);}else{System.out.println("输入错误,请重新输入!!");}}}public static void main(String[] args) {BookList bookList = new BookList();User user = login();while(true) {int choice = user.menu();user.doIoperation(choice, bookList);}}
}

5.4user包

5.4.1User类
package user;import book.BookList;
import book.ioperations.IOperations;public abstract class User {protected String name;public IOperations[] iOperations;public User(String name) {this.name = name;}public abstract int menu();public void doIoperation(int choice, BookList bookList){iOperations[choice].work(bookList);}
}
5.4.2AdminUser类
package user;import java.util.Scanner;import book.ioperations.*;public class AdminUser extends User {public AdminUser(String name) {super(name);this.iOperations = new IOperations[]{new ExitOperations(),new FindOperations(),new AddOperations(),new DeleteOperations(),new ShowOperations()};}public int menu(){System.out.println("********管理员菜单********");System.out.println("1.查找图书 ");System.out.println("2.新增图书 ");System.out.println("3.删除图书 ");System.out.println("4.显示图书 ");System.out.println("0.退出系统 ");System.out.println("************************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");return scanner.nextInt();}
}
5.4.3NormalUser类 
package user;import book.ioperations.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperations = new IOperations[]{new ExitOperations(),new FindOperations(),new BorrowOperations(),new ReturnOperations()};}public int menu(){System.out.println("********用户菜单********");System.out.println("1.查找图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("0.退出系统");System.out.println("***********************");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作:");return scanner.nextInt();}
}

相关文章:

Java实现图书管理系统

一、引言 本篇介绍了一个简易的图书管理系统&#xff0c;面向管理员和普通用户分别给出了不同的菜单&#xff0c;实现了一些基本的图书操作功能&#xff0c;包括图书的增删查改、借阅、归还等 二、图书管理系统框架 图书管理系统&#xff0c;顾名思义&#xff0c;管理的是图…...

使用静态方法接受对象参数

我们先来看一个例子 public class MyInteger { private int value; // 构造函数 public MyInteger(int value) { this.value value; } // 实例方法 public boolean isEven() { return value % 2 0; } // 静态方法接受int参数 public static boolean isEvenStatic…...

cocos creator如何使用cryptojs加解密(及引入方法)

cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密&#xff08;及引入方法&#xff09; 步骤 获取库 1. npm install crypto-js -g&#xff0c;加不加…...

安装台式电脑网卡驱动

安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时&#xff0c;当不知道怎么办时&#xff0c;以下的方法&#xff0c;可以作为一…...

JavaEE-多线程(1)

这篇文章&#xff0c;我们将介绍进程、线程的相关概念以及进程和线程的区别&#xff0c;下篇文章我们将使用Java来编写多线程的代码 进程&#xff1a; 进程&#xff08;Process&#xff09;是操作系统中资源分配的基本单位&#xff0c;它是一个正在运行的程序的实例。进程包括…...

【计算机视觉】人脸算法之图像处理基础知识(五)

图像的几何变换 3.图像的旋转 图像的旋转就是让图像按照某一点旋转到指定的角度。需要确定3个参数&#xff1a;图像的旋转中心、旋转角度和缩放因子。在openv中通过getRotationMatrix2D()函数来实现图像的旋转。 import cv2 import numpy as npimgpath "images/img1.j…...

工业 web4.0 的 UI 风格,独树一帜

工业 web4.0 的 UI 风格&#xff0c;独树一帜...

BSP驱动教程-CAN/CANFD/CANopen知识点总结分享

学习知识点整理&#xff1a; CAN 总线的前世今生&#xff1a; https://www.armbbs.cn/forum.php?modviewthread&tid104480 wikibai百科CAN总线&#xff1a; https://en.wikipedia.org/wiki/CAN_bus 瑞萨CAN入门教程&#xff1a; https://www.armbbs.cn/forum.php?m…...

微服务之远程调用

常见的远程调用方式 RPC&#xff1a;Remote Produce Call远程过程调用&#xff0c;类似的还有 。自定义数据格式&#xff0c;基于原生TCP通信&#xff0c;速度快&#xff0c;效率高。早期的webservice&#xff0c;现在热门的dubbo &#xff08;12不再维护、17年维护权交给apac…...

Opencv数一数有多少个水晶贴纸?

1.目标-数出有多少个贴纸 好久没更新博客了&#xff0c;最近家里小朋友在一张A3纸上贴了很多水晶贴纸&#xff0c;要让我帮他数有多少个&#xff0c;看上去有点多&#xff0c;贴的也比较随意&#xff0c;于是想着使用Opencv来识别一下有多少个。 原图如下&#xff1a; 代码…...

AI Agent智能应用从0到1定制开发(完结)

在数字化时代的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;代理智能应用如同星辰般璀璨&#xff0c;引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用&#xff0c;就像是在无垠的宇宙中绘制一颗新星的轨迹&#xff0c;每一步都充满了挑战与创新的火花。…...

事件驱动架构:新时代的软件设计范式

引言 在现代软件开发中&#xff0c;随着系统复杂度的增加和实时响应需求的提升&#xff0c;传统的单体架构和同步调用模型逐渐显露出其局限性。事件驱动架构&#xff08;Event-Driven Architecture, EDA&#xff09;作为一种高度解耦、灵活性强的架构设计模式&#xff0c;越来…...

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索

文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…...

web前端何去何从:探索未来之路

web前端何去何从&#xff1a;探索未来之路 在数字化浪潮的推动下&#xff0c;web前端技术正经历着前所未有的变革。随着新技术的不断涌现和用户体验的持续提升&#xff0c;web前端开发者们面临着前所未有的挑战与机遇。那么&#xff0c;web前端究竟何去何从&#xff1f;本文将…...

yolov8通过训练完成的模型生成图片热力图--论文需要

源代码来自于网络 使用pytorch_grad_cam&#xff0c;对特定图片生成热力图结果。 安装热力图工具 pip install pytorch_grad_cam pip install grad-cam# get_params中的参数&#xff1a; # weight&#xff1a; # 模型权重文件&#xff0c;代码默认是yolov8m.pt # c…...

Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)

前言&#xff1a;ArrayList是Java中最常用的动态数组实现之一&#xff0c;它提供了便捷的操作接口和灵活的扩展能力&#xff0c;使得在处理动态数据集合时非常方便。本文将深入探讨Java中ArrayList的实现原理、常用操作以及一些使用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨…...

Zadig vs. Jenkins 详细比较

01、Zadig vs. Jenkins&#xff1a;关于时代的选择 最近官方公众号发布了一篇名为 《是时候和 Jenkins 说再见了》的文章&#xff0c;引起了社区的广泛关注和讨论。作为曾经最被广泛使用的持续构建交付工具&#xff0c;Jenkins 的江湖地位似乎被挑战了。评论中有一条被高度点赞…...

航拍无人机像素坐标转世界坐标

一、背景 已知相机参数&#xff08;传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 &#xff09;&#xff0c;在给定像素坐标的前提下&#xff0c;求世界坐标&#xff0c;大部分通过AI来实现&#xff0c;不知道哪个步骤有问题&#xff0c;望大家指正 二、代码…...

Linux系统学习——指令二

Linux系统学习——指令二 sed 指令perl 指令rpm 指令rz 和 sz 指令查看文件大小及压缩文件指令使用tar命令&#xff1a;使用zip命令&#xff1a;注意事项&#xff1a; 解压文件指令 sed 指令 使用sed命令&#xff1a;sed -i s/旧内容/新内容/g 文件名&#xff0c;这将会在文件…...

【逻辑回归】和【线性回归】的区别和联系-九五小庞

逻辑回归&#xff08;Logistic Regression&#xff09;和线性回归&#xff08;Linear Regression&#xff09;是两种常用的统计学习和机器学习技术&#xff0c;它们各自具有特定的应用场景和优势。以下是它们之间的主要区别和联系&#xff1a; 定义与目的 线性回归&#xff1a…...

富格林:正视欺诈阻挠交易被骗

富格林指出&#xff0c;在交易的过程中&#xff0c;投资者们就算做了十分的把握&#xff0c;也难免会出现亏损。因此建议新手投资者&#xff0c;在准备投资时一定要做好充分的准备工作&#xff0c;明辨欺诈陷阱&#xff0c;同时学习正规的做单盈利技巧&#xff0c;这才能帮助我…...

如何在WPS中加载EndNote X9插件

如何在WPS中加载EndNote X9插件 步骤1&#xff1a;关闭WPS 确保所有WPS文档和窗口都已关闭。 步骤2&#xff1a;修改文件后缀 打开文件资源管理器&#xff0c;导航到路径&#xff1a;C:\Program Files (x86)\EndNote X9\Product-Support\CWYW。找到文件 Cwyw_X86.dat&#…...

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1&#xff1a;使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …...

【vue3|第8期】深入理解Vue 3 computed计算属性

日期&#xff1a;2024年6月10日 作者&#xff1a;Commas 签名&#xff1a;(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释&#xff1a;如果您觉得有所帮助&#xff0c;帮忙点个赞&#xff0c;也可以关注我&#xff0c;我们一起成长&#xff1b;如果有不对的地方&#xf…...

《精通ChatGPT:从入门到大师的Prompt指南》附录C:专业术语表

附录C&#xff1a;专业术语表 本附录旨在为读者提供一本全面的术语表&#xff0c;帮助理解《精通ChatGPT&#xff1a;从入门到大师的Prompt指南》中涉及的各种专业术语。无论是初学者还是高级用户&#xff0c;这些术语的定义和解释将为您在使用ChatGPT时提供重要参考。 A AI&…...

YOLOv8可视化界面PYQT5

yolov8&#xff0c;可视化界面pyqt。支持图片检测&#xff0c;视频检测&#xff0c;摄像头检测等&#xff0c;实时显示检测画面。支持自定义数据集&#xff0c;计数&#xff0c;fps展示……,即插即用&#xff0c;无需更改太多代码...

远程代码执行和远程命令执行是一个东西吗

远程代码执行&#xff08;Remote Code Execution&#xff0c;简称RCE&#xff09;和远程命令执行在概念上有所区别&#xff0c;但两者都涉及到攻击者通过远程方式在目标系统上执行代码或命令。以下是两者的详细比较&#xff1a; 定义&#xff1a; 远程代码执行&#xff08;RCE…...

C++ 20新特性之线程与jthread

&#x1f4a1; 如果想阅读最新的文章&#xff0c;或者有技术问题需要交流和沟通&#xff0c;可搜索并关注微信公众号“希望睿智”。 为什么要引入jthread 在C 11中&#xff0c;已经引入了std::thread。std::thread为C标准库带来了一流的线程支持&#xff0c;极大地促进了多线程…...

赶紧收藏!2024 年最常见 20道并发编程面试题(七)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道并发编程面试题&#xff08;六&#xff09;-CSDN博客 十三、什么是线程局部存储&#xff08;Thread-Local Storage&#xff09;&#xff1f; 线程局部存储&#xff08;Thread-Local Storage&#xff0c;简称TLS…...

HAL库开发--第一盏灯

知不足而奋进 望远山而前行 目录 文章目录 前言 学习目标 学习内容 需求 开发流程 项目创建 芯片配置 功能配置 时钟配置 项目配置 编写代码 编译测试 烧录失败解决 ​编辑 总结 前言 在嵌入式系统开发中&#xff0c;掌握HAL库开发流程、STMCubeMX配置过程以及…...