基于Java实现的图书管理系统

前言:该图书管理系统实现了查找、添加、删除、显示、借阅、归还等功能,分为两个用户群体:管理者和普通用户。使用了类与对象,封装继承多态,抽象类和接口等Java基础知识。

一.思路

面向对象三部曲:找对象,创建对象,使用对象。

1.找对象

图书馆管理系统中的对象有书和人。人通过一些方法操作书。操作方法是一个集合。

2.创建对象

这里可用使用包将它们整合在一起,人、书和功能各一个包。

书是一个类,还一个类是书架。书中是定义书的各种属性,书架是放书的地方,也是操作书的地方。

人分为两种,一种是管理员,一种是普通用户。创建一个父类将两人共有的属性放在这里,另外创建两个子类扩展父类。

功能这个包里放着各种各样我们实现的包,

3.脉络

 public static void main(String[] args) {BookList bookList=new BookList();//实例化书架,形象的理解为创建了一个图书馆Person person=logic();      //判断这个人是哪一个类,是管理员还是普通用户while(true){int choice=person.menu();person.doFunction(choice,bookList);}}

这是main方法的全部。

我们可以看到,我们先实例化了书架,相当于建立起了一个书架,我们可以在这个书架上对书进行操作。

第二步,通过一个logic方法判断出用户是哪一类。

书架有了,身份有了,接下来就是书架进行操作,也就是下面while循环里的内容。

二.框架的具体实现

1.logic方法的实现

先上代码:

 public static Person logic(){System.out.println("欢迎来的图书管理系统");System.out.println("请输入您的姓名:");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("输入1:管理员  2:普通用户");int choice=scanner.nextInt();if(choice==1){return new Manager(name);}else{return new Normal(name);}}

返回值是我们定义的父类Person。通过输入的选择,用if分出两种情况(这里不是很严谨,没有判别输入其他数字的情况),直接new一个对象返回,new完类也实例化完了。

这样我们就得到了我们要用户身份。

2.person.menu方法的实现

person现在是某一个具体的身份,可以调用其类里的menu方法。

//普通用户
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);int choice= scanner.nextInt();return choice;}
//管理员
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);int choice= scanner.nextInt();return choice;}

通过输入数字来选择我们要进行的操作,并将刚输入的数字作为返回值去返回。

获得具体数字后我们可以进行下面的操作来进行具体的实现。

3.person.doFunction方法的实现

public IFunction[] iFunctions;
public void doFunction(int choice, BookList bookList){iFunctions[choice].work(bookList);}

这是Person类中的内容,可以看到我们先定义了一个接口数组,使用了这个接口中的某一个方法。在一开始实例化两种用户时我们就用构造方法来实现了数组的“赋值”:

//普通用户
public Normal(String name) {super(name);       this.iFunctions = new IFunction[]{new Exit(),new Seek(),new Borrow(),new Back()};}
//管理员
public Manager(String name) {super(name);       this.iFunctions=new IFunction[]{new Exit(),new Seek(),new Add(),new Del(),new Show()};}

这里的顺序对应了menu方法里的顺序,大家可以去上面查看。

4.接口的实现

public interface IFunction {void work(BookList bookList);
}

在接口里写了一个work方法,这个就是上面调用的方法。参数是书架,目的是为了操作书架。

三.功能的具体实现

0.前置内容

每一个具体的功能都通过接口连上了IFunction,都要再次实现work方法

iFunctions[choice].work(bookList);

另外在书架上定义一个int变量来记录书的数量

int size = 0;

1.查阅图书

public void work(BookList bookList) {System.out.println("查找图书");System.out.println("请输入想要查找书的名称:");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int size=bookList.getSize();    //利用BookList类的方法来获得书架上书的数量for(int i=0;i<size;i++){String bname=bookList.getname(i);if(bname.equals(name)){                 //比较字符串System.out.println("书找到了");return ;}}System.out.println("没有这本书");}

bookList.getSize()这个方法是获取现在书架上书的数量,然后进入循环去寻找是否有这本书,比较简单。

2.借阅图书

public void work(BookList bookList) {System.out.println("借阅图书");System.out.println("输入要借阅书的名称:");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int choice=bookList.getSize();for(int i=0;i<choice;i++){String bname= bookList.getname(i);if(bname.equals(name)){bookList.changeType(i,true);         //用人方法要说哪一个bookList.changeSize(-1);System.out.println("借阅成功");return ;}}System.out.println("没有这本书无法借阅");}

借阅图书要实现的细节:

1.把书的属性设置为已借出;2.书架上书的数量减一。

3.归还图书

public void work(BookList bookList) {System.out.println("归还图书");System.out.println("输入要归还书的名称:");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int choice=bookList.getSize();for(int i=0;i<choice;i++){String bname= bookList.getname(i);if(bname.equals(name)){bookList.changeType(i,false);         //用人方法要说哪一个bookList.changeSize(1);System.out.println("归还成功");return ;}}System.out.println("没有这本书无法归还");}

细节方面与上面的借阅相反。

4.新增图书

public void work(BookList bookList) {System.out.println("添加书籍");int choice=bookList.getSize();if(choice==10){System.out.println("书架已满无法继续添加");return;}Scanner scanner=new Scanner(System.in);System.out.println("请输入新增书的名称:");String name=scanner.nextLine();System.out.println("请输入新增书的作者:");String author=scanner.nextLine();System.out.println("请输入新增书的类型:");String type=scanner.nextLine();System.out.println("请输入新增书的价格:");int price=scanner.nextInt();Book newbook=new Book(name,author,price,type);for (int i = 0; i < choice; i++) {String name2=bookList.getname(i);if(newbook.equals(name2)){System.out.println("书架上已经有这本书了");return ;}}bookList.setBooks(choice,newbook);bookList.setSize(choice+1);System.out.println("添加成功");}

5.删除图书

 public void work(BookList bookList) {System.out.println("删除书籍");Scanner scanner=new Scanner(System.in);System.out.println("输入要删除的书的名称");String name=scanner.nextLine();int choice=bookList.getSize();int i = 0;int flag=-1;for (; i < choice; i++) {String bname=bookList.getname(i);if(bname.equals(name)){flag=i;break;}}if(i==choice){System.out.println("没有这本书");return ;}for (int j = flag; j < choice-1; j++) {Book book = bookList.getBooks(j+1);bookList.setBooks(j,book);}bookList.setBooks(choice-1,null);bookList.setSize(choice-1);System.out.println("删除成功");}

6.退出系统

public void work(BookList bookList) {System.out.println("成功退出系统");System.exit(0);}

四.总结

以上功能的实现不是最主要的,代码的框架是最主要的。怎么实现一个图书管理系统,它的整个脉络是怎样的,这是重要的。上述功能代码的实现可能有不严谨的地方,大家可以自行修改。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OrangePi_Kunpeng_Pro开发板测验——性能巨人

文章目录 &#x1f4d1;前言一、开箱初体验的愉悦二、产品规格概述三、前置工作四、性能测试4.1 CPU 性能测试4.1.1 单线程 CPU 测试4.1.2 多线程 CPU 测试 4.2 内存性能测试4.2.1 内存读写性能测试4.2.2 高负载内存测试 4.3 I/O 性能测试4.4 网络性能测试4.5 测试小结4.5.1 CP…

基于异构图的大规模微服务系统性能问题诊断

简介&#xff1a;本文介绍由南开大学、清华大学、腾讯、国家超级计算天津中心共同合作的论文&#xff1a;基于异构图的大规模微服务系统性能问题诊断。该论文已被IEEE Transactions on Services Computing期刊录用 论文标题&#xff1a;Diagnosing Performance Issues for Lar…

docker删除所有容器

笔记 要使用 Docker 删除所有容器&#xff08;无论是停止的还是正在运行的&#xff09;&#xff0c;可以按照以下步骤操作&#xff1a; 1. **删除所有正在运行的容器**&#xff1a; 首先&#xff0c;您需要停止所有正在运行的容器。可以使用以下命令&#xff1a; dock…

MATLAB分类与判别模型算法:K-近邻法(KNN)分类代码 【含Matlab源码 MX_001期】

算法简介&#xff1a; K-近邻法&#xff08;KNN&#xff09;是一种简单而有效的分类算法&#xff0c;也可用于回归问题。它的基本原理是根据待分类样本与训练样本的距离&#xff0c;选取最近的K个样本进行投票决定分类。该算法无需训练过程&#xff0c;而是利用训练数据集直接…

小白windows系统从零开始本地部署大模型全记录

大家好&#xff0c;最近两年大语言模型风靡全球&#xff0c;最近&#xff0c;不少开源大模型&#xff0c;将模型部署到自己的电脑上&#xff0c;用个性化的数据微调想必是不少人的愿望&#xff0c;这次&#xff0c;让我来分享从hugging face上下载部署chatglm3-6b中的经验。 1.…

自动控制: 最小二乘估计(LSE)、加权最小二乘估计(WLS)和线性最小方差估计

自动控制&#xff1a; 最小二乘估计&#xff08;LSE&#xff09;、加权最小二乘估计&#xff08;WLS&#xff09;和线性最小方差估计 在数据分析和机器学习中&#xff0c;参数估计是一个关键步骤。最小二乘估计&#xff08;LSE&#xff09;、加权最小二乘估计&#xff08;WLS&…

wifi贴码推广哪家靠谱?

如今越来越多的人想轻资产创业&#xff0c;WIFI贴码是共享行业最无成本的创业项目了&#xff0c;而在选择厂商的时候&#xff0c;大家就想要知道哪家公司靠谱&#xff0c;更好、更便宜、可靠。那么wifi贴码推广哪家靠谱&#xff1f;别急&#xff0c;下面小编将带你一起了解。 目…

OpenAI开始训练新的前沿模型——但GPT-5至少在90天内不会推出

ChatGPT 制造商 OpenAI 今早宣布&#xff0c;已开始训练其新的“前沿模型”&#xff0c;并成立了一个新的安全委员会&#xff0c;由现任董事会成员 Bret Taylor&#xff08;OpenAI 董事会主席兼客户服务初创公司 Sierra AI 联合创始人、前谷歌地图负责人和前 Facebook 首席技术…

BGP路由策略实验

一、实验拓扑 二、IP分配(骨干) R1&#xff1a; 0/0/0 15.0.0.1 24 0/0/1 18.0.0.2 24 0/0/2 19.0.0.1 24 R2: 0/0/0 16.0.0.1 24 0/0/1 15.0.0.2 24 R3: 0/0/0 17.0.0.2 24 0/0/1 18.0.0.1 24 R4: 0/0/0 16.0…

元宇宙vr工业产品展示空间降低研发成本

元宇宙产品虚拟展厅搭建编辑器为您提供了一个自助式元宇宙场景搭建的绝佳平台。无论您是设计公司、摄影公司、营销公司还是教育机构&#xff0c;我们都能为您量身打造专属的元宇宙解决方案&#xff0c;满足您的多样化需求。 元宇宙产品虚拟展厅搭建编辑器具备强大的3D编辑功能&…

【吊打面试官系列】Java高并发篇 - ThreadLocal 是什么?有什么用?

大家好&#xff0c;我是锋哥。今天分享关于 【ThreadLocal 是什么&#xff1f;有什么用&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; ThreadLocal 是什么&#xff1f;有什么用&#xff1f; ThreadLocal 是一个本地线程副本变量工具类。主要用于将私有线程和该…

dust3r部署踩坑全记录

目前dust3r是三维重建最新最好的技术&#xff0c;运用了ViT编码器、Transformer、注意力机制、回归等技术&#xff0c;无需相机参数标定。 但是我部署过程中有很多坑&#xff0c;记录一下。 1.OSError: CUDA_HOME environment variable is not set. Please set it to your CU…

数字工厂管理系统可以和哪些软件集成

随着工业4.0时代的到来&#xff0c;数字工厂管理系统已成为制造业转型升级的核心驱动力。数字工厂管理系统通过集成各种软件和技术&#xff0c;实现了生产过程的数字化、网络化和智能化&#xff0c;大大提高了生产效率和管理水平。本文将探讨数字工厂管理系统可以与哪些软件集成…

Axure RP软件汉化操作步骤

随着互联网产业的发展&#xff0c;设计师已经成为一个越来越受欢迎的职业&#xff0c;设计软件已经成为设计师必不可少的工具。说到设计软件&#xff0c;不得不说的是 Axure rp &#xff0c;越来越多的设计师使用它来设计产品原型&#xff0c;作为美国 Axure Software Solution…

OrangePi Kunpeng Pro体验——安装Hass与驱动SPI小屏幕

OrangePi Kunpeng Pro 是一款面向开发者和爱好者的高性能开发板。在本次测评中&#xff0c;主要将以前的一些代码在该开发板上实现&#xff0c;包括docker部署hass&#xff0c;引脚驱动SPI小屏幕。中间遇到了一些小小问题&#xff0c;但都成功了&#xff0c;一起来试试吧~ 一、…

删除中间节点

题目链接 删除中间节点 题目描述 注意点 node既不是链表头节点&#xff0c;也不是链表尾节点 解答思路 将当前节点的值替换为下一个节点的值&#xff0c;并将当前节点的next指针设置为下一个节点的next指针&#xff0c;可以理解为删除了当前节点 代码 /*** Definition f…

考研计组chap1计算机系统概述

目录 一、计算机发展历程(不考了) 二、计算机硬件的基本组成 3 1.五个部分 &#xff08;1&#xff09;输入设备 &#xff08;2&#xff09;控制器 &#xff08;3&#xff09;运算器 &#xff08;4&#xff09;&#xff08;主&#xff09;存储器 &#xff08;5&#xff0…

被忽视的模块化领域:聚合、结算与执行层

原文标题&#xff1a;《Aggregation, settlement, execution》撰文&#xff1a;Bridget Harris 编译&#xff1a;Chris&#xff0c;Techub News 在关注度和创新方面&#xff0c;模块化堆栈的各个部分并不一样&#xff0c;虽然之前有许多项目在数据可用性&#xff08;DA&#xf…

[AI OpenAI] OpenAI董事会成立安全与保障委员会

这个新委员会负责就所有OpenAI项目的关键安全和保障决策提出建议&#xff1b;在90天内提出建议。 今天&#xff0c;OpenAI董事会成立了一个由主席Bret Taylor、Adam D’Angelo、Nicole Seligman和Sam Altman&#xff08;CEO&#xff09;领导的安全与保障委员会。该委员会将负责…

虹科Pico汽车示波器 | 免拆诊断案例 | 2017款吉利帝豪GL车发动机偶尔无法起动

故障现象  一辆2017款吉利帝豪GL车&#xff0c;搭载JLC-4G18发动机和手动变速器&#xff0c;累计行驶里程约为39.3万km。车主反映&#xff0c;该车发动机偶尔无法起动。故障发生频率比较频繁&#xff0c;冷机状态下故障比较容易出现。 故障诊断  接车后试车&#xff0c;故…