当前位置: 首页 > 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…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...