实战项目——用Java实现图书管理系统

news2024/10/6 0:31:55

前言

首先既然是管理系统,那咱们就要实现以下这几个功能了-->

分析

1.首先是用户分为两种,一个是管理员,另一个是普通用户,既如此,可以定义一个用户类(user),在定义管理员类,普通用户类去继承。

2.还有就是书这个对象,首先是书的属性(书名,作者,价格,种类,是否借出),这可以定义成一个Book类,其实就是存储这些新的容器-- 书架类(Booklist)

3.最后这些功能,仔细观察,由于身份不同,操作也不同,一般来讲,我们可以把对应的方法放到对应的类当中去,但这次用接口也可以巧妙实现

分模块进行编码

book包

 为了方便查看,就把这两个类放进一个book的包里。

Book类

package book;

public class Book {
    private String name;//姓名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isLead;//是否被借出

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

    public void setLead(boolean lead) {
        isLead = lead;
    }
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public String toString() {
        return "book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                (isLead==true ? "已借出":" 未借出")+
                //", isLead=" + isLead +
                '}';
    }
}

在这个类中,把书的属性成员定义为私有,通过公共成员函数去访问和调用,最后重写toString 方法来表示输出。

Booklist类

package book;

public class Booklist {
    private Book[] books =new Book[10];
    private int usedSize;//记录存放次数

    public Booklist() {
        books[0]=new Book("红楼梦","曹雪芹",25,"小说");
        books[1]=new Book("月华","小明",27,"小说");
        books[2]=new Book("多少","小花",20,"小说");
        this.usedSize=3;
    }

    public boolean isFull(){//判断书架是否满
        if(this.usedSize==books.length){
            return true;
        }else{
            return false;
        }
    }
    public int getUsedSize() {//获取存了多少本书
        return usedSize;
    }
    //设定书的数量
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }

    public Book getBooks(int pos) {//获取书架中pos位置书的信息
        return books[pos];
    }
    //把新增的图书信息放到pos位置上去
    public void setBooks(int pos,Book book) {
        books[pos]=book;
    }

}

 在这个书架类中,定义一个容量为10的对象数组来存储书的信息,事先存入三本书,同时usedSize 用来记录书的数量,而后面的方法则与实现对应的功能相关。且往后细看~接口类

package operater;

import book.Booklist;

public interface IOperation {
    void work(Booklist booklist);
}

在这个接口里定义了一个方法 ​work​,该方法需要一个 ​Booklist​ 对象作为参数。任何实现 ​IOperation​ 接口的类都必须提供 ​work​ 方法的具体实现。这样一来就方便不同的用户进行操作了。

User包

user类

package User;

import book.Booklist;
import operater.IOperation;

// 定义一个抽象类 user,表示用户
public abstract class user {
    protected String name;

    // 构造方法,初始化用户名称
    public user(String name) {
        this.name = name;
    }

    //抽象方法,显示菜单并返回用户选择的操作编号
    public abstract int menu();

    //存储用户可以执行的操作数组
    protected IOperation[] iOperations;

    //根据用户选择执行相应的操作
    public void DoIoperation(int choice, Booklist booklist) {
        //调用用户选择的操作的 work 方法
        this.iOperations[choice].work(booklist);
    }
}

因为身份不同,所以显示的菜单也不同,所以便声明一个抽象方法 menu(),同时定义一个操作数组,来进行对应的操作,如图

普通用户类(Normaluser)

package User;

import operater.*;

import java.util.Scanner;

public class Normaluser extends user{
    //重写构造方法
    public Normaluser(String name) {
        super(name);
       //根据不同的输入进行对应的操作,已经方法按顺序放入数组,所以位置别搞错了
        this.iOperations=new IOperation[]{
          new Exit(),
          new Find(),
          new Borrow(),
          new Return()
        };
    }

    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("请输入你的操作:");
        Scanner scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;

    }
}

管理员类(Adminuser)

package User;

import operater.*;

import java.util.Scanner;

public class Adminuser extends user{
    public Adminuser(String name) {
        super(name);
        this.iOperations=new IOperation[]{
                new Exit(),
                new Find(),
                new Add(),
                new Del(),
                new Show()
        };
    }
    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 scanner=new Scanner(System.in);
        int choice=scanner.nextInt();
        return choice;
    }
    }


operater包

Add类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Add implements IOperation{
    public void work(Booklist booklist1){

        if(booklist1.isFull()){
            System.out.println("书架已满,不能新增!");
        }
        System.out.println("新增图书");
        System.out.println("请输入你要新增的图书的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        System.out.println("请输入你要新增的图书的作者:");
        String bookAuthor= scanner.nextLine();

        System.out.println("请输入你要新增的图书的价格:");
        int bookPrice = scanner.nextInt();
        scanner.nextLine();

        System.out.println("请输入你要新增的图书的类型:");
        String bookType = scanner.nextLine();

        Book book=new Book(bookName,bookAuthor,bookPrice,bookType);

        int currentSize=booklist1.getUsedSize();//新增图书的位置其实就是i本书的位置
        booklist1.setBooks(currentSize,book);
        booklist1.setUsedSize(currentSize+1);//书的数量+1
        System.out.println("成功添加图书");
    }
}

在新增图书的过程中,要分别添加书的属性才行,这时切不可直接用booklist,这时类对象,不是数组,创建一个对象数组book,之前Booklist中方法便派上用场, 看图就更好理解了~

Borrow类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Borrow implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("借阅图书");
        System.out.println("请输入你要借阅的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要借阅的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(true);
                System.out.println("借阅成功!");
                return;
            }
        }
        System.out.println("借阅失败!");
    }
    }

借阅图书其实和删除差不多,只要改变状态为已借出。

Del类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Del implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("删除图书");
        System.out.println("请输入你要删除的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        int current=booklist1.getUsedSize();

        int pos=-1;
        int i = 0;
        //找到要删除的书的下标
        for (; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                //System.out.println("找到了");
                pos=i;
            }
        }
        if(pos>=current){
            System.out.println("没有你要找的书!");
    }
        //开始删除
        for (int j = pos; j <current-1; j++) {
           // booklist1[j]=booklist1[j+1];不能直接用类对象

            Book book= booklist1.getBooks(j+1);
            booklist1.setBooks(j,book);
        }
        booklist1.setUsedSize(current-1);
        booklist1.setBooks(current-1,null);
        System.out.println("删除成功!");

    }
}

删除图书,首先要找到要删除图书的下标pos, 找到后要把后面的图书全都往前移动一格,从pos位置开始遍历,将j+1位置的图书存放到book对象中去,在调用setBook方法传给j位置。后面的位置设置成null,同时更新书的数量~

Exit类

package operater;

import book.Booklist;

public class Exit implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("退出系统");

        //避免退出系统后内存被回收
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            booklist1.setBooks(i,null);
        }

        System.exit(0);

    }
}

 直接调用系统的退出即可~

Find类

package operater;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Find implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("查找图书");
        System.out.println("请输入你要查找的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();
        
        int current=booklist1.getUsedSize();
        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
            if(bookName.equals(book1.getName())) {
                System.out.println("找到了");
                System.out.println(book1);
                return;
            }
        }
            System.out.println("没找到这本书!");
        }
}

Return类

package operater;

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

public class Return implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("归还图书....");
        System.out.println("请输入你要归还的书名:");
        Scanner scanner=new Scanner(System.in);
        String bookName=scanner.nextLine();

        //找到要归还的书的下标
        for (int i=0; i < booklist1.getUsedSize() ; i++) {
            Book book1=booklist1.getBooks(i);
            if(book1.getName().equals(bookName)) {
                book1.setLead(false);
                System.out.println("归还成功!");
                return;
            }
        }
        System.out.println("归还失败!");
    }
    }

Show类

package operater;

import book.Book;
import book.Booklist;

public class Show implements IOperation{
    public void work(Booklist booklist1){
        System.out.println("展示图书");
        int current=booklist1.getUsedSize();

        for (int i = 0; i < current ; i++) {
            Book book1=booklist1.getBooks(i);
                System.out.println(book1);
        }
    }
}

这三个其实是大同小异的,都是循环遍历再进行对应的操作,这里主要记住的是String类型的数据比较不能直接用==,而是要用equals()方法。

看到最后,如果觉得文章写得还不错,希望可以给我点个小小的赞,您的支持是我更新的最大动力

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

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

相关文章

【后端面试题】【中间件】【NoSQL】MongoDB提高可用性的方案(主从结构、仲裁节点、分片、写入语义)

主从结构 MongoDB的高可用和别的中间件的高可用方案基本类似。比如在MySQL里&#xff0c;接触了分库分表和主从同步&#xff1b;在Redis里&#xff0c;Redis也有主从结构&#xff1b;在Kafka里&#xff0c;分区也是有主从结构的。 所以先介绍启用了主从同步 我们的系统有一个关…

【AIGC】DiffuToon:稳定的视频卡通化技术方案

论文&#xff1a;https://arxiv.org/pdf/2401.16224 github&#xff1a;https://github.com/modelscope/DiffSynth-Studio/tree/main/examples/Diffutoon 网络结构 两个主要分支&#xff1a;主要的卡通化管线和编辑分支 重要技术 使用了fastblend(无需模型的视频帧之间的平滑…

巴图自动化Profinet协议转Modbus协议模块接称重模块与PLC通讯

巴图自动化Profinet协议转Modbus协议模块&#xff08;BT-MDPN10&#xff09;是一种能够实现Modbus协议和Profinet协议之间转换的设备。Profinet协议转Modbus协议模块可提供单个或多个RS485接口&#xff0c;使得不同设备之间可以顺利进行通信&#xff0c;进一步提升了工业自动化…

IPFoxy Tips:为什么要选择动态住宅代理IP?

在大数据时代的背景下&#xff0c;代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性&#xff0c;而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

花两天手撸海纳嗨数数据分析系统,实现数据分析自给自足

我发现一款超好用的数据分析营销系统&#xff0c;且支持免费私有化部署。 机器准备 机器角色配置10.0.21.85主8核&#xff0c;12G&#xff0c;100G&#xff0c;Centos7.910.0.221.51辅8核&#xff0c;12G&#xff0c;100G&#xff0c;Centos7.910.0.221.55辅8核&#xff0c;12…

x86芯片定制,Ethercat芯片定制,适用于运动控制,工业总线等软硬一体机

x86芯片定制&#xff0c;Ethercat芯片定制 X86平台 我们的研发工程师已经积累了非常丰富的主板、整机设计经验&#xff0c;对接您的产品规格场景需求&#xff0c;快速交付样机&#xff0c;包含主板、BOX整机、平板电脑、CPCI等形态产品。降本、长生命周期、快速交付、及时响应…

电影院售票管理系统(小白)大佬求解

最近在写一个关于电影院售票管理系统的sm项目&#xff0c;但是在买票的环节出现了问题及点击选座购票&#xff0c;没有数据渲染出来&#xff0c;我不知道什么情况&#xff0c;所以问问。有没有大佬可以帮我解决这个问题&#xff1f;下面是我的。控制层&#xff0c;服务层&#…

systemctl命令使用

systemctl 作用&#xff1a;可以控制软件&#xff08;服务&#xff09;的启动、关闭、开机自启动 系统内置服务均可被systemctl控制第三方软件&#xff0c;如果自动注册了可以被systemctl控制第三方软件&#xff0c;如果没有自动注册&#xff0c;可以手动注册 语法 systemct…

《数据结构与算法基础 by王卓老师》学习笔记——2.5线性表的链式表示与实现1

1.链式表示 2.链表举例 3.链式存储的相关术语 4.三个讨论题

生成式人工智能与虚拟资产成为BGOV 2024的焦点议题

香港&#xff0c;2024年7月2日 — 一年一度的创新科技盛事BUSINESS GOVirtual (BGOV) 科技博览及会议将于2024年7月11日至12日在香港会议展览中心隆重举行。 展览及会议焦点两大科技趋势&#xff1a;生成式人工智能 (Generative AI) 和虚拟资产 生成式人工智能( Generative A…

【CT】LeetCode手撕—199. 二叉树的右视图

目录 题目1- 思路2- 实现⭐199. 二叉树的右视图——题解思路 3- ACM 实现 题目 原题连接&#xff1a;199. 二叉树的右视图 1- 思路 使用二叉树的层序遍历 2- 实现 ⭐199. 二叉树的右视图——题解思路 class Solution {public List<Integer> rightSideView(TreeNode ro…

【高级篇】第9章 Elasticsearch 监控与故障排查

9.1 引言 在现代数据驱动的应用架构中,Elasticsearch不仅是海量数据索引和搜索的核心,其稳定性和性能直接影响到整个业务链路的健康度。因此,建立有效的监控体系和掌握故障排查技能是每一位Elasticsearch高级专家的必备能力。 9.2 监控工具:洞察与优化的利器 在Elastics…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

用随机森林算法进行的一次故障预测

本案例将带大家使用一份开源的S.M.A.R.T.数据集和机器学习中的随机森林算法&#xff0c;来训练一个硬盘故障预测模型&#xff0c;并测试效果。 实验目标 掌握使用机器学习方法训练模型的基本流程&#xff1b;掌握使用pandas做数据分析的基本方法&#xff1b;掌握使用scikit-l…

软件测试与质量保证 | 云班课选择题库

目录 第1章课后习题 第2章课后习题 第3章课后习题 第4章课后习题 第5章课后习题 第6章课后习题 第7章课后习题 第8章课后习题 第9章课后习题 第10章课后习题 第11章课后习题 第12章课后习题 第13章 测试相关未分类习题 第1章课后习题 1. 与质量相关的概念包括 &a…

HetuEngine简介

目录 HetuEngine是什么&#xff1f; HetuEngine的特点以及使用场景 特点 使用场景 HetuEngine介绍 结构 近期用到了Hetu&#xff0c;了解下这个工具是起什么作用的。 HetuEngine是什么&#xff1f; 是引擎&#xff0c;设计是为了让与当前的大数据生态完美融合的引擎&am…

Ubuntu22.04上Docker的安装

1. 使用APT安装 首先安装HTTPS传输的软件包和CA证书&#xff0c;确保软件下载过程中不被篡改。 sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y然后&#xff0c;使用国内源&#xff0c;并添加软件源的 GPG 密钥以防…

Steam夏促怎么注册 Steam夏促账号注册教程

随着夏日的炙热渐渐充斥着每一个角落&#xff0c;Steam平台也赶来添热闹&#xff0c;推出了一系列让人眼前一亮的夏季促销活动。如果你也是游戏爱好者&#xff0c;我们肯定不能错过这次的steam夏促。正直本次夏日促销有着很多的游戏迎来史低和新史低&#xff0c;有各种各样的游…

Vue3的模板语法插值表达式用法

在template中输入“5 3” &#xff0c;是没有运算能力的&#xff0c;只会把字符直接显示出来&#xff0c;代码如下&#xff1a; <template><view>这是demo</view><view>5 3</view><navigator open-type"navigateBack"><vi…

C++ 实现QT信号槽

https://github.com/libsigcplusplus/libsigcplusplus #include <iostream>/* 在sigslot.h的420,将&#xff1a; //typedef sender_set::const_iterator const_iterator; 改为&#xff1a; //typedef typename sender_set::const_iterator const_iterator;#include <…