【JAVA】建立一个图书管理系统

本文详细介绍了如何在图书管理系统中创建Book类和Booklist类,包括私有成员变量的访问、构造方法、getter和setter方法,以及管理员和普通用户界面的菜单设计和操作实现,如添加、删除、查找和借阅图书等功能。
摘要由CSDN通过智能技术生成

在建立一个图书管理系统的时候我们首先需要构造一个书类

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrwed;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }//构造方法

因为类成员是 private修饰的所以我们要用到set和get构造器来访问它们

 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 isBorrwed() {
        return isBorrwed;
    }

    public void setBorrwed(boolean borrwed) {
        isBorrwed = borrwed;
    }//用于获取图书和设置图书

打印一下 用tosring

  @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrwed==true)?"已经借出":"未被借出")+
                '}';
    }
}//它将生成并返回一个格式化的字符串,拿来打印的

第二步我们需要建立一个书架,这个书架的作用是拿取书 增加书,借阅书等操作都将在这里完成

所以我们建立一个新的类

package book;

public class Booklist {
    private Book[] books;
    private int usedsize;
    private static final int DEA=10;
    public Booklist(){
        this.books=new Book[DEA];
        //放书
        this.books[0]=new Book("三国演义","罗贯中",10,"小说");
        this.books[1]=new Book("红楼梦","曹雪芹",19,"小说");
        this.books[2]=new Book("西游记","吴承恩",22,"小说");
        this.usedsize=3;
    }

    public int getUsedsize() {
        return usedsize;
    }

    public void setUsedsize(int usedsize) {
        this.usedsize = usedsize;
    }
    public Book getBook(int pos){
        return books[pos];
    }
    public void setBooks(int pos,Book book){
        books[pos]=book;
    }

public Book[] getBooks(){
        return books;
}


}

因为要放多本书,所以我们的类成员需要是数组

同样的下列方法

构造函数:

public Booklist() 初始化一个Booklist对象时,创建一个大小为DEA的Book数组,并填充了三本预设的书籍信息,同时设置了usedsize为3,表示已有3本书被使用

  1. getter 和 setter 方法:

    • getUsedsize() 返回当前使用的书籍数量。
    • setUsedsize(int usedsize) 设置当前使用的书籍数量。
    • getBook(int pos) 返回索引为pos位置处的Book对象。
    • setBooks(int pos, Book book) 将新的Book对象替换到索引为pos的位置上。
    • getBooks() 返回整个书籍数组,包含了所有存储的Book对象。

 第三步我们回到main函数来布置主要的逻辑

可以看到我们有两个界面一个是管理员界面一个是普通用户界面。首先我们需要完善它们的菜单

然后根据我们的选择进入哪个菜单

先完成主函数设置

public class Main {
    public static User login(){
        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 Adimer(name);
        }
        else {
            return new NormalUser(name);

        }
    }

然后我们来设置管理员系统和普通用户系统,在设置它们两之前 我们要先弄一个总的用户系统

这个系统不需要实例化只需要被继承所以他应该是抽象类

package user;

import book.Booklist;
import oper.IOperation;

public abstract class User {
    protected String name;
    protected IOperation[] ioperations;

    public User(String name) {
        this.name = name;

    }

    public  abstract int menu();
    public void doOpenration(int choice, Booklist booklist){
        ioperations[choice].work(booklist);
    }
}
package oper;

import book.Booklist;

public interface IOperation {

    void work(Booklist booklist);
}

在实现这个类之前 我们需要构建一个接口

这个接口的设计意图是为了规定一种规范,任何实现了 IOperation 接口的类都需要提供一个执行具体工作的 work 方法,这个方法接受一个 Booklist 对象作为参数。

  1. 成员变量:

    • name:保护类型(protected)的字符串变量,用于存储用户的姓名。
    • ioperations:保护类型(protected)的 IOperation 接口数组,其中每个元素都是一个实现了 IOperation 接口的对象。这些对象代表用户可以执行的各种操作,如查找图书、添加图书、删除图书等。
  2. 构造函数:

    • public User(String name):接收一个字符串参数 name,用于初始化用户的名字。
  3. 抽象方法:

    • public abstract int menu():这是一个抽象方法,要求子类必须实现。这个方法通常用来展示一个操作菜单并获取用户选择的操作编号。
  4. 具体方法:

    • public void doOpenration(int choice, Booklist booklist):根据传入的 choice 参数调用 ioperations 数组中对应索引位置的操作对象的 work() 方法,并将一个 Booklist 对象作为参数传递给该方法。Booklist 类似于一个图书列表,包含了图书的相关信息。

现在来设置用户系统和管理员系统

 用户系统

package user;

import oper.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);//帮助父类构造
        this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),new borropertation(),
        new returnpertation()};
    }
    public int menu(){
        System.out.println("*********************");
        System.out.println("****1.查找图书*********");
        System.out.println("****2.借阅图书*********");
        System.out.println("****3.归还图书*********");
        System.out.println("****0.退出************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choie=scanner.nextInt();
        return choie;
    }
}
  1. 类定义:public class NormalUser extends User 表示 NormalUser 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public NormalUser(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含四个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、borropertation(借阅图书操作)和 returnpertation(归还图书操作)。这些操作是普通用户在图书管理系统中可以执行的动作。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对普通用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

管理员系统

 

package user;

import oper.*;

import java.util.Scanner;

public class Adimer extends User{
    public Adimer(String name) {
        super(name);
        this.ioperations=new IOperation[]{new Exitoperation(),
                new Findpritation(),new Addoperation(),new Deloperation(),
                new Showoperation()
        };
    }
    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.退出系统*********");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choie=scanner.nextInt();
        return choie;

    }

}

  1. 类定义:public class Adimer extends User 表示 Adimer 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public Adimer(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含五个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、Addoperation(新增图书操作)、Deloperation(删除图书操作)和 Showoperation(显示图书操作)。这些操作是管理员用户在图书管理系统中可以执行的动作,相比普通用户,管理员拥有更多的权限,例如新增和删除图书。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对管理员用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

现在我们来构造功能 

 增加图书

ackage oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Addoperation implements IOperation{



    public void work(Booklist booklist) {
        System.out.println("新增图书");
        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 book=new Book(name,author,price,type);

        //检查 数组当中有没有这本书
        int currentsize= booklist.getUsedsize();
        for (int i = 0; i <currentsize; i++) {
            Book book1=booklist.getBook(i);
            if (book1.getName().equals(name)){
                System.out.println("有这本书,不进行存放");
                return;
            }
        }
        if(currentsize== booklist.getBooks().length){
            System.out.println("书架满了");
        }
        else {
            booklist.setBooks(currentsize,book);
            booklist.setUsedsize(currentsize+1);
        }

    }
}
  1. 类定义:public class Addoperation implements IOperation 表示 Addoperation 类实现了 IOperation 接口,需要实现接口中定义的 work() 方法。

  2. work(Booklist booklist) 方法:

    • 打印提示信息,让用户输入新书的信息(书名、作者、类型、价格)。
    • 使用 Scanner 从控制台读取用户输入。
    • 根据用户输入创建一个新的 Book 对象。
    • 检查 Booklist 中是否存在同名的书籍。通过遍历 booklist 中已有的图书,比较书名是否相同。
    • 如果存在同名书籍,则打印提示信息并结束本次新增操作。
    • 如果 Booklist 已满(即已存图书的数量等于 booklist 数组的容量),则打印提示信息。
    • 若以上条件均不满足,则将新书添加到 Booklist 中,通过调用 booklist.setBooks(currentsize, book) 将新书放置在数组的下一个可用位置,并通过调用 booklist.setUsedsize(currentsize + 1) 更新已使用书籍的数量。

 借阅图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class borropertation  implements IOperation{



    public void work(Booklist booklist) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("借阅图书");
        String name=scanner.nextLine();
        int currensize=booklist.getUsedsize();
        for (int i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                book.setBorrwed(true);
                System.out.println("借阅成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你借阅的图书不存在");
    }
}

与增加图书的接口一样

work(Booklist booklist) 方法:

使用 Scanner 从控制台读取用户输入的想要借阅的图书的书名。
获取图书列表 booklist 中当前已存图书的数量(currensize)。
遍历图书列表中的所有图书(通过 booklist.getBook(i) 获取每一本书),比较每本书的书名是否与用户输入的书名相同。
如果找到匹配的书名,则将该书的借阅状态设为 true(通过调用 book.setBorrwed(true)),输出借阅成功的消息,并打印出借阅后的图书详细信息。
若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“你借阅的图书不存在”。

删除图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Deloperation  implements IOperation{


    public void work(Booklist booklist) {
        System.out.println("删除图书");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要删除的图书");
        String name=scanner.nextLine();
        int pos=-1;
        int i=0;

        int currensize= booklist.getUsedsize();
        for ( i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                pos=i;
                break;
            }

        }
        if (i==currensize){
            System.out.println("没有你要删除的图书");
            return;
        }
        //开始删除
        int j=pos;
        for ( j = pos; j < currensize-1; j++) {
            //
            Book book=booklist.getBook(j+1);
            booklist.setBooks(j,book);
        }

        booklist.setBooks(j,null);
        booklist.setUsedsize(currensize-1);
    }
}

work(Booklist booklist) 方法:

  • 打印提示信息,让用户输入要删除的图书的书名。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 遍历图书列表 booklist 中的所有图书,寻找与用户输入相匹配的书名。
  • 如果找到了匹配的书名,记录下该书在列表中的位置(pos)并跳出循环。
  • 如果遍历完列表仍未找到匹配书名,则输出提示信息“没有你要删除的图书”,并直接返回。
  • 如果找到了匹配的书名,开始执行删除操作:从找到的书所在位置 (pos) 开始,将后面的所有图书向前移动一位,覆盖掉待删除图书的位置,相当于删除了该书。
  • 最后,将列表末尾的元素设为 null,并减少已使用图书的数量(通过调用 booklist.setUsedsize(currensize - 1)

退出系统

这里比较简单用个方法就好

package oper;

import book.Booklist;

public class Exitoperation implements IOperation{


    public void work(Booklist booklist) {
        System.out.println("退出图书");
        System.exit(0);
    }
}

 查找图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Findpritation  implements IOperation{



    public void work(Booklist booklist) {
        System.out.println("找到图书");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int currentsize= booklist.getUsedsize();
        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("没有找到");
    }
}

work(Booklist booklist) 方法:

  • 打印提示信息,提示用户输入要查找的图书名称。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 获取图书列表 booklist 中当前已存图书的数量(currentsize)。
  • 遍历图书列表中的所有图书,通过调用 booklist.getBook(i) 获取每一本书,并判断每本书的书名是否与用户输入的书名相同。
  • 如果找到匹配的书名,则打印出找到的图书的信息,并通过 System.out.println(book) 输出图书详情,然后结束查找操作。
  • 若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“没有找到”

 归还图书

和借阅图书一样改一下bool的状态打印一下结果就好

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class returnpertation  implements IOperation{


    public void work(Booklist booklist) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("归还图书");
        String name=scanner.nextLine();
        int currensize=booklist.getUsedsize();
        for (int i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                book.setBorrwed(false);
                System.out.println("归还成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你归还的图书不存在");
    }
}

显示图书

package oper;

import book.Book;
import book.Booklist;

public class Showoperation  implements IOperation{

    public void work(Booklist booklist) {
        System.out.println("打印图书");
        int curernsize=booklist.getUsedsize();
        for (int i = 0; i <curernsize; i++) {
            Book book=booklist.getBook(i);
            System.out.println(book);
        }
    }


}
  • 打印提示信息,提示正在打印图书列表。
  • 获取图书列表 booklist 中当前已存图书的数量(curernsize)。
  • 遍历图书列表,通过调用 booklist.getBook(i) 获取每一本书,并使用 System.out.println(book) 打印出每本书的详细信息
  • 38
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值