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类,需要重写父类的方法,并实现自己菜单的打印
- 查找图书
- 新增图书
- 删除图书
- 显示图书
- 退出系统
3.2普通用户菜单
新建一个NormalUser类,继承User类,需要重写父类的方法,并实现自己菜单的打印
- 查找图书
- 借阅图书
- 归还图书
- 退出系统
四、图书管理系统功能
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实现图书管理系统
一、引言 本篇介绍了一个简易的图书管理系统,面向管理员和普通用户分别给出了不同的菜单,实现了一些基本的图书操作功能,包括图书的增删查改、借阅、归还等 二、图书管理系统框架 图书管理系统,顾名思义,管理的是图…...
使用静态方法接受对象参数
我们先来看一个例子 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加解密(及引入方法) 如果想转请评论留个言并注明原博 Sclifftop 13805064305 阿浚 cocos creator如何使用cryptojs加解密(及引入方法) 步骤 获取库 1. npm install crypto-js -g,加不加…...

安装台式电脑网卡驱动
安装电脑网卡驱动 1. 概述2. 具体方法2.1 先确定主板型号2.2 详细操作步骤如下2.2.1 方法一2.2.2 方法二2.2 主流主板官网地址 结束语 1. 概述 遇到重装系统后、或者遇到网卡驱动出现问题没有网络时,当不知道怎么办时,以下的方法,可以作为一…...
JavaEE-多线程(1)
这篇文章,我们将介绍进程、线程的相关概念以及进程和线程的区别,下篇文章我们将使用Java来编写多线程的代码 进程: 进程(Process)是操作系统中资源分配的基本单位,它是一个正在运行的程序的实例。进程包括…...

【计算机视觉】人脸算法之图像处理基础知识(五)
图像的几何变换 3.图像的旋转 图像的旋转就是让图像按照某一点旋转到指定的角度。需要确定3个参数:图像的旋转中心、旋转角度和缩放因子。在openv中通过getRotationMatrix2D()函数来实现图像的旋转。 import cv2 import numpy as npimgpath "images/img1.j…...

工业 web4.0 的 UI 风格,独树一帜
工业 web4.0 的 UI 风格,独树一帜...
BSP驱动教程-CAN/CANFD/CANopen知识点总结分享
学习知识点整理: CAN 总线的前世今生: https://www.armbbs.cn/forum.php?modviewthread&tid104480 wikibai百科CAN总线: https://en.wikipedia.org/wiki/CAN_bus 瑞萨CAN入门教程: https://www.armbbs.cn/forum.php?m…...

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

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

AI Agent智能应用从0到1定制开发(完结)
在数字化时代的浪潮中,人工智能(AI)代理智能应用如同星辰般璀璨,引领着技术革新的潮流。从零开始定制开发一款AI Agent智能应用,就像是在无垠的宇宙中绘制一颗新星的轨迹,每一步都充满了挑战与创新的火花。…...
事件驱动架构:新时代的软件设计范式
引言 在现代软件开发中,随着系统复杂度的增加和实时响应需求的提升,传统的单体架构和同步调用模型逐渐显露出其局限性。事件驱动架构(Event-Driven Architecture, EDA)作为一种高度解耦、灵活性强的架构设计模式,越来…...

【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索
文章目录 引言机器学习与物流科技的基本概念机器学习概述监督学习无监督学习强化学习 物流科技概述路径优化车辆调度需求预测 机器学习与物流科技的融合应用实时物流数据分析数据预处理特征工程 路径优化与优化模型训练模型评估 车辆调度与优化深度学习应用 需求预测与优化强化…...
web前端何去何从:探索未来之路
web前端何去何从:探索未来之路 在数字化浪潮的推动下,web前端技术正经历着前所未有的变革。随着新技术的不断涌现和用户体验的持续提升,web前端开发者们面临着前所未有的挑战与机遇。那么,web前端究竟何去何从?本文将…...

yolov8通过训练完成的模型生成图片热力图--论文需要
源代码来自于网络 使用pytorch_grad_cam,对特定图片生成热力图结果。 安装热力图工具 pip install pytorch_grad_cam pip install grad-cam# get_params中的参数: # weight: # 模型权重文件,代码默认是yolov8m.pt # c…...

Java数据结构之ArrayList(如果想知道Java中有关ArrayList的知识点,那么只看这一篇就足够了!)
前言:ArrayList是Java中最常用的动态数组实现之一,它提供了便捷的操作接口和灵活的扩展能力,使得在处理动态数据集合时非常方便。本文将深入探讨Java中ArrayList的实现原理、常用操作以及一些使用场景。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨…...

Zadig vs. Jenkins 详细比较
01、Zadig vs. Jenkins:关于时代的选择 最近官方公众号发布了一篇名为 《是时候和 Jenkins 说再见了》的文章,引起了社区的广泛关注和讨论。作为曾经最被广泛使用的持续构建交付工具,Jenkins 的江湖地位似乎被挑战了。评论中有一条被高度点赞…...
航拍无人机像素坐标转世界坐标
一、背景 已知相机参数(传感器宽度和高度、图像宽度和高度、焦距、相对航高、像主点坐标 ),在给定像素坐标的前提下,求世界坐标,大部分通过AI来实现,不知道哪个步骤有问题,望大家指正 二、代码…...
Linux系统学习——指令二
Linux系统学习——指令二 sed 指令perl 指令rpm 指令rz 和 sz 指令查看文件大小及压缩文件指令使用tar命令:使用zip命令:注意事项: 解压文件指令 sed 指令 使用sed命令:sed -i s/旧内容/新内容/g 文件名,这将会在文件…...
【逻辑回归】和【线性回归】的区别和联系-九五小庞
逻辑回归(Logistic Regression)和线性回归(Linear Regression)是两种常用的统计学习和机器学习技术,它们各自具有特定的应用场景和优势。以下是它们之间的主要区别和联系: 定义与目的 线性回归:…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...
基于鸿蒙(HarmonyOS5)的打车小程序
1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...

Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
深度解析:etcd 在 Milvus 向量数据库中的关键作用
目录 🚀 深度解析:etcd 在 Milvus 向量数据库中的关键作用 💡 什么是 etcd? 🧠 Milvus 架构简介 📦 etcd 在 Milvus 中的核心作用 🔧 实际工作流程示意 ⚠️ 如果 etcd 出现问题会怎样&am…...