基础版-图书管理系统

news2025/7/17 22:33:02

现在我们用面向对象编程,首先我们要明确这个图书管理系统的对象有哪些?

图书管理需要管理图书(对象1),在哪管理图书呢?书架(对象2)上

然后由谁来管呢?有两类人,一类是:图书管理员(对象3)。另一类:普通用户人员(对象4)

不同的人的权限不一样。

管理员的权限:

1.查找图书(对象5)
2.新增图书(对象6)
3.删除图书(对象7)
4.显示图书(对象8)
0,退出系统(对象9)

普通用户的权限:

1.查找图书
2.借阅图书(对象10)
3.归还图书(对象11)
0,退出系统

 一个对象就是一个类:

1.先实现书和书架:

book类:

public class Book {
    private String name;//书的名字
    private String author;//书作者的名字
    private int price;//书的价格
    private String type;//书的类型
    private boolean isBorrowed;//书的状态

    @Override
    public String toString() {//book中的toString方法,用来显示书的相关信息
        return "Book{" +
                "书名:'" + name + '\'' +
                ", 作者:'" + author + '\'' +
                ", 价格:" + price +
                ", 类型:'" + type + '\'' +
                 (isBorrowed==true?" 已借出":" 未借出") +
                '}';
    }

    public Book(String name, String author, int price, String type) {//构造方法,用来初始化book
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    public void setName(String name) {
        this.name = name;
    }//设置书名

    public void setAuthor(String author) {
        this.author = author;
    }//设置书的作者

    public void setPrice(int price) {
        this.price = price;
    }//设置书的价格

    public void setType(String type) {
        this.type = type;
    }//设置书的类型

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }//设置书的是否借出的状态

    public String getName() {
        return name;
    }//得到书的名字

    public String getAuthor() {
        return author;
    }//得到书的作者的名字

    public int getPrice() {
        return price;
    }//得到书的价格

    public String getType() {
        return type;
    }//得到书的的类型

    public boolean isBorrowed() {
        return isBorrowed;
    }//得到书的是否借出的状态
}

bookList类:

public class bookList {
    private Book[] books=new Book[10];//用一个数组用来储存书本
    private int usesize;//书架上的有效书的本数
    public bookList(){//初始化书架上的书,最开始有三本默认的书
        books[0]=new Book("三国演义","罗贯中",10,"小说");
        books[1]=new Book("西游记","吴承恩",59,"小说");
        books[2]=new Book("红楼梦","曹雪芹",16,"小说");
        this.usesize=3;
    }

    public Book getBooks(int pos) {
        return books[pos];
    }//取得书架上对应下标的书

    public int getUsesize() {
        return usesize;
    }//取得书架上有效书本的数量

    public void setBooks(int i,Book book) {
        this.books[i] = book;
    }//修改书架上对应下标的书

    public void setUsesize(int usesize) {
        this.usesize = usesize;
    }//修改书架上有效书的数量

    public Book[] getBooks() {//取得数组,方便遍历书架上的所有书
        return books;
    }
    public int getInstance(String book) {//
        for (int i = 0; i <usesize ; i++) {
            if(book.equals(books[i].getName())){
                return i;
            }
        }
        return -1;
    }
    public void swap(Book n1,Book n2){//交换对应下标n1和n2的书
        n1.setName(n2.getName());
        n1.setAuthor(n2.getAuthor());
        n1.setPrice(n2.getPrice());
        n1.setType(n2.getType());
        n1.setBorrowed(n2.isBorrowed());
    }
}

2.实现用户类: 

 User(父类,抽象类):

public abstract class User {
     protected String name;
     protected Listoperation[] operation;
     public User(String name){
         this.name=name;
     }
    public abstract int menu();
     public abstract void dooperation(int choice,bookList booklist);
}

 User中menu的抽象方法用来打印菜单的,因为对应不同的用户有不同的权限。

administorUser类(管理员类):

1.第一类用户是管理员:

public class administorUser extends User{
    public administorUser(String name) {
        super(name);
        operation=new Listoperation[]{new exitoperation()
                ,new FIndoperation(),
                new Addoperation(),
                new Deletoperation(),
                new Showoperation()};
    }
    public int menu(){
        System.out.println("欢迎"+name+"来到图书管理系统");
        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 x=scanner.nextInt();
        return x;
    }
    public void dooperation(int choice, bookList booklist) {
        operation[choice].work(booklist);
    }
}

nomalUser类:

2.第二类用户是普通用户:

public class nomalUser extends User{
    public nomalUser(String name) {
        super(name);
        operation=new Listoperation[]{new exitoperation()
                ,new FIndoperation(),
                new Borrowoperation(),
                new returnoperation()};
    }
    public int menu(){
        System.out.println("欢迎"+name+"来到图书管理系统");
        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 x=scanner.nextInt();
        return x;
    }

    @Override
    public void dooperation(int choice, bookList booklist) {
        operation[choice].work(booklist);
    }
}

3.实现对应的所有方法:

1.创建一个接口:Listoperation

public interface Listoperation {
    void work(bookList booklist);
}

2.增添图书:Addoperation

public class Addoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("增添图书...");
        Scanner sc=new Scanner(System.in);
        if(booklist.getBooks().length==booklist.getUsesize()){
            System.out.println("书架已满,放不下了");
            return ;
        }
        System.out.println("请输入书名:");
        String name=sc.nextLine();
        for (int i = 0; i < booklist.getUsesize(); i++) {
            if(name.equals(booklist.getBooks(i).getName())){
                System.out.println("书架上已经有这本书");
                return ;
            }
        }
        System.out.println("请输入作者的名字:");
        String author=sc.nextLine();
        System.out.println("请输入该小说的类型:");
        String type=sc.nextLine();
        System.out.println("请输入该书的价格:");
        int price= sc.nextInt();
        Book newbook=new Book(name,author,price,type);
        booklist.setBooks(booklist.getUsesize(),newbook);
        booklist.setUsesize(booklist.getUsesize()+1);
        System.out.println("插入成功");
        return ;
    }
}

3.借阅图书:Borrowoperation

public class Borrowoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("借阅图书...");
        System.out.println("请输入你要借阅的图书的名字:");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        for (int i = 0; i < booklist.getUsesize(); i++) {
            Book book=booklist.getBooks(i);
            if(book.isBorrowed()==true){
                System.out.println("该书已经被借出");
                return ;
            }
            if(book.getName().equals(name)){
                book.setBorrowed(true);
                System.out.println("借阅成功");
                return ;
            }
        }
        System.out.println("未找到你要借阅的书");
        return ;
    }
}

4.删除图书:Deletoperation

public class Deletoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("删除图书...");
        Scanner sc=new Scanner(System.in);
        if(booklist.getUsesize()==0){
            System.out.println("书架上没有书,删除失败");
            return ;
        }
        System.out.println("请输入要删除的书名:");
        String name=sc.nextLine();
        int x= booklist.getInstance(name);
        for (int i = x; i < booklist.getUsesize()-1; i++) {
            booklist.swap(booklist.getBooks(i),booklist.getBooks(i+1));
        }
        booklist.setUsesize(booklist.getUsesize()-1);
        System.out.println("删除成功");
    }
}

5.退出系统:exitoperation

public class exitoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("退出系统...");
        System.exit(0);
    }
}

6.查找图书:FIndoperation

public class FIndoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("查找图书...");
        System.out.println("请输入你要查找的图书的名字:");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        for (int i = 0; i < booklist.getUsesize(); i++) {
            Book book=booklist.getBooks(i);
            if(book.getName().equals(name)){
                System.out.println("找到了");
                System.out.println(book);
                return ;
            }
        }
        System.out.println("未找到此书");
        return ;
    }
}

7.归还图书:returnoperation

public class returnoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("归还图书...");
        System.out.println("请输入你要归还的图书的名字:");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        for (int i = 0; i < booklist.getUsesize(); i++) {
            Book book=booklist.getBooks(i);
            if(book.getName().equals(name)){
               book.setBorrowed(false);
                System.out.println("归还图书成功");
                return ;
            }
        }
        System.out.println("未找到需要归还的书");
        return ;
    }
}

8.展示图书:Showoperation

public class Showoperation implements Listoperation{
    @Override
    public void work(bookList booklist) {
        System.out.println("显示图书...");
        for (int i = 0; i < booklist.getUsesize(); i++) {
            Book book=booklist.getBooks(i);
            System.out.println(book);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络优化 - 小批量梯度下降之批量大小的选择

上一博文学习了小批量梯度下降在神经网络优化中的应用&#xff1a; 神经网络优化 - 小批量梯度下降-CSDN博客 在小批量梯度下降法中&#xff0c;批量大小(Batch Size)对网络优化的影响也非常大&#xff0c;本文我们来学习如何选择小批量梯度下降的批量大小。 一、批量大小的…

Novartis诺华制药社招入职综合能力测评真题SHL题库考什么?

一、综合能力测试 诺华制药的入职测评中&#xff0c;综合能力测试是重要的一部分&#xff0c;主要考察应聘者的问题解决能力、数值计算能力和逻辑推理能力。测试总时长为46分钟&#xff0c;实际作答时间为36分钟&#xff0c;共24题。题型丰富多样&#xff0c;包括图形变换题、分…

C语言学习记录(16)文件操作7

前面学的东西感觉都跟写代码有关系&#xff0c;怎么突然就开始说文件了&#xff0c;有什么用呢&#xff1f; 其实&#xff0c;文件是另一种数据存储的方式&#xff0c;学会使用文件就可以让我们的数据持久的保存。 一、文件是什么 就算没有学过相关的知识&#xff0c;在这么…

《作用域大冒险:从闭包到内存泄漏的终极探索》

“爱自有天意&#xff0c;天有道自不会让有情人分离” 大家好&#xff0c;关于闭包问题其实实际上是js作用域的问题&#xff0c;那么js有几种作用域呢&#xff1f; 作用域类型关键字/场景作用域范围示例全局作用域var&#xff08;无声明&#xff09;整个程序var x 10;函数作用…

让数据应用更简单:Streamlit与Gradio的比较与联系

在数据科学与机器学习的快速发展中&#xff0c;如何快速构建可视化应用成为了许多工程师和数据科学家的一个重要需求。Streamlit和Gradio是两款备受欢迎的开源库&#xff0c;它们各自提供了便捷的方式来构建基于Web的应用。虽然二者在功能上有许多相似之处&#xff0c;但它们的…

LlamaIndex 生成的本地索引文件和文件夹详解

LlamaIndex 生成的本地索引文件和文件夹详解 LlamaIndex 在生成本地索引时会创建一个 storage 文件夹&#xff0c;并在其中生成多个 JSON 文件。以下是每个文件的详细解释&#xff1a; 1. storage 文件夹结构 1.1 docstore.json 功能&#xff1a;存储文档内容及其相关信息。…

AndroidRom定制删除Settings某些菜单选项

AndroidRom定制删除Settings某些菜单选项 1.前言. 最近在Rom开发中需要隐藏设置中的某些菜单&#xff0c;launcher3中的定制开发&#xff0c;这个属于很基本的定制需求&#xff0c;和隐藏google搜素栏一样简单&#xff0c;这里我就不展开了&#xff0c;直接上代码. 2.隐藏网络…

【数据结构和算法】3. 排序算法

本文根据 数据结构和算法入门 视频记录 文章目录 1. 排序算法2. 插入排序 Insertion Sort2.1 概念2.2 具体步骤2.3 Java 实现2.4 复杂度分析 3. 快排 QuickSort3.1 概念3.2 具体步骤3.3 Java实现3.4 复杂度分析 4. 归并排序 MergeSort4.1 概念4.2 递归具体步骤4.3 Java实现4.4…

FreeRTos学习记录--2.内存管理

后续的章节涉及这些内核对象&#xff1a;task、queue、semaphores和event group等。为了让FreeRTOS更容易使用&#xff0c;这些内核对象一般都是动态分配&#xff1a;用到时分配&#xff0c;不使用时释放。使用内存的动态管理功能&#xff0c;简化了程序设计&#xff1a;不再需…

HAL库(STM32CubeMX)——高级ADC学习、HRTIM(STM32G474RBT6)

系列文章目录 文章目录 系列文章目录前言存在的问题HRTIMcubemx配置前言 对cubemx的ADC的设置进行补充 ADCs_Common_Settings Mode:ADC 模式 Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选 ADC_Se…

单例模式(线程安全)

1.什么是单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;旨在确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。这种模式涉及到一个单一的类&#xff0c;该类负责创建自己的对象&#xff0c;同时确保只有单…

FreeRTos学习记录--1.工程创建与源码概述

1.工程创建与源码概述 1.1 工程创建 使用STM32CubeMX&#xff0c;可以手工添加任务、队列、信号量、互斥锁、定时器等等。但是本课程不想严重依赖STM32CubeMX&#xff0c;所以不会使用STM32CubeMX来添加这些对象&#xff0c;而是手写代码来使用这些对象。 使用STM32CubeMX时&…

进程控制(linux+C/C++)

目录 进程创建 写时拷贝 fork 进程终止 退出码 进程退出三种情况对应退出信号 &#xff1a;退出码&#xff1a; 进程退出方法 进程等待 两种方式 阻塞等待和非阻塞等待 小知识 进程创建 1.在未创建子进程时&#xff0c;父进程页表对于数据权限为读写&#xff0c;对于…

TensorBoard如何在同一图表中绘制多个线条

1. 使用不同的日志目录 TensorBoard 会根据日志文件所在的目录来区分不同的运行。可以为每次运行指定一个独立的日志目录&#xff0c;TensorBoard 会自动将这些目录中的数据加载并显示为不同的运行。 示例&#xff08;TensorFlow&#xff09;&#xff1a; import tensorflow…

微软Entra新安全功能引发大规模账户锁定事件

误报触发大规模锁定 多家机构的Windows管理员报告称&#xff0c;微软Entra ID新推出的"MACE"&#xff08;泄露凭证检测应用&#xff09;功能在部署过程中产生大量误报&#xff0c;导致用户账户被大规模锁定。这些警报和锁定始于昨夜&#xff0c;部分管理员认为属于误…

基于FPGA的一维时间序列idct变换verilog实现,包含testbench和matlab辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 DCT离散余弦变换 4.2 IDCT逆离散余弦变换 4.3 树结构实现1024点IDCT的原理 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) matlab仿真结果 FPGA仿真结果 由于FP…

Linux进程5-进程通信常见的几种方式、信号概述及分类、kill函数及命令、语法介绍

目录 1.进程间通信概述 1.1进程通信的主要方式 1.2进程通信的核心对比 2.信号 2.1 信号的概述 2.1.1 信号的概念 2.2信号的核心特性 2.3信号的产生来源 2.4信号的处理流程 2.5关键系统调用与函数 2.6常见信号的分类及说明 2.6.1. 标准信号&#xff08;Standard Sig…

[架构之美]一键服务管理大师:Ubuntu智能服务停止与清理脚本深度解析

[架构之美]一键服务管理大师&#xff1a;Ubuntu智能服务停止与清理脚本深度解析 服务展示&#xff1a; 运行脚本&#xff1a; 剩余服务&#xff1a; 一、脚本设计背景与核心价值 在Linux服务器运维中&#xff0c;服务管理是日常操作的重要环节。本文介绍的智能服务管理脚本&a…

C++算法(10):二叉树的高度与深度,(C++代码实战)

引言 在二叉树的相关算法中&#xff0c;高度&#xff08;Height&#xff09;和深度&#xff08;Depth&#xff09;是两个容易混淆的概念。本文通过示例和代码实现&#xff0c;帮助读者清晰区分二者的区别。 定义与区别 属性定义计算方式深度从根节点到该节点的边数根节点深度…

Psychology 101 期末测验(附答案)

欢呼 啦啦啦~啦啦啦~♪(^∇^*) 终于考过啦~ 开心(*^▽^*) 撒花✿✿ヽ(▽)ノ✿ |必须晒下证书: 判卷 记录下判卷,还是错了几道,填空题2道压根填不上。惭愧~ 答案我隐藏了,实在想不出答案的朋友可以留言,不定时回复。 建议还是认认真真的学习~认认真真的考试~,知识就…