图书管理系统(顺序表)最详解

目录

建立书和书架

建立书本:

 建立书架

 实现功能:

设置接口:

 增加操作:

 增加操作的详细解析:

删除操作:

 删除操作详细解析:

 查找操作:

展示操作:

设置用户操作

创建“主”用户:

管理员操作:

主函数:


在编写图书管理系统的代码之前,脑子里要有个思路和框架。

第一,要有书和书架

第二,要有管理员和普通用户用于对图书的相关操作

第三,要实现对图书的相关功能,例如对图书的增加,删除,展示,查找,退出系统的相关工作。

建立书和书架

建立书本:

在书本中定义书的相关性质,例如书的名字,作者,价格,类型等

public class book {
    private String name;
    private double price;
    private String type;
    private String author;
    private boolean isBorrowed;            //表示是否已经借出

    public book(String name, double price, String type, String author) {
        this.name = name;
        this.price = price;
        this.type = type;
        this.author = author;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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 String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", author='" + author + '\'' +
                ", 状态:" +((isBorrowed) ? "已借出":"未借出")+
                '}';
    }
}

 建立书架

书架的建立的目的就是对书这个个体执行相关的操作,就像现实生活的书架一样。(再次强调:是对书这个个体进行操作,而不是对书的性质执行操作,对书的性质执行操作的是上面的书)。

在建立书架的时候,要想到书架的功能,就是:修改书,获取书,获取书的数目。

import Book.book;            //导入book类
public class bookList {                              //这里的booklist只是起到一个书架的作用
    private book[] books = new book[10];            //定义这个书架上存放的书

    private int usedSize;
    public bookList(){
        books[0] = new book("三国演义",19,"小说","罗贯中");
        books[1] = new book("水浒传",29,"小说","施耐庵");
        books[2] = new book("西游记",39,"小说","吴承恩");
        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 setBook(int pos,book book) {           //这个是用于删除书的时候用的,将某个位置放入某个书
        books[pos] = book;
    }
}

 实现功能:

设置接口:

设置接口的目的就是让多个有功能的类去实现这个接口,进行增加,删除等操作。

import Booklist.bookList;
public interface IOperation {
    void work(bookList bookList);
}

 增加操作:

import Book.book;
import Booklist.bookList;
import java.util.Scanner;

public class AddOperation implements IOperation{
    public void work(bookList bookList) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入图书名称:");
        String name = scanner.nextLine();
        System.out.println("请输入价格:");
        double price = scanner.nextDouble();
        System.out.println("请输入类型:");
        String type = scanner.next();
        System.out.println("请输入作者:");
        String author = scanner.next();
        book book = new book(name,price,type,author);    //从堆区中新开辟一片空间,存放新书
        int usedSize = bookList.getUsedSize();          //获取原来书的数目
        bookList.setBook(usedSize,book);         //将书放在最后一个位置,这个书的数目就表示新开辟的书的下标(因为下标是从零开始的)
        bookList.setUsedSize(++usedSize);
        System.out.println("添加图书成功!");
    }
}

 增加操作的详细解析:

现在的目的是要在书架上新增一本书,将这本书放在现存书的最后一个位置,在Java中,新增东西要去开辟空间,所以这里用到new ,去新开辟一个空间存放书就是代码:

  book book = new book(name,price,type,author);

新书有了之后,要将这本书放在书架上,也就是放在最后一本的位置,因为这个书架booklist中的书book是数组的形式存储的,所以书本的数目就可以当作为这本新书的下标(数组的下标是从0开始的)

所以:表示在usdsize位置放一本数。

 bookList.setBook(usedSize,book); 

 放完之后再将书的数目加1即可。

删除操作:

import Booklist.bookList;
import Book.book;

public class DelOperation implements IOperation{
    public void work(bookList bookList) {
        System.out.println("请输入要删除的书名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.next();
        int index = 0;
        int i = 0;

        for(i=0;i<bookList.getUsedSize();i++){
            book book = bookList.getBook(i);    //从书架中找到这个本书
            if(name.equals(book.getName())){        //再从刚在找到的书中获取刚才书的名字,判断与要删除的书是否相同
                index = i;                        //如果相同返回这个书的下标
                break;
            }
        }

        if(i>=bookList.getUsedSize()) {         //如果遍历了这个书架的所有书有没找到,表示没有这个书
            System.out.println("找不到这本书");
            return;
        }
        int j = 0;


        for (j = index;j< bookList.getUsedSize()-1;j++){
            book book = bookList.getBook(j+1);        //获取下一本书
            bookList.setBook(j,book);                    //将下一本书覆盖在前一本书的位置上
        }
        bookList.setBook(bookList.getUsedSize()-1, null);
        bookList.setUsedSize(bookList.getUsedSize()-1);         //书的总长度-1(因为删除了)
        System.out.println("删除成功!");
    }
}

 删除操作详细解析:

想要删除一本书,首先要从书架中找到这本书,执行的操作为:把每一本书拿出来,与自己想要的数进行比对,看是不是自己要的那本书。

把书拿出来:

   book book = bookList.getBook(i); 

每本进行比对,找到则返回下标:

for(i=0;i<bookList.getUsedSize();i++){
            book book = bookList.getBook(i);    
            if(name.equals(book.getName())){        
                index = i;                        
                break;
            }
        }

 删除核心:将后面一本书覆盖在前面一本书上

  book book = bookList.getBook(j+1); 

 查找操作:

这个操作简单相信大家都会。

for(int i=0;i<bookList.getUsedSize();i++){
            book book = bookList.getBook(i);
            if(name.equals(book.getName())){
                System.out.println(book);
                return;
            }
        }

展示操作:

操作简单,相信大家都会。

 int usedSize = bookList.getUsedSize();            //得到书的长度
        for (int i=0;i<usedSize;i++){
            book book = bookList.getBook(i);
            System.out.println(book);

设置用户操作

创建“主”用户:

设置用户,用来“存储”(被继承)两个身份的用户,一个是普通用户,另一个是普通用户。

import Booklist.bookList;
public abstract class User {
    protected String name;
    protected IOperation[] iOperations;
    public abstract int menu();
    public void doWork(int choice, bookList bookList){
        iOperations[choice].work(bookList);
    }
    public User(String name) {
        this.name = name;
    }
}

 再这个类中创建接口数组,让其子类实现相应功能的跳转,当这个抽象类被继承的时候,子类为普通类,要重写这个类的方法。

管理员操作:

import java.util.Scanner;

public class AdminUser extends User{
    public AdminUser(String name) {
        super(name);
        this.iOperations = new IOperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DisplayOperation(),
                new DelOperation()
        };
    }

    @Override
    public int menu(){
        System.out.println("===========管理员菜单============");
        System.out.println("您好, 管理员 "+this.name+":");
        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;
    }
}

因为父类中有设置接口数组,那么这个子类中也有这个接口数组,在子类中将需要的功能实例化,在数组中。(实例化之后,这个功能类才能正常使用),至于这个是如何跳转的,在下面的主函数中详细介绍。

主函数:

import Booklist.bookList;
import Users.AdminUser;
import Users.NormalUser;
import Users.User;
import java.util.Scanner;

public class Main {
    public static User work(){
        System.out.println("请输入您的姓名:");
        Scanner scanner = new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入身份: 1-> 管理员登录  0-> 用户登录");
        int choice = scanner.nextInt();
        if(choice==1){
            return new AdminUser(name);
        }
        return new NormalUser(name);
    }

    public static void main(String[] args) {
        bookList bookList = new bookList();
        User user = work();
        while (true) {
            int choice = user.menu();           //
            user.doWork(choice, bookList);
        }
    }
}

主函数详细解析:

首先要判断是什么身份,这个操作用到了向上转型,那为什么要用到向上转型呢?答案很简单,就是为了实现动态绑定,根据choice值的不同,去调用不同的子类,这边   User user = work();的目的就是为了实现向上转型,实例化子类user.menu() ,根据new的对象,调用相关子类的菜单,根据子类返回值chioce,相关功能的实现用user.doWork(choice, bookList)跳转。

以上图书管理系统大致思路就是我的个人的相关见解,肯定有不足的地方,如果发现错误,欢迎评论区留言。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值