图书管理系统——Java版

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏:JavaSE

顺序表的学习,点我 

目录

图书管理系统菜单

基本框架:

书:

书架: 

用户: 

实现基本功能 

新增图书:

借阅图书:

删除图书: 

退出系统: 

查找图书: 

归还图书: 

显示图书:


图书管理系统菜单

上面是根据选择不同用户,从而弹出的不同菜单。 

基本框架:

先把大的框架搭建出来。这里我们要用到三个对象:书、书架、用户。

书:

一些基本属性:

public class Book {private String name; // 书名private String author; // 作者private int price; // 价格private String type; // 类型private int count; // 数量private int lentCount; // 被借出的数量
}

用到private是为了防止所有人都可以拿到这些属性并且修改。

构造方法:

public Book(String name, String author, int price, String type, int count) {// 书一直在图书馆中,只有当新增或者删除才变动。而新增的书并不会一下子就被借出// 因此不需要初始化被借出的数量this.name = name;this.author = author;this.price = price;this.type = type;this.count = count;}

构造方法是为了在创建一个书的实例(新增)时初始化书的。 

getter 、setter 方法:

// 下面这些方法是用来修改书的状态的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 int getCount() {return count;}public void setCount(int count) {this.count = count;}public int getLentCount() {return lentCount;}public void setLentCount(int lentCount) {this.lentCount = lentCount;}

通过getter、setter方法来访问和修改书的属性。

重写toString 方法:

// 重写toString方法,以便于更好的打印@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", count=" + count +", lentCount=" + lentCount +'}';}

我们后面在查找和显示书时,要把书的全部信息给都给打印出来,因此得重写toString 方法。

书架: 

属性: 

public class BookList {// 书架里面原本应该有书才对// 书架是用来存放和管理书籍的,可以用顺序表(数组)来写private Book[] books = new Book[10]; // 为了方便,只放了3本书private int usedSize; // 书架已经使用的长度
}

getter、setter 方法:

    public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}

构造方法:

    // 初始化3本书public void func() {this.books[0] = new Book("Head First Java","Kathy Sierra 、 Bert Bates",79, "计算机", 100);this.books[1] = new Book("Java 核心技术 卷I","Cay S. Horstmann",119, "计算机", 100);this.books[2] = new Book("大话数据结构","程杰", 59, "计算机", 100);this.usedSize = 3;}public BookList() {this.func();}

构造方法用来初始化书架的,也就是创建书的实例放到书架上。

用户: 

    public abstract class User{protected String name; // 因为这个name其子类也得使用public User(String name) {this.name = name;}

因为用户有两种,所以User肯定不能知道是哪一种。因此就用抽象类来写。

普通用户:

public class RegularUsers extends User{public RegularUsers(String name) {super(name);}
}

管理员用户: 

public class Administrators extends User{public Administrators(String name) {super(name);}
}

对象创建完毕,接下来就要开始让对象之间进行交互了。

前面我们看到了,不同的用户,根据选择的不同,会弹出不同功能菜单。这个有没有一种很熟悉的感觉,没错这就是我们在前面学习的多态。接下来就是要找多态的条件了:子类对象给到父类引用;子类重写父类当中的方法;通过父类引用调用被重写的方法。在上面的分析中,只有用户之间存在父子类关系。那么我们就可以在设计菜单时,根据选择的不同返回不同的用户对象。返回值就用父类接收,父类在调用功能菜单时,根据是哪一个子类,从而会调用不同的菜单。

登录菜单:

    public static User login() {System.out.print("请输入您的姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();System.out.println("请选择您的身份:1. 管理员;2. 普通用户");int n = scanner.nextInt();// 根据选择的不同,弹出不同的界面 (这里我们就可以采用多态的方式来写)while (true) {if (n == 1) {System.out.println("登录成功!");// 如果是管理员就返回管理员对象return new Administrators(name);}else if (n == 2) {System.out.println("登录成功!");// 如果是普通用户就返回普通用户对象return new RegularUsers(name);}else {System.out.println("登录失败,请重新选择您的身份!");n = scanner.nextInt();}}}

Main 方法: 

    public static void main(String[] args) {// 系统登录User user = login();// 创建一个书架BookList bookList = new BookList();while (true) {// 登录之后,就可以根据前面的选择弹出不同身份的界面int choice = user.menu();// 根据返回的选择,进行不同对象的不同的操作// 对象已经确定了,接下来,就是进行不同的操作。// 因为不同的对象包含不同的操作,所以我们可以把这个操作分成一个数组放到不同的类中user.work(choice, bookList); // 操作的对象是书架,因此传入书架}}

根据我们在功能页面的选择,来返回不同的值。接着调用work方法来实现不同的功能。这里同样运用了多态的思想。那么父类和子类同样都要有work方法。 

父类:

public abstract class User{protected String name; // 因为这个name其子类也得使用public User(String name) {this.name = name;}public abstract int menu();public abstract void work(int choice , BookList bookList);
}

子类:

public class RegularUsers extends User{protected IWork[] iWorks;public RegularUsers(String name) {super(name);// 注意顺序,要和功能菜单一致this.iWorks = new IWork[]{new Exit(), new FindBook(), new BorrowBook(), new ReturnBook()};}@Overridepublic int menu() {System.out.println("*** 普通用户菜单 ***");System.out.println("1. 查找图书");System.out.println("2. 借阅图书");System.out.println("3. 归还图书");System.out.println("0. 退出系统");System.out.println("******************");System.out.print("请选择您要进行的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}public void work(int choice, BookList bookList) {// 通过对应的参数执行对应的操作iWorks[choice].work(bookList);}
}
public class Administrators extends User{IWork[] iWorks;@Overridepublic 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("******************");System.out.print("请选择您要进行的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}public Administrators(String name) {super(name);// 注意顺序,要和功能菜单一致this.iWorks = new IWork[]{new Exit(), new FindBook(), new AddBooks(), new DelBook(), new ShowBook()};}@Overridepublic void work(int choice, BookList bookList) {iWorks[choice].work(bookList);}
}

因为操作是根据选择来分配的,也是可以用数组来进行接收,并且执行的。 

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

 上面是一个IWork的接口,为了实现用数组接收,并且更好的管理各种功能。

实现基本功能 

下面就是实现各种基本的功能了。

新增图书:

public class AddBooks implements IWork {@Overridepublic void work(BookList bookList) {System.out.println("正在新增图书...");// 其实就是在这个顺序表的数组中新增了一个元素// 首先,得判断这个数组是否已经满了// 使用的长度如果等于书架的长度了,就需要增加书架的长度了if (bookList.getBooks().length == bookList.getUsedSize()) {System.out.println("书架已满,正在新增书架空间,请稍后...");// 创建一个新的数组Book[] newArray = Arrays.copyOf(bookList.getBooks(),2*bookList.getBooks().length);bookList.setBooks(newArray);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();System.out.println("请输入要新增的书的数量:");int count = scanner.nextInt();// 判断该书是否已经存在。若已存在,只需把书的数量加上即可for (int i = 0; i < bookList.getUsedSize(); i++) {if (bookList.getBooks()[i].getName().equals(name)) {System.out.println("该书已经存在了,因此增加数量即可");bookList.getBooks()[i].setCount(count + bookList.getBooks()[i].getCount());return;}}// 相当于 Books[4] = new Book(name, author, price, type, count);bookList.getBooks()[bookList.getUsedSize()] = new Book(name, author, price, type, count);bookList.setUsedSize(bookList.getUsedSize()+1);System.out.println("新增成功!");}
}

注意:Java中没有直接让数组空间大的方法,只能是拷贝一份比原来空间更大的数组。

借阅图书:

public class BorrowBook implements IWork{@Overridepublic void work(BookList bookList) {System.out.println("正在借阅图书...");System.out.println("请输入您要借阅的书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {if (bookList.getBooks()[i].getName().equals(name)) {bookList.getBooks()[i].setLentCount(bookList.getBooks()[i].getLentCount()+1);System.out.println("书籍已自动发放到您的账户中,请注意查收!");return;}}System.out.println("对不起!暂时没有您要找的书,书库会尽快更新哦~");}
}

借阅图书就是把书架上的书的属性修改一下即可。

删除图书: 

public class DelBook implements IWork{@Overridepublic void work(BookList bookList) {System.out.println("正在删除图书...");System.out.println("请输入您要删除的书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();// 注意这里查找与删除的范围for (int i = 0; i < bookList.getUsedSize(); i++) {if (bookList.getBooks()[i].getName().equals(name)) {for (int j = i; j < bookList.getUsedSize()-1 ; j++) {bookList.getBooks()[j] = bookList.getBooks()[j+1];}bookList.setUsedSize(bookList.getUsedSize()-1);System.out.println("删除成功!");return;}}System.out.println("对不起!没有您要删除的书");}
}

删除图书本质就是让有效的长度变小,并且让后面的元素覆盖前面的元素。

退出系统: 

public class Exit implements IWork{@Overridepublic void work(BookList bookList) {System.out.println("正在退出图书管理系统...");System.exit(0);}
}

JavaAPI中提供了一个方法可以直接强制停止程序(正常停止),就是System.exit(0),参数一定要是0才行。这会立即终止当前Java虚拟机,其中的参数0表示正常退出状态。但请注意,除非确实需要立即终止整个JVM(比如在命令行应用中),否则通常建议让程序自然执行到结束而不是使用上面的方法,以允许JVM进行清理工作。

查找图书: 

public class FindBook implements IWork {@Overridepublic void work(BookList bookList) {System.out.println("正在查找图书...");System.out.println("请输入您要查找的书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {if (bookList.getBooks()[i].getName().equals(name)) {System.out.println("下面是您要查找的书籍的相关信息:");System.out.println(bookList.getBooks()[i]);return;}}System.out.println("对不起!暂时没有您要找的书,书库会尽快更新哦~");}
}

查找图书就是遍历整个数组即可。

归还图书: 

 

public class ReturnBook implements IWork{@Overridepublic void work(BookList bookList) {System.out.println("正在归还图书...");System.out.println("请输入您要归还的书名:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for (int i = 0; i < bookList.getUsedSize(); i++) {if (bookList.getBooks()[i].getName().equals(name)) {bookList.getBooks()[i].setLentCount(bookList.getUsedSize()-1);System.out.println("归还成功!欢迎再次借书~");return;}}System.out.println("对不起!暂时没有您要归还的书~");}
}

显示图书:

public class ShowBook implements IWork {@Overridepublic void work(BookList bookList) {System.out.println("正在显示图书...");for (int i = 0; i < bookList.getUsedSize(); i++) {System.out.println(bookList.getBooks()[i]);}}
}

这里的显示图书,是显示所有图书,如果要显示单本图书,就是用查找图书的方法。

以上就是图书系统的基本功能啦!

这个图书系统是基于顺序表来实现的,如果有不懂的话,可以去看看那篇顺序表的博客(文章最前面)。

由于文件太多,不好全部把这些代码全部拷贝过来。

注意:上面的代码直接拷贝到编译器会报错的,因为没有导包,基本框架和IWork都是单独在包中的,Main方法是在源文件中单独存在的,并没有放入包中。

好啦!注意事项也讲完了,图书管理系统也基本实现啦!本期文章就到此结束啦!我们下一期再一起学习吧!

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

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

相关文章

数字化转型必备:营销策划流程图,打造你的数字市场地图

制作营销策划流程图是一个系统化的过程&#xff0c;它可以帮助你清晰地规划和展示营销活动的各个阶段。 以下是制作营销策划流程图的步骤&#xff1a; 1.确定营销目标&#xff1a; 明确你的营销活动旨在实现的具体目标&#xff0c;比如提升品牌知名度、增加销售额、吸引新客…

Java进阶学习笔记25——Objects类

为啥比较两个对象是否相等&#xff0c;要用Objects的equals方法&#xff0c;而不是用对象自己的equals方法来解决呢&#xff1f; Objects&#xff1a; Objects类是一个工具类&#xff0c;提供了很多操作对象的静态方法供我们使用。 package cn.ensource.d14_objects;import ja…

Hadoop概览以及编译hadoop说明

一、Hadoop概述 Hadoop 是一个用于跨计算机集群存储和处理大型数据集的软件框架。它旨在处理大数据&#xff0c;即传统数据库无法有效管理的极其庞大和复杂的数据集。Hadoop不是传统意义上的数据仓库&#xff0c;因为它们的用途不同&#xff0c;架构也不同。Hadoop 是一个跨分布…

Vue2基础及其进阶面试(二)

vue2的生命周期 删除一些没用的 App.vue 删成这个样子就行 <template><router-view/></template><style lang"scss"></style>来到路由把没用的删除 import Vue from vue import VueRouter from vue-router import HomeView from .…

JAVASE之类和对象(2)

哪怕犯错&#xff0c;也不能什么都不做。 主页&#xff1a;趋早–Step 专栏&#xff1a;JAVASE gitte:https://gitee.com/good-thg 接上部分&#xff0c;我们继续来学习JAVAEE类和对象。 引言&#xff1a; 这篇文章接上一篇&#xff0c;后半部分&#xff0c;结束类和对象 目录 …

Spring Boot 3.0:未来企业应用开发的基石

文章目录 一、Spring Boot 3.0的核心特性二、Spring Boot 3.0的优势三、如何在项目中应用Spring Boot 3.01.更新项目依赖2.调整代码结构3.测试和部署 《学习Spring Boot 3.0》内容简介作者简介目录内容介绍 随着技术的飞速发展&#xff0c;企业应用开发的需求也在不断演变。Spr…

爽!AI手绘变插画,接单赚爆了!

我最近发现一款名叫Hyper-SD15-Scribble的AI项目&#xff0c;可以实现一键手绘变插画的功能&#xff0c;而且它搭载了字节出品的超快速生成图片的AI大模型Hyper-SD15&#xff0c;可以实现几乎实时生成图片&#xff0c;有了它&#xff0c;拿去接一些手绘商单分分钟出图&#xff…

跟TED演讲学英文:How to escape education‘s death valley by Sir Ken Robinson

How to escape education’s death valley Link: https://www.ted.com/talks/sir_ken_robinson_how_to_escape_education_s_death_valley Speaker: Sir Ken Robinson Date: April 2013 文章目录 How to escape educations death valleyIntroductionVocabularySummaryTranscri…

WPF学习日常篇(一)--开发界面视图布局

接下来开始日常篇&#xff0c;我在主线篇&#xff08;正文&#xff09;中说过要介绍一下我的界面排布&#xff0c;科学的排布才更科学更有效率的进行敲代码和开发。日常篇中主要记录我的一些小想法和所考虑的一些细节。 一、主界面设置 主界面分为左右两部分&#xff0c;分为…

有什么免费视频翻译软件?安利5款视频翻译软件给你

随着“跨文化交流”话题的热度不断攀升&#xff0c;越来越多的视频内容跨越国界&#xff0c;触及全球观众。 在这一趋势下&#xff0c;视频翻译行业迎来了巨大的发展机遇。然而&#xff0c;面对众多的视频翻译工具&#xff0c;如何挑选出最合心意的那款呢&#xff1f; 现在&a…

【C++】从零开始构建红黑树

送给大家一句话&#xff1a; 日子没劲&#xff0c;就过得特别慢&#xff0c;但凡有那么一点劲&#xff0c;就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 &#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b; ⛰️⛰️…

matlab使用教程(78)—控制颜色图范围

1.控制颜色图范围 对于您创建的许多类型的可视化图形&#xff0c;MATLAB 默认将完整的数据范围映射到颜色图上。数据中的最小值映射到颜色图中的第一行&#xff0c;最大值映射到颜色图中的最后一行。所有中间值线性映射到颜色图的中间行。 这种默认映射适用于大部分情况&#x…

auto关键字(C++11)

auto关键字&#xff08;C11&#xff09; 文章目录 auto关键字&#xff08;C11&#xff09;前言一、auto使用规则二、auto不适用的场景三、auto推荐适用的场景总结 前言 在C11中&#xff0c;auto关键字能够自动推导出变量的实际类型&#xff0c;可以帮助我们写出更加简洁、现代…

【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串

【LeetCode刷题】Day 7 题目1&#xff1a;209.长度最小的子数组思路分析&#xff1a;思路1&#xff1a;暴力枚举 O(N^2^)思路2&#xff1a;滑动窗口 O(N) 题目2&#xff1a;3. 无重复字符的最长子串题目分析&#xff1a;思想1&#xff1a;暴力枚举哈希表O(N^2^)思想2&#xff1…

【C语言】八进制、十六进制

前言 在我们日常生活中使用的数往往是十进制的&#xff0c;而当我们学习C语言后我们会接触到许多不同的进制并且时常需要去思考与使用这些不同的进制&#xff08;尤其是2的幂相关的进制&#xff0c;因为这种计数系统比十进制更接近于计算机的二进制系统&#xff09;&#xff0…

【图解IO与Netty系列】IO的同步与异步、阻塞与非阻塞,Linux五种IO模型

IO的同步与异步、阻塞与非阻塞&#xff0c;Linux五种IO模型 IO的同步与异步&#xff0c;阻塞与非阻塞阻塞IO与非阻塞IO同步IO与异步IO Linux五种IO模型BIONIOIO多路复用信号驱动IOAIO IO的同步与异步&#xff0c;阻塞与非阻塞 我们有时会看到类似于同步阻塞式IO、同步非阻塞式…

(避坑)SpringSecurity关于使用.antMatchers放行接口不生效问题

问题 在使用SpringSecurity的时候发现放行指定接口一直没有生效&#xff0c;使用"/**"就可以生效的问题 关于securityConfig的配置代码 Beanprotected SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.csrf().disable() // 关闭csrf防护…

博客开始使用 Cache Master 缓存插件

明月在给大家推荐 Cache Master 插件的时候&#xff08;可参考【推荐个比较纯正的缓存插件——Cache Master】一文&#xff09;&#xff0c;仅仅是在其他站点上试用了一下&#xff0c;今天明月正式在博客上用上了 Cache Master&#xff0c;没有想到对 Dragon 主题的支持竟然是出…

RUST 和 GO 如何管理它们的内存

100编程书屋_孔夫子旧书网 Go 中的内存管理 Go 中的内存不会在缓存键被驱逐时立即释放。 相反&#xff0c;垃圾收集器会经常运行以发现任何没有引用的内存并释放它。 换句话说&#xff0c;内存会一直挂起&#xff0c;直到垃圾收集器可以评估它是否真正不再使用&#xff0c;而…

rtsp协议分析

rtsp概述 rtsp (real-time stream protocol)实时流媒体控制协议。RFC2326&#xff1a;这是RTSP的初始定义版本v1.0&#xff0c;由哥伦比亚大学、网景和RealNetworks公司提交给互联网工程任务组&#xff08;IETF&#xff09;作为RFC标准。RFC7826&#xff1a;这是RTSP的后续更新…