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

news/2024/9/20 7:15:28/ 标签: 学习, java

  所属专栏:Java学习  

在这里插入图片描述

🍁1. 功能演示 

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

🍁2. 类的创建 

🍁2.3 创建图书类

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

java">    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对象,因为在一开始就有了一部分书,所以在创建书架的对象时,就要把图书的对象放进去

java">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 创建用户类 

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

java">public abstract class User {//不同包的子类可以访问protected String name;public User(String name) {this.name = name;}public abstract int menu();
}

来看menu方法的实现 

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

java">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. 功能的实现 

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

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

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

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

之后创建各种功能的接口

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

捋一下现在的逻辑

🍁4. 功能完善

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

🍁4.1 显示图书

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

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

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

java">    public int getUsedSize() {return usedSize;}public Book getBook(int pos) {return books[pos];}public void setBook(int pos, Book book) {this.books[pos] = book;}

显示图书:

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

🍁4.2 查找图书 

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

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

java">public class FindOperation implements IOPeration {@Overridepublic 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

java">public class AddOperation implements IOPeration {@Overridepublic 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 借阅图书 

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

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

java">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 归还图书 

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

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

java">public class ReturnOperation implements IOPeration{@Overridepublic 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删除图书,从系统中移除该图书信息。
  • 实现要点:检查图书是否存在,然后将其从图书数据集合中移除。注意,可能需要先检查图书是否已被借出,并提示用户处理借阅状态。

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

java">public class DeleteOperation implements IOPeration {@Overridepublic 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);//更新currentSizebookList.setUsedSize(currentSize - 1);System.out.println("删除成功");}
}

在这里插入图片描述


http://www.ppmy.cn/news/1511866.html

相关文章

单元测试、系统测试、集成测试知识总结

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff0c;有…

爬取豆瓣TOP250电影详解

一.分析网页DOM树结构 1.分析网页结构及简单爬取 豆瓣&#xff08;Douban&#xff09;是一个社区网站&#xff0c;创立于2005年3月6日。该网站以书影音起家&#xff0c;提供关于书籍、电影、音乐等作品的信息&#xff0c;其作品描述和评论都是由用户提供&#xff08;User-Gen…

【element-ui】 统一全局配置size和z-index属性

Vue.use(Element, { size: small, zIndex: 3000 });参考&#xff1a; element ui 统一全局配置size和z-index属性

使用SSH协议远程连接Ubuntu

1.切换到root用户 sudo -i 2.安装openssh-server apt update apt install openssh-server 3.启动ssh服务 service ssh start 4.查看ssh状态 &#xff08;q键: 退出&#xff09; service ssh status 5.检查ssh服务是否启动成功 ps -e | grep ssh 6.开机自启动 systemctl enable …

Webpack高级配置(干货2)

目录 39.CodeSplit 优化代码运行性能40.CodeSplit按需加载&#xff0c;性能优化41.eslint 不支持动态倒入语法&#xff0c;需要引入import的plugin42.图片&#xff0c;字体等命名规则&#xff0c;可以提取复用43.preload/prefatch 39.CodeSplit 优化代码运行性能 entry由字符串…

libvirt bridge network configure

If you want to configure all the parameters of your virtual machine, you can issue the command like this: virsh edit ubuntu22.04-test In the GUI of NIC configuration, you can choose a configuration item from a drop box,such as “default”,‘bridged-network…

Apache Doris 中Compaction问题分析和典型案例

说明 此文档主要说明一些常见compaction问题的排查思路和临时处理手段。这些问题包括 Compaction socre高Compaction失败compaction占用资源多Compaction core 如果问题紧急&#xff0c;可联系社区同学处理 如果阅读中有问题&#xff0c;可以反馈给社区同学。 1 compaction …

机器学习--常见算法总结

有监督学习算法 1. 线性回归算法 概念&#xff1a;线性回归是一种统计方法&#xff0c;用于预测一个变量&#xff08;因变量&#xff09;与一个或多个自变量&#xff08;特征变量&#xff09;之间的关系。目标是通过线性方程建立自变量和因变量之间的关系模型。 作用&#x…

Linux执行脚本报错:-bash: ./mylife.sh: /bin/sh^M: bad interpreter: Text file busy

这个错误信息 -bash: ./mylife.sh: /bin/sh^M: bad interpreter: Text file busy 实际上包含了两个主要问题&#xff0c;但“Text file busy”这部分通常不是真实的错误&#xff0c;可能是显示错误或者与之前的操作冲突。更常见的问题是前面的 /bin/sh^M&#xff0c;这里的 ^M …

ZooKeeper Watcher 机制详解

ZooKeeper Watcher 机制详解 1、特点2、注册与触发3、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; ZooKeeper 的 Watcher 机制是分布式系统中用于事件通知的重要功能。 1、特点 一次性触发&#xff1a; Watcher 被触发后立即从…

Python自动化测试工具selenium使用指南

概述 selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;相对于另外一款web自动化测试工具QTP来说有如下优点&#xff1a; 免费开源轻量级&#xff0c;不同语言只需要一个体积很小的依赖包支持多种系统&a…

《现代情报》

《现代情报》简介 《现代情报》&#xff08;原名《情报知识》&#xff09;杂志是由吉林省科学技术厅主管&#xff0c;吉林省科学技术信息研究所、中国科学技术情报学会联合主办的信息资源管理领域综合性学术期刊。该刊于1980年创刊&#xff0c;每年12期。重点报道服务于国家战略…

上传文件,文件类型限制语法,各种媒体视频文件的Content-Type

各种媒体视频文件的Content-Type “application/x-apple-diskimage”: “DMG”, “application/epubzip”: “EPUB”, “application/java-archive”: “JAR”, “video/x-matroska”: “MKV”, “text/html”: “HTML|HTM”, “text/css”: “CSS”, “text/javascript…

Ps:首选项 - 单位与标尺

Ps菜单&#xff1a;编辑/首选项 Edit/Preferences 快捷键&#xff1a;Ctrl K Photoshop 首选项中的“单位与标尺” Units & Rulers选项卡允许用户根据工作需求定制 Photoshop 的测量单位和标尺显示方式。这对于保持工作的一致性和精确性&#xff0c;尤其是在跨设备或跨平台…

USB3.2 摘录(四)

系列文章目录 USB3.2 摘录&#xff08;一&#xff09; USB3.2 摘录&#xff08;二&#xff09; USB3.2 摘录&#xff08;三&#xff09; USB3.2 摘录&#xff08;四&#xff09; 文章目录 系列文章目录8 协议层&#xff08;Protocol Layer&#xff09;8.8 三个参数地址信息&…

软考高级第四版备考---第四十一天(软件工程-软件设计)

一、结构化设计 结构化设计&#xff08;Structured Design,SD&#xff09;是一种面向数据流的方法&#xff0c;它以SRS和SA阶段所产生的DFD和数据字典等文档为基础&#xff0c;是一个自顶向下、逐步求精和模块化的过程 二、面向对象设计 2.1面相对象设计&#xff08;OOD&…

Electron 的contextBridge

contextBridge 是 Electron 框架中用于在渲染器进程(通常是 Web 页面)和主进程之间安全地暴露 API 的一种方式。它允许开发者在保持主进程和渲染器进程之间清晰分离的同时,从主进程向渲染器进程安全地传递方法和属性。这是通过创建一个单向的、只能从主进程到渲染器进程的桥…

谷粒商城实战笔记-问题记录-首页没有显示用户名-跨域session问题

文章目录 一&#xff0c;首页无用户信息二&#xff0c;定位三&#xff0c;两个问题1&#xff0c;跨域名session共享 一&#xff0c;首页无用户信息 谷粒商城首页&#xff0c;点击超链接您好&#xff0c;请登录&#xff0c;正常情况下应该跳转到Auth模块的login页面&#xff0c;…

[Day 55] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

區塊鏈的智能合約安全審計 智能合約是一種自動執行合約條款的計算機程式&#xff0c;通常部署在區塊鏈上。這些合約能夠自動執行和驗證協議條件&#xff0c;無需中介機構&#xff0c;因此具有高效性和透明度。然而&#xff0c;由於智能合約一旦部署就無法修改&#xff0c;其安…

遥感之大豆提取

主要记录大豆提取常用的光学以及sar等特征&#xff0c;以便在实验中实现考虑以下特征得到初步结果&#xff0c;在其基础上进行不同维度的优化。 参考文献**<Mapping annual 10-m soybean cropland with spatiotemporal sample migration>** 文档总体描述&#xff1a; …