基于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,一经查实,立即删除!

相关文章

oracle数据库查看各类文件的位置

select name from v$controlfile; --控制文件 &#xff08;一般以.ctl结尾&#xff09; select file_name from dba_data_files; --数据文件 &#xff08;一般以.dbf或.ora结尾&#xff09; select file_name from dba_temp_files; --临时文件&#xff08;一般以.d…

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…

ECMAScript简介

前言 ECMAScript&#xff08;通常简称为ES&#xff09;由ECMA国际标准化组织制定的一种脚本语言标准&#xff0c;Netscape最初开发的JavaScript演变而来。ECMAScript为JavaScript提供了基础语言结构和功能。最初设计成一种脚本语言&#xff0c;用来服务Web。作为脚本语言ES同时…

CF1148C C. Crazy Diamond

题目链接 题意&#xff1a;给定一个数组p长度为n按照规则对下标满足2 * abs(i - j) > n进行交换&#xff0c;最后使数组不递减。输出用的交换次数和每次交换的下标。&#xff08;交换次数不能超过5*n次&#xff09; 题解&#xff1a; 默认i < j,否则交换 abs(i - j) &…

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

简介&#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;而是利用训练数据集直接…

数据结构与算法-反转单链表

数据结构与算法-反转单链表 大家好&#xff0c;欢迎回到我们的算法学习系列。今天&#xff0c;我们将探讨一个在算法面试中非常经典的问题——反转单链表。 什么是单链表&#xff1f; 在介绍问题之前&#xff0c;我们先简单了解一下单链表。单链表是一种线性数据结构&#x…

气缸前端锁紧技术探讨:从四个方面、五个方面、六个方面和七个方面深度解析

气缸前端锁紧技术探讨&#xff1a;从四个方面、五个方面、六个方面和七个方面深度解析 在工业自动化领域&#xff0c;气缸作为关键的执行元件&#xff0c;其前端锁紧技术的稳定性与可靠性直接影响到整个系统的运行效率。本文将从四个方面、五个方面、六个方面和七个方面&#…

python 面对对象 类 补充

isinstance isinstance()&#xff1a;判断一个实例化对象是否属于这个类的&#xff0c;isinstance(对象&#xff0c;类) class Man():passclass Women():passa Man()print(isinstance(a, Man)) # True print(isinstance(a, Women)) # False 类的属性操作 getattr() 获…

小白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&…

conda环境里安装ffmpeg

遇到的问题 在执行脚本的时候提示&#xff1a; /home/xxx/anaconda3/envs/llm-asr/lib/python3.9/site-packages/pydub/utils.py:170: RuntimeWarning: Couldnt find ffmpeg or avconv - defaulting to ffmpeg, but may not workwarn("Couldnt find ffmpeg or avconv - …

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编辑功能&…

蓝牙设备中的UUID

文章目录 一、Device UUID二、Service UUID 一、Device UUID Device UUID也可以被称作为DeviceID。 Android 设备上扫描获取到的 deviceId 为外围设备的 MAC 地址&#xff0c;相对固定。iOS 设备上扫描获取到的 deviceId 是系统根据外围设备 MAC 地址及发现设备的时间生成的 …

如何成为AI工程师

AI工程师&#xff08;不是打标员&#xff09;已经成为新一代的热门岗位&#xff08;高薪、有前景&#xff09;&#xff0c;无论你是计算机科学专业的学生&#xff0c;还是已经在其他技术领域工作的专业人士&#xff0c;可以通过以下几点来大概了解如何成为AI工程师。 1. 技术技…

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

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