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

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

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) 打印出每本书的详细信息

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【自我提升】计算机领域相关证书

目录 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09;Oracle认证Cisco认证微软认证红帽认证AWS认证 计算机技术与软件专业资格&#xff08;水平&#xff09;考试证书&#xff08;软考&#xff09; 计算机技术与软件专业技术资格&a…

坚果N1S Pro和当贝X5 Pro哪款品质最高?当贝X5 Pro质价比更高

家用投影发展至今已经越来越卷&#xff0c;4K、激光等技术也经常被用在家用投影仪上&#xff0c;4K激光投影这类高端投影也出现了不少产品&#xff0c;其中被讨论最多的也是市面上销量比较好的&#xff0c;就是当贝X5 Pro和坚果N1S Pro这两款&#xff1b;很多人想知道这两台家用…

2024年大模型面试准备(三):聊一聊大模型的幻觉问题

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。 合集在这…

SuperGluePretrainedNetwork 详细解读

目录结构展示了SuperGluePretrainedNetwork项目的简化版布局。这是一个关于使用SuperGlue算法进行图像配对的深度学习项目&#xff0c;主要包括预训练的模型和执行配对的脚本。 demo_superglue.py demo_superglue.py脚本的主要作用是展示SuperGlue预训练网络在图像对上进行特征…

Linux下命令行方式导入Mysql数据库

一. 正常Mysql导入 直接登录mysql进行导入即可 mysql -u用户名 -p密码 要导入的数据库名 < 数据库名.sql mysql -u用户名 -p密码 db_doc < 20210616.sql二. Docker镜像方式Mysql导入 1. docker启动mysql docker exec -it mysal bash 2. 登录mysql mysql -uroot -p密…

软件设计师21--操作系统章节回顾

软件设计师21--操作系统章节回顾 章节重要内容考情分析 章节重要内容 考情分析

消息队列八股

RabbitMQ 确保消息不丢失 重复消费问题 延迟队列 消息堆积 高可用 很少使用 Kafka 如何保证消息不丢失 回调接口保证生产者发送到brocker消息不丢失 保证消息顺序性 高可用机制 数据清理机制 实现高性能的设计

公平锁和非公平锁,为什么要“非公平”?

公平锁和非公平锁&#xff0c;为什么要“非公平”&#xff1f; 主要讲一讲公平锁和非公平锁&#xff0c;以及为什么要“非公平”&#xff1f; 什么是公平和非公平 首先&#xff0c;我们来看下什么是公平锁和非公平锁&#xff0c;公平锁指的是按照线程请求的顺序&#xff0c;…

欧科云链OKLink:坎昆升级后,Layer2项目是否更具竞争力?

在坎昆升级激活之际&#xff0c;OKLink 上线以太坊坎昆升级 Dencun 专题页 &#x1f449; 从专业链上数据分析角度&#xff0c;带来一场充实且即时的 Layer2 数据盛宴。 在近日由 137Labs 发起&#xff0c;Cointime 主持的 Layer2 生态专场讨论中&#xff0c;OKLink 产品…

AISD智能安全配电装置--智能监测、远程监控

安科瑞薛瑶瑶18701709087 AISD100单相、AISD300三相智能安全配电装置是安科瑞专为低压配电侧开发的一款智能安全配电产品。主要针对低压配电系统人身触电、线路老化、短路、漏电等原因引起电气安全问题而设计。 产品主要应用于学校、加油站、医院、银行、疗养院、康复中心、敬…

补充--广义表学习

第一章 逻辑结构 &#xff08;1&#xff09;A()&#xff0c;A是一个空表&#xff0c;长度为0&#xff0c;深度为1。 &#xff08;2&#xff09;B(d,e)&#xff0c;B的元素全是原子&#xff0c;d和e&#xff0c;长度为2&#xff0c;深度为1。 &#xff08;3&#xff09;C(b,(c,…

什么事缓存击穿、缓存穿透、缓存雪崩?

缓存击穿&#xff1a;是指当某一个key的缓存过期时大并发量的请求同时访问此key&#xff0c;瞬间击穿缓存服务器直接访问数据库&#xff0c;让数据库处于负载的情况。 缓存穿透&#xff1a;是指缓存服务器中没有缓存数据&#xff0c;数据库中也没有符合条件的数据&#xff0c;…

2024 ccfcsp认证打卡 2023 09 02 坐标变换(其二)

202309-2 坐标变换&#xff08;其二&#xff09; 题解1题解2区别第一种算法&#xff08;使用ArrayList存储操作序列&#xff09;&#xff1a;数据结构&#xff1a;操作序列处理&#xff1a; 第二种算法&#xff08;使用两个数组存储累积结果&#xff09;&#xff1a;数据结构&a…

微服务day06 -- Elasticsearch的数据搜索功能。分别使用DSL和RestClient实现搜索

1.DSL查询文档 elasticsearch的查询依然是基于JSON风格的DSL来实现的。 1.1.DSL查询分类 Elasticsearch提供了基于JSON的DSL&#xff08;Domain Specific Language&#xff09;来定义查询。常见的查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一…

代码随想录算法训练营day57|647. 回文子串 、 516.最长回文子序列

目录 647. 回文子串 16.最长回文子序列 647. 回文子串 力扣题目链接(opens new window) 给定一个字符串&#xff0c;你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串&#xff0c;即使是由相同的字符组成&#xff0c;也会被视作不同的子串…

每天学点儿python(1)---print,input和注释

print函数 print语法格式 print(*objects, sep , end\n, filesys.stdout) sep参数默认为 一个空格 end&#xff08;输出末尾&#xff09;参数默认为 回车换行 file默认为 标准输出&#xff08;一般指屏幕&#xff09; 所以&#xff0c;如果想输出各个字段不用空格隔开&a…

人工智能三剑客NumPy、pandas、matplotlib和Jupyter四者之间的关系

NumPy 主要用途&#xff1a;NumPy&#xff08;Numerical Python的缩写&#xff09;主要用于处理大型多维数组和矩阵的科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于数组操作的工具。与其他三者的联系&#xff1a;NumPy是pandas和matplotlib的基础库之一。许…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…

如何搭建ERP帮助中心提升工作效率

现在是个信息化时代&#xff0c;ERP系统成了企业日常运营里必不可少的一部分。不过&#xff0c;随着ERP系统用得越来越多&#xff0c;大家在使用过程中碰到的问题变得多且复杂。为了解决这些麻烦&#xff0c;提高大家的工作效率&#xff0c;搭建ERP帮助中心其实是一个很有必要的…

FreeRTOS从代码层面进行原理分析(2 任务的启动)

FreeRTOS分析二—任务的启动 上一篇文章我们带着三个问题开始了对 FreeRTOS 代码的探究。 1. FreeRTOS 是如何建立任务的呢&#xff1f; 2. FreeRTOS 是调度和切换任务的呢&#xff1f; 3. FreeRTOS 是如何保证实时性呢&#xff1f; 并且在上一篇文章 FreeRTOS从代码层面进行…