Java——简单图书管理系统

news2024/11/25 19:53:21

前言:

  • 一、图书管理系统是什么样的?
  • 二、准备工作
    • 分析有哪些对象?
    • 画UML图
  • 三、实现三大模块
    • 用户模块
    • 书架模块
    • 管理操作模块
      • 管理员操作有这些
      • 普通用户操作有这些
  • 四、Test测试类
  • 五、拓展

哈喽,大家好,我是无敌小恐龙。
写一个图书管理系统,可以回顾以前所学习是知识:数据类型,变量,if ,for,数组,方法,类和对象,封装,继承,多态,抽象类和接口。把这些知识串起来,不仅可以加深我们对知识的理解,还可以初步理解做一个系统是什么流程,资源包也上传了哦。

一、图书管理系统是什么样的?

请看如下动图:
在这里插入图片描述
在这里插入图片描述

程序一运行:开始先输入名字,在输入身份是否为管理员还是普通用户,最终就是一些操作了。这就是要做的简单图书管理系统了,心理暗自说:还是蛮简单的嘛,嘿嘿嘿。重点是学Java面向对象的开发思想哟!!!对象与对象之间的联系。

二、准备工作

分析有哪些对象?

用户: 管理员 普通用户
书:Book 书架
一些操作: 操作的是书架

画UML图

三大模块:用户模块,书架模块,管理操作模块
在这里插入图片描述

三、实现三大模块

用户模块

用户分为管理员和普通用户,可以抽象出一个公共的类:User(abstract) 其子类有Admin,NormalUser。放入一个包User中。
User

package User;

import Book.Bookshelf;
import Operation.IOOperation;

public abstract class User {
	//用户名
    protected String name;
    //用户的管理操作
    protected IOOperation[] operations;

    public User(String name) {
        this.name = name;
    }
	
	//抽象的菜单方法,应为不同的用户有不同的实现菜单方式,返回值为int 返回 你要选择那个?
    public abstract int menu();
	//不同的用户,不是也有不同的操作吗?
	//注意:操作的是书架
	//答:采用了多态
    public void doOperation(int option,Bookshelf bookshelf) {
        operations[option].work(bookshelf);
    }


}

Admin

package User;

import Operation.*;
import java.util.Scanner;
public class Admin extends User{

    public Admin(String name) {
        super(name);
        //不同的用户操作不同,直接在用户初始化时,就决定了有那些操作了--->直接赋值
        this.operations = new IOOperation[]{
                new ExitSystemOperate(),
                new FindBookOperate(),
                new AddBookOperate(),
                new DeleteBookOperate(),
                new ShowBookOperate(),
        };
    }
	
	//重写自己的菜单方法
    @Override
    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. 退出图书");
        System.out.println("********************");
        System.out.println("请输入选项:");
        
        Scanner s = new Scanner(System.in);
        int option = s.nextInt();
        return option;

    }

}

NormalUser:

package User;

import Operation.*;
import java.util.Scanner;

public class NormalUser extends User{

    public NormalUser(String name) {
        super(name);
        this.operations = new IOOperation[]{
                new ExitSystemOperate(),
                new FindBookOperate(),
                new BorrowBookOperate(),
                new BackBookOperate()
        };
    }
    public int menu() {
        System.out.println("******普通用户菜单*******");
        System.out.println("1. 查找图书");
        System.out.println("2. 借阅图书");
        System.out.println("3. 归还图书");
        System.out.println("0. 退出图书");
        System.out.println("********************");
        System.out.println("请输入选项:");

        Scanner s = new Scanner(System.in);
        int option = s.nextInt();
        return option;

    }


}


书架模块

书类:

package Book;

public class Book {
    private String name; //书名
    private String author; //作者
    private double price; //价格
    private String type; //类型
    private Boolean isBorrow; //是否借出

	//isBorrow 不能出现在构造方法中,书的借出是要看有人借了才是借出状态,且全局变量初始就是false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
        this.isBorrow = false;
    }

    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 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 Boolean getBorrow() {
        return isBorrow;
    }

    public void setBorrow(Boolean borrow) {
        isBorrow = borrow;
    }

	//重写toString方法,输出时更看得懂,更好看些,用来展示书本的功能!
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", "+(isBorrow==true?"已借出":"在馆")+
                '}';
    }
}

书架:

package Book;

public class Bookshelf {

	//书架采用数组的形式存储书本,整个系统的操作都在维系着这个书数组!!!
    private Book[] bookList = new Book[10];
    //书数组已经使用的空间
    private int usedSize;

	//我们在这里,对书架初始化时就先放入了三本书了,这就是为什么上述动图,一查看书就有三本书了。
    public Bookshelf() {
        this.bookList[0] = new Book("三国演义","罗贯中",9.9,"小说");
        this.bookList[1] = new Book("西游记","吴承恩",19.9,"小说");
        this.bookList[2] = new Book("红楼梦","曹雪芹",29.9,"小说");
        this.usedSize = 3;

    }

    public Book[] getBookList() {

        return bookList;
    }
	
	//书是一本本存入
    public void setBook(Book book) {

        this.bookList[this.usedSize] = book;
        this.usedSize++;

    }
	//取书的话,要看书的位置(下标)
    public Book getBook(int pos) {
        return this.bookList[pos];
    }

    public int getUsedSize() {
        return usedSize;
    }

    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}

管理操作模块

这么多的操作,就要用到接口IOOperation了has a 有这种操作work(),对书架的操作,书架里有书的数组work(Bookshelf bookshelf)!!!
IOOperation

package Operation;

import Book.Bookshelf;

public interface IOOperation {
    void work(Bookshelf bookshelf);

}

管理员操作有这些

增加一本书

package Operation;
import Book.*;
import java.util.Scanner;

public class AddBookOperate implements IOOperation{

    @Override
    public void work(Bookshelf bookshelf) {
        Scanner s = new Scanner(System.in);

        System.out.println("新增图书........");
        System.out.println("请输入书名:");
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();
        //判断图书已满吗?
        if(bookshelf.getUsedSize()==bookshelf.getBookList().length) {
            System.out.println("馆里图书已满,不能新增图书!");
            return;
        }

        //判断书是否已经存在了
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println("图书管已存在"+"《"+name+"》"+",新增失败!");
                return;
            }
        }
        //不存在,即可新增!
        System.out.println("请输入输入作者:");
        String author = s.nextLine();
        System.out.println("请输入输入价格:");
        double price = s.nextDouble();
        System.out.println("请输入输入书的类型:");
        s.nextLine();
        String type = s.nextLine();
        Book book = new Book(name,author,price,type);
        bookshelf.setBook(book);

        bookshelf.setUsedSize(bookshelf.getUsedSize()+1);
        System.out.println("新增图书"+name+"成功!");


    }
}

删除一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class DeleteBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("删除图书........");
        System.out.println("请输入你要删除的图书:");
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();
        Boolean isBook = false;
        int pos = -1;
        //判断图书是否存在
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                isBook = true;
                pos = i;
            }
        }
        //不存在
        if(isBook==false) {
            System.out.println("删除图书失败。"+"馆里还没有这本 "+name+" 书");
        } else {
            //存在就删除这本我不想要的书

            //以下为从数组删除这本书的方法
            //如果为最后一本图书,特判,直接置为null
            if(pos==bookshelf.getUsedSize()-1) {
                books[pos] = null;
            }
            else{
                //不是最后一本,则按这种算法
                for (int i = pos; i < bookshelf.getUsedSize()-1; i++) {
                    if(name.equals(books[i].getName())) {
                        books[i] = books[i+1];
                    }
                }
            }
            //最后修改使用的大小
            bookshelf.setUsedSize(bookshelf.getUsedSize()-1);
        }

    }
}

展示所有的书

package Operation;

import Book.Book;
import Book.Bookshelf;

public class ShowBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("显示图书........");

        Book[] books = bookshelf.getBookList();
        //遍历打印
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            System.out.println(books[i]);
        }

    }
}

退出图书馆里系统

package Operation;

import Book.Bookshelf;

public class ExitSystemOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {
        System.out.println("退出图书系统........");
        System.exit(0);

    }
}

普通用户操作有这些

借一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class BorrowBookOperate implements IOOperation{
    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("借阅图书........");

        Scanner s = new Scanner(System.in);
        System.out.println("请输入你要借阅的图书:");
        String name = s.nextLine();
        Book[] books = bookshelf.getBookList();


        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName()) ) {
                if(books[i].getBorrow()==false) {
                    //如果馆里有这本书,且还没被借走!
                    System.out.println("借阅"+name+"成功!");
                    books[i].setBorrow(true);
                    return;
                }
                System.out.println("借阅失败。"+name+" 已被借出。");
                return;
            }
        }

        System.out.println("借阅失败。"+"馆里还没有这本 "+name+" 书");

    }
}

归还一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class BackBookOperate implements IOOperation{

    @Override
    public void work(Bookshelf bookshelf) {
        System.out.println("归还图书........");
        Scanner s = new Scanner(System.in);
        System.out.println("请输入你要归还的图书:");
        String name = s.nextLine();


        Book[] books = bookshelf.getBookList();
        //遍历书架,看是否有归还的这本书。总不能不是我们管的书,我还收下吧!!!
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println("归还"+name+"成功!");
                books[i].setBorrow(false);
                return;
            }
        }

        System.out.println("归还失败。"+"馆里还没有这本 "+name+" 书");
    }
}

查找一本书

package Operation;

import Book.Book;
import Book.Bookshelf;

import java.util.Scanner;

public class FindBookOperate implements IOOperation{
    public void work(Bookshelf bookshelf) {

        System.out.println("查找图书........");
        Scanner s = new Scanner(System.in);
        System.out.println("请输入要查找的图书:");

        String name = s.nextLine();
        //遍历书架
        Book[] books = bookshelf.getBookList();
        for (int i = 0; i < bookshelf.getUsedSize(); i++) {
            if(name.equals(books[i].getName())) {
                System.out.println(books[i]);
                return;
            }


        }
        System.out.println("馆里还没有这本 "+name+" 书");


    }
}

退出图书馆里系统,和Admin一样的。

四、Test测试类

整个系统都在围绕书数组,所以要先new Bookshelf()。
在根据用户是什么身份,给其new 什么身份,再获取用户要进行那个操作,穿个给doOperation(option,bookshelf)。

import Book.*;
import User.*;

import java.util.Scanner;

public class Test {
    public static User log() {
        System.out.println("请输入你的姓名:");
        Scanner s = new Scanner(System.in);
        String name = s.nextLine();
        System.out.println("请输入你的身份: 1:管理员   2:普通用户");
        int id = s.nextInt();
        System.out.println("欢迎"+name+"来到图书管理系统");
        if(id==1) {
            return new Admin(name);
        } else if(id==2) {
            return new NormalUser(name);
        } else {
            System.out.println("输入错误,请重新输入!");
            return null;
        }


    }
    public static void main(String[] args) {

        Bookshelf bookshelf = new Bookshelf();
        User user = log();

        while(true) {

            int option =  user.menu();
            user.doOperation(option,bookshelf);

        }

    }
}

五、拓展

怎么进行数据的保存,数据库。
功能拓展:书名,价格,作者名排序

感谢铁子能看到这里。希望有所收获,如果有哪些不对的地方还请大方指正
在这里插入图片描述

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

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

相关文章

评书下载到u盘,下载到内存卡,下载到手机或电脑的方法

评书下载的方法有很多种&#xff0c;无论是通过什么方法&#xff0c;我们都可以快速的获取喜爱的评书。下面将详细介绍常见的评书下载方法&#xff0c;帮助您快速上手。 1、搜索“十方评书网”。 2、要下载那个评书家的选择那个评书家就可以。 3、点击进去后可以一键下载单部评…

C语言详解(结构体)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#xff0c;在这里撰写成文一…

英语学习笔记33——A fine day

A fine day 风和日丽 词汇 Vocabulary day n. 日子&#xff0c;白天 复数&#xff1a;days 常见节日&#xff1a;Mothers’ Day 母亲节      Fathers’ Day 父亲节      Teachers’ Day 教师节      Children’s Day 儿童节      Women’s Day 妇女节 c…

美银美林:看好铜价涨到12000美元,这类铜矿企业弹性更大

美银美林指出&#xff0c;考虑到能源转型以及AI投资热潮对铜的需求巨大&#xff0c;到2026年铜供需缺口有望扩大一倍。给予紫金矿业、江西铜业等多家巨头买入评级&#xff0c;并认为一旦铜价上行&#xff0c;KGHM等规模较小、成本较高的企业的利润增长可能更为显著。 高盛、花…

OpenCV-绘制虚线

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 功能函数 // 绘制虚线 void DrawDottedLine(cv::Mat &input, cv::Point p1, cv::Point p2, cv::Scalar color, int thickne…

9.2 Go 接口的实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Pytorch 从零实现 Transformer

前言 之前虽然了解过 Transformer 架构&#xff0c;但是没有自己实现过。 最近阅读 transformers 库中 Llama 模型结构&#xff0c;于是想试着亲手实现一个简单的 Transformer。 在实现过程中加深了理解&#xff0c;同时发现之前阅读 Llama 中一些错误的地方&#xff0c;因此…

在Anaconda中安装keras-contrib库

文章目录 1. 有git2. 无git2.1 步骤12.2 步骤22.3 步骤3 1. 有git 如果环境里有git&#xff0c;直接运行以下命令&#xff1a; pip install githttps://www.github.com/farizrahman4u/keras-contrib.git2. 无git 2.1 步骤1 打开网址&#xff1a;https://github.com/keras-tea…

Application UI

本节包含关于如何用DevExpress控件模拟许多流行的应用程序ui的教程。 Windows 11 UI Windows 11和最新一代微软Office产品启发的UI。 Office Inspired UI Word、Excel、PowerPoint和Visio等微软Office应用程序启发的UI。 如何&#xff1a;手动构建Office风格的UI 本教程演示…

微服务第二轮

学习文档 背景 由于每个微服务都有不同的地址或端口&#xff0c;入口不同 请求不同数据时要访问不同的入口&#xff0c;需要维护多个入口地址&#xff0c;麻烦 前端无法调用nacos&#xff0c;无法实时更新服务列表 单体架构时我们只需要完成一次用户登录、身份校验&#xff…

Uber 提升 Presto 集群稳定性的 GC 调优方法

Presto at Uber Uber 利用开源的 Presto 查询各种数据源&#xff0c;无论是流式还是归档数据。Presto 的多功能性赋予我们做出基于数据的明智商业决策的能力。我们在两个地区运行了大约20个 Presto 集群&#xff0c;总共超过10,000个节点。我们有大约12,000个每周活跃用户&…

【python010】获取任意多边形区域内的经纬度点并可视化

1.熟悉、梳理、总结项目研发实战中的Python开发日常使用中的问题、知识点等&#xff0c;如获取任意多边形区域内的经纬度点并可视化&#xff0c;找了N篇文章没发现有效的解决方案。 2.欢迎点赞、关注、批评、指正&#xff0c;互三走起来&#xff0c;小手动起来&#xff01; 3.欢…

Here Doucument

一、Here Document概述 1.概念 使用I/0重定向的方式将命令列表提供给交互式程序 标准输入的一种替代品 2.语法格式 命令 <<标记 标记 3.注意事项 标记可以使用任意合法字符&#xff08;通常为EOF&#xff09; 结尾的标记一定要顶格写&#xff0c;前面不能有任何字符…

【爬虫实战项目一】Python爬取豆瓣电影榜单数据

目录 一、环境准备 二、编写代码 2.1 分页分析 2.2 编码 一、环境准备 安装requests和lxml pip install requests pip install lxml 二、编写代码 2.1 分页分析 编写代码前我们先看看榜单的url 我们假如要爬取五页的数据&#xff0c;那么五个url分别是&#xff1a; htt…

关于智慧校园建设的几点建议

随着科技的迅猛发展&#xff0c;智慧校园建设已成为现代教育的重要组成部分&#xff0c;对于提升教育质量、改善学生学习环境具有重要意义。为此&#xff0c;我提出以下几点建议&#xff0c;以帮助智慧校园建设更加有效和可持续。 首先&#xff0c;应注重基础设施建设。智慧校园…

java 实现导出word 自定义word 使用aspose教程包含图片 for 循环 自定义参数等功能

java 实现导出word 主要有一下几个知识点 1&#xff0c;aspose导入 jar包 和 java编写基础代码下载使用 aspose-words jar包导入 aspose jar 包 使用 maven导入java代码编写 2&#xff0c;if判断 是否显示2&#xff0c;显示指定值3&#xff0c;循环显示List 集合列表 使用 fore…

【CTF MISC】XCTF GFSJ0290 reverseMe Writeup(图像处理)

reverseMe 暂无 解法 导入 Photoshop。 水平翻转&#xff0c;得到 flag。 Flag flag{4f7548f93c7bef1dc6a0542cf04e796e}声明 本博客上发布的所有关于网络攻防技术的文章&#xff0c;仅用于教育和研究目的。所有涉及到的实验操作都在虚拟机或者专门设计的靶机上进行&#xf…

住宿管理系统 java+jsp+web三件套

文章目录 1、简要介绍2、数据库设计3、中间遇到的困难一、数据问题二、文件问题 4、项目 写了将近3周&#xff0c;人都写麻了 记录下&#xff0c;第一个 ss 代码 仅仅使用了layui作为前端UI框架&#xff0c;因为另一个项目用的也是他&#xff0c;感觉一些组件比较好用 后端是j…

Leetcode:三数之和

题目链接&#xff1a;15. 三数之和 - 力扣&#xff08;LeetCode&#xff09; 普通版本&#xff08;排序 双指针法&#xff09; 分析&#xff1a; 1、我们可以通过三个循环嵌套找到符合题目要求的三元组组合 2、但由于题目要求中的三元组i、j、k并不要求连续&#xff0c;所以会…

大模型的发展历程

1、早期模型的探索与局限性 1.1早期模型的探索与局限性 从早期的符号逻辑到现代的深度学习 1 模型&#xff0c;AI 领域经历了数十年的探索和迭代&#xff0c;为后续突破打下了坚实基础。随着大数据的发展和 AI 计算能力的爆炸式增长&#xff0c;深度学习模型的崛起显得尤为突出…