图书管理系统(Java版本)
文章目录
- 前言
- 要求
- 1.设置对象
- 1.1.图书
- 1.2.书架
- 2.管理员
- 3.功能的实现
- 2.搭建框架
- 2.1.登录(login)
- 2.2.菜单
- 2.3.操作方法的获取
- 3.操作方法的实现
- 3.1.退出系统(ExitOperation)
- 3.2.显示图书(ShowOperation)
- 3.3.查阅图书(FindOperation)
- 3.4.新增图书(AddOperation)
- 3.5.借出图书(BorrowOperation)
- 3.6.归还图书(ReturnOperation)
- 3.7.删除图书(DelOperation)
前言
前面足足有十篇博客,给大家讲解了Java的基础语法,尤其是面向对象以及其思想,是我们遇到的第一种障碍,为此咱们写一个图书管理系统进行巩固。
要求
这边是一个主要流程,其中具体的功能就不在此一一展示,等会在功能的实现中,具体再说
1.设置对象
1.1.图书
根据图上所示,我们可以发现,每一个图书的成员变量有五个:
书名,作者,价格,类型,以及借出情况。
并且我们不想要让别人直接得到,那么都需要用private修饰。
1.2.书架
每本书都要放到书架中,方才可以使用,当然还要直到当前图书的个数,以及如何取书和放书。
下来我们这两个放到一个包中,编写其内容,代码。
书架类
public class BookList {Book[]books=new Book[10];private int UseSize;public BookList(){this.books[0]=new Book("三国演义","罗贯中",9.9,"小说");this.books[1]=new Book("我与地坛","史铁生",23.9,"散文");this.books[2]=new Book("红楼梦","曹雪芹",9.9,"小说");this.UseSize=3;}public BookList(int useSize) {UseSize = useSize;}public Book getBook(int pos){return books[pos];}public void setBook(int pos,Book book){this.books[pos]=book;}public int getUseSize() {return UseSize;}public void setUseSize(int useSize) {UseSize = useSize;}public Book[] getBooks() {return books;}public void setBooks(Book[] books) {this.books = books;}
}
图书类
public class Book {private String name;private String author;private double price;private String type;private boolean isBorrowed;public Book(String name, String author, double 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 double getPrice() {return price;}public void setPrice(double 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==false?"未借出":"已借出")+'}';}
}
2.管理员
管理员分为两类,1.一种是普通用户,2。一种是管理员用户。
我们把这两种用户的相同点放到一个User抽象类中,再分别实现自己的功能,把这三个类放到一个包里。
User抽象类
public abstract class User {protected String name;public User(String name) {this.name = name;}public abstract void menu();
}
AdminUser类
public class AdminUser extends User {public AdminUser(String name) {super(name);}@Overridepublic void menu() {}
}
NormalUser类
public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic void menu() {}
}
其中具体的实现,等会在写
3.功能的实现
我们通过上面的图,可以发现一共有7种操作方法,并且有一样的,首先我们会有2个问题:第一个问题:如何可以知道User的类型,第二种,如何可以该用户有哪些方法,并且如何去进行调用呢?这些方法等会都会进行解答,首先我们先把每个功能的框架搭建一下,在创建一个包(iOperation)。
这边各种包的创建过程,其中有7大操作功能,内容和上面的都一样,大家下面自己去搭建一下。
具体内容,现在进行操作。
2.搭建框架
2.1.登录(login)
我们现在实现这个页面的内容。主要我们是要想返回值是什么?结合上面第一个问题,返回值是User,通过登录这个方法,我们可以确定目前是什么用户进行登录。
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();if(choice==1){return new AdminUser(name);}else {return new NormalUser(name);}}
2.2.菜单
现在我们完成这个菜单页面,并且返回值又是什么?因为,我们已经知道身份了,那么就要知道操作方法的选择,因此返回值是int。
AdminUser类
public class AdminUser extends User {public AdminUser(String name) {super(name);}@Overridepublic int menu() {System.out.println("****************");System.out.println("0.退出系统 ");System.out.println("1.查找图书 ") ;System.out.println("2.新增图书 ") ;System.out.println("3.删除图书 ") ;System.out.println("4.显示图书 ") ;System.out.println("****************");System.out.println("请输入你的操作:");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}
NormalUser类
public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic int menu() {System.out.println("****************");System.out.println("0.退出系统 ");System.out.println("1.查找图书 ") ;System.out.println("2.借阅图书 ") ;System.out.println("3.归还图书 ") ;System.out.println("****************");System.out.println("请输入你的操作:");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}
User父类就是把原来menu的返回值改为int即可,我就在这不演示啦。
2.3.操作方法的获取
现在便是要解决最难得一个问题,如何让控制台得知,我们要进行那个操作,现在我们知道了用户类型,以及选择的方法,我们可以使用一个数组,每个下标都对应各自的方法,而我们要将7大操作方法,组合在一起,又要跟下标相关联,那一定是数组。并且,要让7大操作方法,都有一个共有的东西,使得在调用这个东西的时候,就是在调用他们自己的话,那就是接口啦!
为此我们在iOperation包中创建一个接口。
IOperation接口
public interface IOPeration {void work(BookList bookList);
}
创建完接口,下来就要在User中创建IOperation数组了,然后分别在AdminUser和NormalUser中,分别对数组进行初始化,与此同时,在User中创建一个方法,可以在Test中使用接口。
User抽象类
public abstract class User {protected String name;protected IOPeration[]ioPerations;public User(String name) {this.name = name;}public abstract int menu();public void doOperation(int choice, BookList bookList){ioPerations[choice].work(bookList);}
}
AdminUser类
public class AdminUser extends User {public AdminUser(String name) {super(name);this.ioPerations=new IOPeration[]{new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation() };};@Overridepublic int menu() {System.out.println("****************");System.out.println("0.退出系统 ");System.out.println("1.查找图书 ") ;System.out.println("2.新增图书 ") ;System.out.println("3.删除图书 ") ;System.out.println("4.显示图书 ") ;System.out.println("****************");System.out.println("请输入你的操作:");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}
NormalUser类
public class NormalUser extends User{public NormalUser(String name) {super(name);this.ioPerations=new IOPeration[]{new ExitOperation(),new FindOperation() ,new BorrowOperation(),new ReturnOperation()};};@Overridepublic int menu() {System.out.println("****************");System.out.println("0.退出系统 ");System.out.println("1.查找图书 ") ;System.out.println("2.借阅图书 ") ;System.out.println("3.归还图书 ") ;System.out.println("****************");System.out.println("请输入你的操作:");Scanner scanner=new Scanner(System.in);int choice=scanner.nextInt();return choice;}
}
Test类
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();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();while (true){int choice=user.menu();user.doOperation(choice,bookList);}}
}
由此观之:将7大操作方法连接起来的的是接口,
将方法按照顺序让控制台知道我们的操作,是数组(也可以说是下标),将这两个结合起来,便是我们的创新的点子,最精彩的在上面,大家好好领悟,领悟完,再看每个操作方法的具体实现
3.操作方法的实现
3.1.退出系统(ExitOperation)
public class ExitOperation implements IOPeration{public void work(BookList bookList){System.out.println("退出系统...");System.exit(0);}
}
3.2.显示图书(ShowOperation)
public class ShowOperation implements IOPeration{public void work(BookList bookList){System.out.println("显示图书...");int currentSize=bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);System.out.println(book);}}
}
3.3.查阅图书(FindOperation)
public class FindOperation implements IOPeration {public void work(BookList bookList){Scanner scanner=new Scanner(System.in);System.out.println("请输入你想查阅的书名");String name=scanner.nextLine();int currentSize=bookList.getUseSize();for (int i = 0; i < currentSize; i++) {Book book=bookList.getBook(i);if(book.getName().equals(name)){System.out.println("找到了图书:");System.out.println(book);return;}}System.out.println("没有找到你想查阅的书籍");}
}
3.4.新增图书(AddOperation)
public class AddOperation implements IOPeration{public void work(BookList bookList){//1.判满和判空System.out.println("新增图书...");int currentSize= bookList.getUseSize();if(currentSize==0){System.out.println("书架中已无书");return;}if(currentSize==bookList.getBooks().length){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("请输入价格:");Double price= scanner.nextDouble();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.setUseSize(currentSize+1);bookList.setBook(currentSize,newbook);System.out.println("新书增加成功...");}
}
3.5.借出图书(BorrowOperation)
public class BorrowOperation implements IOPeration {public void work(BookList bookList){System.out.println("借阅图书...");Scanner scanner=new Scanner(System.in);System.out.println("请输入你想借阅的书名:");String name=scanner.nextLine();int currentSize=bookList.getUseSize();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("没有查到你要借阅的图书");}
}
3.6.归还图书(ReturnOperation)
借阅图书和归还图书本质是一样的
public class ReturnOperation implements IOPeration{public void work(BookList bookList){System.out.println("归还图书...");Scanner scanner=new Scanner(System.in);System.out.println("请输入你想归还的书名:");String name=scanner.nextLine();int currentSize=bookList.getUseSize();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("没有查到你要归还的图书");}
}
3.7.删除图书(DelOperation)
这就需要数据结构的知识啦,可以利用画图来演示
这里用数字代替图书
public class DelOperation implements IOPeration {public void work(BookList bookList){System.out.println("删除图书...");System.out.println("请输入你想删除的书名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int currentSize=bookList.getUseSize();int i=0;int pos=-1;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,null);bookList.setUseSize(currentSize-1);System.out.println("删除成功!");}
}
具体代码:请看大松鼠的码云
完
相关文章:

图书管理系统(Java版本)
文章目录 前言要求1.设置对象1.1.图书1.2.书架2.管理员3.功能的实现 2.搭建框架2.1.登录(login)2.2.菜单2.3.操作方法的获取 3.操作方法的实现3.1.退出系统(ExitOperation)3.2.显示图书(ShowOperation)3.3.查阅图书(FindOperation)3.4.新增图书(AddOperation)3.5.借出图书(Borr…...

全同态加密生态项目盘点:FHE技术的崛起以及应用
撰文:Chris,Techub News 在当今数字化的时代,隐私保护已成为一个全球性的焦点话题,特别是在加密货币和区块链技术快速发展的背景下。虽然当前的隐私技术在保护数据安全方面多有欠缺,引发了广泛的关注和批评,…...

山脉数组的峰顶索引 ---- 二分查找
题目链接 题目: 分析: 我们很明显, 可以从峰值位置将数组分成两段, 具有"二段性", 所以可以用二分查找因为arr是山峰数组, 不存在相等的情况如果arr[mid] > arr[mid 1], 说明mid的位置可能是峰值, 移动right mid如果arr[mid] < arr[mid 1], 说明mid的位置…...

【简单介绍下7-Zip,什么是7-Zip?】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
SCSS基本使用:构建高效、可维护的CSS架构
SCSS基本使用:构建高效、可维护的CSS架构 SCSS(Sassy CSS)是一个流行的CSS预处理器,它扩展了CSS的功能,提供了变量、嵌套规则、混合(Mixins)、函数等强大的编程特性,使得开发者能够编…...

allegro 无法删除Xnet
allegro 无法删除Xnet Orcad中打开Constraint Manager之后,再生成网表,导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中, 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…...

2024年甘肃特岗教师招聘报名流程,速速查收哦!
2024年甘肃特岗教师招聘报名流程,速速查收哦!...

【错误解决】使用HuggingFaceInstructEmbeddings时的一个错误
起因:使用huggingface构建一个问答程序时出现的问题。 错误内容: 分析: 查看代码发现,HuggingFaceInstructEmbeddings和sentence-transformers模块版本不兼容导致。 可以明显看到方法参数不同。 解决: 安装sentenc…...

C++中的四种类型转换运算符
隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表…...

k8s 1.28.10 浏览器访问6443查看api,需要证书
添加证书 使用client-certificate-data和client-key-data生成一个p12文件 1.生成client-certificate-data grep client-certificate-data ~/.kube/config | head -n 1 | awk {print $2} | base64 -d >> kubecfg.crt2.生成client-key-data grep client-key-data ~/.kub…...

新火种AI|复旦团队在“冷冻人脑”领域获得重大进展!人工智能是否会对此形成助力?
在低温医学领域,“冷冻人脑”技术的研究和突破既是重点,也是难点。因为这项技术关乎着人类是否可以取得一个令人瞩目的突破——人类的生命是否能够得到延续。 早几年,诸如“利用人体冷冻技术将身患绝症的病人保存十几年,几十年…...

echarts 散点图修改散点图中图形形状颜色大小
话不多说,直接上代码 let option {color:[xxx, xxx, xxx, xxx], //直接设置color可修改图形颜色title: {text: 散点图图形,},tooltip: {trigger: axis,axisPointer: {type: cross}},legend: {top: 2,right:2,itemWidth: 10,itemHeight: 10,textStyle:{fontSize:14}…...

SpringBoot3.x + JDK21 整合 Mybatis-Plus
前言 SpringBoot3.0 开始最低要求 Java 17,虽然目前最新的版本为 JDK22,但是在官网上看到 JDK23 在今年9月又要发布了,感觉这 JDK 也有点太过于给力了 所以我们选择用目前的 LTS 版本 JDK21 就好了,不用追求最新的 springboot 版…...

Java类和对象(五)—— 抽象类、接口、Object类和内部类
抽象类 在继承体系下,父类有些方法可能是要被重写的,如果我们事先就知道某些方法需要重写的话,我们可以不用在父类里面具体实现这个方法,这时候我们会用到抽象方法,这时候我们会用到关键字abstract关键字来修饰 publ…...

图像上下文学习|多模态基础模型中的多镜头情境学习
【原文】众所周知,大型语言模型在小样本上下文学习(ICL)方面非常有效。多模态基础模型的最新进展实现了前所未有的长上下文窗口,为探索其执行 ICL 的能力提供了机会,并提供了更多演示示例。在这项工作中,我…...

汇编:函数以及函数参数传递
汇编语言中的函数(或过程)是指一段可以被调用和执行的代码块;它们用于组织和重用代码,并使程序结构更加清晰;由于汇编语言没有高层次语言的语法糖,编写和调用函数涉及直接的堆栈操作和寄存器管理࿱…...
linux-ftp服务器搭建简介
安装ftp服务器: vsftpd全称为“very secure FTP daemon”,是一个在UNIX类操作系统上运行的服务,可以提供高安全性的FTP服务。 vsftpd是一个免费和开放源代码的FTP服务器软件,它提供了许多其他FTP服务器不支持的特性,例…...

二十一、openlayers官网示例Custom Controls解析——自定义控件扩展Control类
官网demo地址: Custom Controls 这个示例讲的是如何自定义控件 首先创建了一个新的类继承了原本的Control,新增了一个button元素,然后调用了super方法将参数传给了父类。 const button document.createElement("button");button.…...

【博主推荐】HTML5实现520表白、情人节表白模板源码
文章目录 1.设计来源1.1 表白首页1.2 甜蜜瞬间11.3 甜蜜瞬间21.4 甜蜜瞬间31.5 甜蜜瞬间41.6 甜蜜瞬间51.7 甜蜜瞬间61.8 永久珍藏 2.效果和源码2.1 页面动态效果2.2 页面源代码2.3 源码目录2.4 更多为爱表白源码 3.源码下载地址 作者:xcLeigh 文章地址:…...

【YOLOv5/v7改进系列】替换激活函数为SiLU、ReLU、LeakyReLU、FReLU、PReLU、Hardswish、Mish、ELU等
一、导言 激活函数在目标检测中的作用至关重要,它们主要服务于以下几个关键目的: 引入非线性:神经网络的基本构建块(如卷积层、全连接层等)本质上是线性变换,而激活函数通过引入非线性,使得网络…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Python竞赛环境搭建全攻略
Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...

图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...