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)是两种常用的统计学习和机器学习技术,它们各自具有特定的应用场景和优势。以下是它们之间的主要区别和联系: 定义与目的 线性回归:…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
