图书管理系统
本文描述了一个简单的Java图书管理系统实现方案。系统分为用户界面和图书管理两部分,支持VIP用户(图书增删查显)和普通用户(查询借还)两种角色。技术实现上:1)使用Book类封装图书属性;2)通过Book2类管理图书数组;3)采用接口统一功能调用规范;4)抽象Person类实现用户多态。系统通过Scanner接收用户输入,数组遍历实现图书操作,包含完整的增删改查逻辑,包括处理书架已满、图书重复等
这是一个非常小的项目他有一下几个功能
1.输入姓名
2.输入你是什么用户
3.Vip用户又有查找图书,新增图书,删除图书,显示图书,退出系统这五个功能。
4普通用户有查找图书,借阅图书,归还图书,退出系统这四个功能。



来说活这代码是这么实现这个图书管理系统的。
一.构建一个书架
这个书架的功能是存储所要加入的书籍,所以先创建一个与书相关的包,这个包呢有两个类,一个是用来接收要存储书籍的信息,一个类是用来存储书籍。
1.接收书籍的类Book1。
接收图书里需要定义出这本书的属性如书名,作者,价格,书的类型,是否借出。因为这个类只是用于接收图书的属性所以可以把这些成员变量都设置为private就行,然后用get,set来接收和使用即可。因为接收书的同时还要把书的属性给打印出来,所以还要重写toString方法让这些书可以打印出来,toString方法也有一个要求,是否借出怎么判断?用条件语句(布尔表达式)?a;b。代码显示如下
public class Book1 {
private String name;//名字
private String author;//作者
private int price;//价格
private String type;//书的类型
private boolean isBrreyt;//是否借出
public Book1(String name, String author, int 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 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 boolean isBrreyt() {
return isBrreyt;
}
public void setBrreyt(boolean brreyt) {
isBrreyt = brreyt;
}
@Override
public String toString() {
return "Book1{" +
"name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
", type='" + type + '\'' +((isBrreyt)?"已借出":"未借出")+ "}";
}
}
2.书架类Book2
书架类主要是用于存储书籍的信息以及用于后面查找图书,新增图书,删除图书,显示图书,借阅图书,归还图书等功能会用到。存储书籍呢可以使用一个Book1这个类来创建一个数组,然后用get,set共给以上几个功能使用,当然因为后面的功能得打印,输入,删除数组里的东西,所以还要定义一个整形成员变量来记录存储书籍的长度。代码如下
public class Book2 {
private Book1[] book = new Book1[10];
private int total = 4;
public Book2(/*Book1[] book, int total*/) {
book[0] = new Book1("三体","刘慈欣",30,"科幻小说");
book[1] = new Book1("活着","余华",32,"文学书籍");
book[2] = new Book1("蛙","莫言",28,"文学书籍");
book[3] = new Book1("生死疲劳","莫言",30,"文学作品");
this.total = total;
}
public Book1 getBook(int i) {
return book[i];
}
public void setBook(int i,Book1 book) {
this.book[i] = book;
}
public Book1[] getBooks() {
return book;
}
public void setBooks(Book1[] book) {
this.book = book;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
}
二.图书管理系统的功能
图书管理系统这几个功能呢都有几个特性,就是要接收 一个Book2的对象,方便打印和查找,新增和删除图书等所以可以写一个统一标准的接口,供他们使用。
1.接口的创建。
import Book.Book2;
public interface Iomneu {
void work(Book2 book2);
}
这个接口的功能只是将Book2的对象传给几个功能类的使用,所以比较简单。
2.显示图书
这个类很简单,无非就是为了把转进来的Book2中的数组打印出来。具体操作先从Book2中拿到我们刚开始定义的存储数组的长度,然后用for通过遍历数组的方式把存储的书籍打印出来。代码如下
import Book.Book1;
import Book.Book2;
public class DisplayBook implements Iomneu{
@Override
public void work(Book2 book2) {
System.out.println("显示图书");
int t = book2.getTotal();
for(int i = 0;i < t;i++){
Book1 book1 = book2.getBook(i);
System.out.println(book1);
}
}
}
2.查找图书
查找图书比上一个会麻烦一点,但也不是很多。查找书籍首先要让我们输入要查找的书籍名称,这要用到Scanner
Scanner sc = new Scanner(System.in);System.out.println("请输入你需要查找的图书:");String name = sc.nextLine();
然后在从Book2中获取存储书籍的长度int t = book2.getTotal();在通过for循环遍历数组来找到要查找的数组。
for(int i = 0;i < t;i++){
Book1 book1 = book2.getBook(i);
if(book1.getName().equals(name)){
System.out.println("找到这本书了");
System.out.println(book1);
return;
}
}
这里需要注意的是Book1 book1 = book2.getBook(i);这代码刚开始困扰我挺久的,不过想想前面学过的面向对象即可知道,这里代表的是使book1指向book2.getBook(i)这个对象,即book1和book2.getBook(i)所代表的内容是一样的。return返回是代表着程序结束了,当然为了业务的更加完整在for循环的外边加个System.out.println("抱歉,这里没有你要找的书");会更完整。
3.新增图书。
这个类呢需要考虑到的更多。(1)判断书架是否已经满了(因为没学数据结构,暂时不能加入太多的书籍,只能认为的规定加入多少书籍)。(2)构建对象并创建一个Book1的对象存储书籍信息.(3)判断是否有这本书。(4)新增书籍。
(1)判断书架是否已经满了。
int t = book2.getTotal();
if(t==book2.getBooks().length){
System.out.println("你的书架已经满啦!!!!");
}
这挺简单的,无非就是把Book2中的存储书籍数量的成员变量通过getTotal获取,然后在通过if条件判断书架是否已经满了。
(2)构建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的书名:");
String name = sc.nextLine();
System.out.println("请输入你的作者:");
String author = sc.nextLine();
System.out.println("请输入你的书籍类型:");
String type = sc.nextLine();
System.out.println("请输入你的价格");
int price = sc.nextInt();
Book1 book1 = new Book1(name,author,price,type);
构建对象就是将书籍中的内容输入,在新创建一个Book1对象来接收这本书籍的内容。但需要注意的是nextInt会吃回车,所以建议把他放最后。
(3)判断书架是否有这本书。
for(int i = 0;i < t;i++){
Book1 book =book2.getBook(i);
if(book.getName().equals(name)){
System.out.println("很抱歉,你已经有这本书了");
return;
}
}
这代码也挺好理解的,也是通过遍历数组的方法来和自己输入的name是否有一样的,如果有则直接结束这个方法(即结束这个类)。
(4)添加书籍。
添加书籍呢就是把我们上面构建对象时的内容放到Book2的数组中,然后存储书籍数量的成员变量加一。
book2.setBook(t,book1);
book2.setTotal(t+1);
System.out.println("新增成功");
}
4.借阅书籍。
借阅书籍呢有两个地方需要处理。是否已经被借出和借阅书籍。
(1)检查是否已经被借出
检查图书是否被借出呢直接通过遍历数组查看这本书的对象的isBrreyt是否为true,是的话直接return结束。
int t = book2.getTotal();
for(int i = 0;i < t;i++){
Book1 book1 = book2.getBook(i);
if(book1.getName().equals(name)){
if(book1.isBrreyt()){
System.out.println("这本书已经被借出");
return;
}
(2)借阅书籍。
通过遍历数组的方式查看完书籍是否被借出后,把这本书的isBrreyt变为true在return即可。
int t = book2.getTotal();
for(int i = 0;i < t;i++){
Book1 book1 = book2.getBook(i);
if(book1.getName().equals(name)){
if(book1.isBrreyt()){
System.out.println("这本书已经被借出");
return;
}
book1.setBrreyt(true);
System.out.println("借阅成功");
return;
}
}若遍历数组没找到的话则打印一个抱歉,没找到你要的书。
5.归还图书。
因为在借阅图书后会把isBrreyt变成true,所以用遍历数组的方式找到后在用if看isBrreyt是否为true,不是则进入if把isBrreyt变成false,是则输出非常抱歉,您的书籍还未借出。
public class ReturnBook implements Iomneu{
@Override
public void work(Book2 book2) {
System.out.println("归还图书");
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要归还的书籍:");
String name = sc.nextLine();
int t = book2.getTotal();
for(int i = 0;i < t; i++){
Book1 book1 = book2.getBook(i);
if(book1.getName().equals(name)){
if(book1.isBrreyt()){
book1.setBrreyt(false);
System.out.println("归还成功");
return;
}else {
System.out.println("非常抱歉,您的书籍还未借出");
return;
}
}
}
System.out.println("很抱歉,没有找到你要归还的书籍");
}
}
6.删除图书。
删除书籍呢可分为两步,查找是否有要删除的书籍,删除书籍(这个是最为关键的)。
(1)查找是否有要删除的书籍。
int i = 0;
int p = -1;
for(i = 0; i < t;i++){
Book1 book1 = book2.getBook(i);
if(book1.getName().equals(name)){
p = i;
break;
}
}
if(i == t){
System.out.println("这里面没有你要删除的书籍");
}
因为后面删除书籍要用到删除书籍的位置,所以定义了个p存储书籍。这里的思想也挺简单的,无非就是遍历数组查找是否又要删除的书籍,如果没有则i==t,有则i一定小于t。
(2)删除书籍。
这也是本小项目中最难的一部分。删除呢可以把它想象成一个数组,用后一个把前一个覆盖掉就好了

for(int j = p;j < t -1;j++){
Book1 book = book2.getBook(j+1);
book2.setBook(j,book);
}这里为什么要减一呢?怕溢出,从上面的图可以看出若就j<t则到达7的时候j+1就会超过数组的长度而溢出。
删除完要记得引用book2.setTotal(t-1);让t-1,这样就完成删除了。
7.退出系统。
退出系统就直接使用System.exit(0);即可
三.人员的构建
人员的构建有两个类,普通成员和Vip成员,这两种成员因为太过相似所以可以写一个抽象类共给他们使用,具体操作如下
1.人员抽象类
因为我们在运行代码是有个名字的输入,使用抽象类可以定义一个名字的成员变量,然后使用构造方法让我们使用时输入名字。抽象类有两种主要的方法共给使用
(1)菜单
菜单呢就是简单的写一个就行,不用实现,留给子类重写。
(2)使用功能的方法。
这个使用功能的方法呢有点饶,因为我们在使用功能时需要选择功能,所以我们判断使用的是那个功能,然后使用里面的功能,故而我们可以在抽象类的够早方法种新建一个接口类的数组(为什么在构造方法中新创一个类呢?因为一旦使用了抽象类,这个功能的对象也会创建,这样Vip用户和普通用户便能使用功能)。然后在创一个app用于给Vip用户和普通用户调用功能。
package person;
import Book.Book2;
import Function.*;
public abstract class Person {
String name;
public Person(String name) {
this.name = name;
this.iomneu = new Iomneu[]{};
}
public abstract int menu();
Iomneu[] iomneu = new Iomneu[]{};
public abstract void app(int a, Book2 book2);
}
2.Vip用户/普通用户
VIP用户主要就是重写抽象类中的方法。
(1)构造方法
构造方法很简单,主要目的是为了把父类新创的类的数组给添加上VIP用户/普通用户的功能。
(2)菜单
菜单也挺简单的,打印需要功能有什么,然后使用Scanner输入用户选择的功能,在返回给主函数的类中

(3)功能的引用。
功能引用这个方法的重写呢,无非就是主函数会给我们一个输入的功能选择的整形,然后通过构造方法中的接口数组调用功能类中重写了类的方法。

四.主函数。
1.选择VIP/普通用户的方法.
这个方法的核心是返回VIP/普通用户的对象。我们可以使用Scanner来让用户输入1,2来选择自己是普通用户还是VIP用户,再来个if来选择返回VIP用户还是普通用户。
2.main方法
main方法中我们首先要创建一个Book2对象,方便后续传给VIP/普通用户,普通用户/VIP用户在传给各功能。首先我们得使用一个死循环while(true),让用户可以无限的选择自己的功能,也不用害怕关不掉,我们在功能类中写个个退出系统。其次我们新创一个抽象类对象用来使用向下转型来实现多态,最后在定义一个变量接收在用户的是输入的功能,最后在传回去给VIP/普通成员
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)