图书管理系统初实现

news2024/12/25 13:31:46

目录

实现过程:

运行结果:


从三个模块来实现图书管理系统:书本、用户、实现的功能

实现过程:

首先在Book包下定义一个book类,包含书名、作者、价格、类型、是否借出成员变量。

这些成员变量都是私有的,因此需要构建get和set方法,为外部提供访问权限。

Book类:

package Book;

public class Book {
    //私有的
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    //提供构造方法
    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    //因为成员变量是private类型,需要提供get和set为外部提供访问权限
    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 isBorrowed() {
        return isBorrowed;
    }

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

    }

    //后续会对书进行打印
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrowed == true) ? "已借出" : "未借出") +
//                ", isBorrowed=" + isBorrowed +
                '}';
    }
}

然后构建一个类似于书架的功能,创建一个书的数组,并为私有成员变量提供set和get方法。

BookList类:

package Book;

public class BookList {
    private Book[] books = new Book[10];//书的数组
    private int usedSize;

    public int getUsedSize() {
        return usedSize;
    }

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

    public Book getBooks(int pos) {
        return books[pos];
    }

    public void setBooks(Book book, int pos) {
        this.books[pos] = book;
    }

    //提供构造方法
    public BookList() {
        this.books[0] = new Book("三国演义", "罗贯中", 10, "小说");
        this.books[1] = new Book("红楼梦", "曹雪芹", 10, "小说");
        this.books[2] = new Book("西游记", "吴承恩", 10, "小说");
        this.usedSize = 3;
    }
}

在User包中构建一个User抽象类,作为管理员和普通用户的父类,内部定义共同的功能。

构建一个功能数组来实现不同用户对应的不同功能。

User类:

package User;

import Book.BookList;
import Operation.Ioperation;

import java.util.Scanner;

public abstract class User {
    protected String name;
    public Ioperation[] ioperations;//创建功能数组

    public User(String name) {
        this.name = name;
    }

    public abstract int menu();

    public static User login() {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入你的名字:");
        String username = sc.nextLine();
        System.out.println("请输入你的身份:1.管理员 2.普通用户");
        int userType = sc.nextInt();
        if (userType == 1) {
            return new AdminUser(username);
        } else if (userType == 2) {
            return new NormalUser(username);
        } else {
            return null;
        }
    }

    public void doWork(int choice, BookList bookList) {
        this.ioperations[choice].work(bookList);
    }
}

AdminUser类:

package User;

import Operation.*;

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 DelOperation(),
                new ShowOperation()
        };
    }

    @Override
    public int menu() {
        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.print("请输入你的操作:");
        int choice = -1;
        Scanner sc = new Scanner(System.in);
        choice = sc.nextInt();
        return choice;
    }
}

NormalUser类:

package User;

import Operation.*;

import java.util.Scanner;

public class NormalUser extends User {
    public NormalUser(String username) {
        super(username);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BorrowOperation(),
                new ReturnOperation()
        };
    }

    @Override
    public int menu() {
        System.out.println(this.name + "," + "欢迎来到普通用户菜单");
        System.out.println("--------------------------");
        System.out.println("1.查找图书");
        System.out.println("2.借阅图书");
        System.out.println("3.归还图书");
        System.out.println("0.退出系统");
        System.out.print("请输入你的操作:");
        int choice = -1;
        Scanner sc = new Scanner(System.in);
        choice = sc.nextInt();
        return choice;
    }
}

Operation包用来实现功能,构建一个接口对这些功能进行一个规范:

Ioperation接口:

package Operation;

import Book.BookList;

public interface Ioperation {
    public void work(BookList bookList);
}

AddOperation类:

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class AddOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入书的名字:");
        String bookName = scanner.nextLine();
        System.out.print("请输入书的作者:");
        String author = scanner.nextLine();
        System.out.print("请输入书的类型:");
        String type = scanner.nextLine();
        System.out.print("请输入书的价格:");
        int price = scanner.nextInt();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookName.equals(bookList.getBooks(i).getName())) {
                System.out.println("该本书已存在");
                return;
            }
        }
        bookList.setBooks(new Book(bookName, author, price, type), bookList.getUsedSize());
        System.out.println("新增成功!");
        bookList.setUsedSize(bookList.getUsedSize() + 1);
    }
}

BorrowOperation类:

package Operation;

import Book.BookList;

import java.util.Scanner;

public class BorrowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要借的书的名字:");
        String bookName = scanner.nextLine();
        int x = -1;
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookName.equals(bookList.getBooks(i).getName()) && !(bookList.getBooks(i).isBorrowed())) {
                bookList.getBooks(i).setBorrowed(true);
                x = 1;
                System.out.println("借阅成功!");
                return;
            }
        }
        if (x == -1) {
            System.out.println("没有该本书");
        }
    }
}

DelOperation类:

package Operation;

import Book.BookList;

import java.util.Scanner;

public class DelOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要删除的书的名字:");
        String bookName = scanner.nextLine();
        int x = -1, index = 0;
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookName.equals(bookList.getBooks(i).getName())) {
                x = 1;
                index = i;
                System.out.println("删除成功!");
                break;
            }
        }
        if (x == -1) {
            System.out.println("没有该本书");
        }
        for (int i = index; i < bookList.getUsedSize() - 1; i++) {
            bookList.setBooks(bookList.getBooks(i + 1), i);
        }
        bookList.setUsedSize(bookList.getUsedSize() - 1);
        bookList.setBooks(null, bookList.getUsedSize() - 1);
        System.out.println("删除成功!");
    }
}

ExitOperation类:

package Operation;

import Book.BookList;

public class ExitOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);
    }
}

FindOperation类:

package Operation;

import Book.Book;
import Book.BookList;

import java.util.Scanner;

public class FindOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要查找的书的名字:");
        String bookName = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            Book book = bookList.getBooks(i);
            if (bookName.equals(bookList.getBooks(i).getName())) {
                System.out.print("找到该本书:");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到本书");
    }
}

ReturnOperation类:

package Operation;

import Book.BookList;

import java.util.Scanner;

public class ReturnOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书");
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入要归还的书的名字:");
        String bookName = scanner.nextLine();
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            if (bookName.equals(bookList.getBooks(i).getName()) && (bookList.getBooks(i).isBorrowed())) {
                bookList.getBooks(i).setBorrowed(false);
                System.out.println("归还成功!");
                return;
            }
        }
    }
}

ShowOperation类:

package Operation;

import Book.BookList;

public class ShowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书");
        for (int i = 0; i < bookList.getUsedSize(); i++) {
            System.out.println(bookList.getBooks(i));
        }
    }
}

Main函数:

import Book.BookList;
import User.User;

public class Main {
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = User.login();
        BookList bookList1 = new BookList();
        while (true) {
            int choice = user.menu();
            user.doWork(choice, bookList);
        }
    }
}

运行结果:

管理员菜单:

普通用户菜单:

 

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

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

相关文章

算法第十六天:leetcode349.两个数组的交集

一、两个数组的交集的题目描述与链接 349.两个数组的交集如下表所示&#xff0c;您可以直接复制下面网址进入力扣学习&#xff0c;在观看下面的内容之前您一定要先做一遍哦&#xff0c;以便让你印象更加深刻&#xff01; https://leetcode.cn/problems/intersection-of-two-a…

Unity强化工程 之 音效

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 首先&#xff0c;音频这块组件较少&#xff0c;但是内容很重要&#xff0c;因为对于任何一款非特殊面向人群的游戏来说&a…

【人工智能】边缘计算与 AI:实时智能的未来

&#x1f48e; 我的主页&#xff1a;2的n次方_ &#x1f48e;1. 引言 随着物联网设备数量的爆炸性增长和对实时处理需求的增加&#xff0c;边缘计算与人工智能&#xff08;Edge AI&#xff09;成为一个热门话题。Edge AI 通过在本地设备上运行 AI 算法&#xff0c;减少对云计…

【秋招笔试】24-07-27-OPPO-秋招笔试题(算法岗)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 💡 第一题贪心模拟…

月木学途开发 3.2安装Nacos

安装jdk 查看jdk是否安装 java -version 下载网址&#xff1a;https://www.oracle.com/java/technologies/downloads/?er221886 下载命令&#xff1a; wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz 解压&#xff1a; tar -zxvf jdk-17_…

【OpenCV C++20 学习笔记】imgproc模块-绘图基础

imgproc模块-绘图基础 Point和Scalar类型Point类型Scalar类型 绘图操作创建图片对象和显示窗口绘制椭圆绘制圆绘制多边形绘制矩形画线 完整代码 Point和Scalar类型 Point类型 该类型表示一个2D的点&#xff0c;其坐标由图像中的 x x x和 y y y坐标确定。可以这样定义一个Poin…

如何基于欧拉系统完成数据库的安装

一、安装 当我们直接进行安装软件包时&#xff0c;会提示有冲突&#xff0c;此时&#xff0c;我们应该这样来解决 使用rpm命令 [rootlocalhost yum.repos.d]# rpm -qa | grep selinux使用 rpm命令卸载以下两个软件包 [rootlocalhost yum.repos.d]# rpm -e selinux-policy-3…

B站安全开发流程落地实践

一. 什么是安全开发生命周期&#xff08;SDL&#xff09; 1.1 SDL诞生背景 随着互联网技术的快速发展&#xff0c;网络系统及应用在给人们的生活带来巨大便利的同时&#xff0c;信息安全问题也逐渐成为用户和企业关注的焦点。然而&#xff0c;安全问题的管理和解决需要一个系统…

TCP半关闭过程

TCP半关闭过程 简介 tcp半关闭是指在一端发送完数据后&#xff0c;关闭发送通道&#xff0c;而保持接收通道继续接收数据。 过程 这里设序号为Seqx&#xff0c;确认号为Acky 客户端&#xff08;也可以是服务端发起&#xff09;发送 [FIN&#xff0c;ACK] 报文段&#xff0…

【已解决】树莓派5使用VNC远程,无法正常显示桌面,黑屏提示:cannot currently show the desktop

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外贸干货|业务员寻找客户的7个思维技巧,都掌握的才算合格

更多外贸干货及开发客户的方法&#xff0c;尽在微信【千千外贸干货】 做外贸最基本的是找到客户&#xff0c;如果没有完成这一步&#xff0c;纵使你有千万种转化客户的方法&#xff0c;也都只是纸上谈兵。 #一 关键词法 选择适当的关键词&#xff0c;直接查找潜在客户发布的求…

Manim实现在坐标轴上添加元素和获取元素

Manim实现在坐标轴上添加元素和获取元素 1.坐标轴上获取元素 构造函数&#xff1a; _get_axis_label(label, axis, edge, direction, buff0.1) 函数 _get_axis_label 旨在为图形表示中的给定轴生成和定位标签&#xff08;通常用于绘图或数学上下文中&#xff0c;可能是在某…

PostgreSQL 15

一、安装前的准备 1、版本信息 操作系统CentOS 7.9.2009PostgreSQL 版本PostgreSQL 15-15.7 2、下载安装包 RPM Chart - PostgreSQL YUM Repositoryhttps://yum.postgresql.org/rpmchart/进入官网&#xff0c;找到相应版本 点击框选内容 依次进入下载页面&#xff0c;下载相…

ASUS/华硕幻15 2020 冰刃4 GX502L GU502L系列 原厂win10系统 工厂文件 带F12 ASUS Recovery恢复

华硕工厂文件恢复系统 &#xff0c;安装结束后带隐藏分区&#xff0c;一键恢复&#xff0c;以及机器所有驱动软件。 系统版本&#xff1a;windows10 原厂系统下载网址&#xff1a;http://www.bioxt.cn 需准备一个20G以上u盘进行恢复 请注意&#xff1a;仅支持以上型号专用…

免费好用的 CI/CD 工具有哪些?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 更多关于极狐GitLab &a…

V.PS日本东京VPS详细测评

V.PS日本VPS怎么样&#xff1f;V.PS日本机房怎么样&#xff1f; V.PS在日本有东京和大阪两个机房都在运作VPS/云服务器&#xff0c;大阪机房的默认接入IIJ网络&#xff0c;日本东京机房的是日本软银网络&#xff0c;另外日本东京分两个系列&#xff0c;一个是Intel另外一个是AM…

【文件fd】深入理解重定向和缓冲区

目录 1.重定向 1.1dup2 2.缓冲区 2.1什么是缓冲区 2.2为什么存在缓冲区 2.3缓冲区的刷新策略 2.4查看源码​ 3.0/1/2 3.1 0/1/2是什么&为什么存在 3.2 2和1区别 3.3 2为什么存在 1.重定向 重定向的本质&#xff1a;是在内核中改变文件描述符表特定下标的内容和…

Flutter 插件之http(介绍、使用、二次封装)

背景 在我们日常开发过程中,经常会使用到网络请求,而在Flutter插件中,最常用的请求插件一共两个,分别是: 1、dio 2、http 其中dio我已经做过详细介绍了(post、get等请求、文件上传、请求重试等),这里就不做过多阐述,下面附上文章链接,如有需要可前往查看。 http…

「11月·西安」第十二届信息系统与计算技术国际会议(ISCTech 2024)

随着信息技术的飞速发展&#xff0c;信息系统与计算技术已成为推动社会进步与产业升级的重要力量。在这样的背景下&#xff0c;第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;的召开&#xff0c;无疑为全球专家学者搭建了一个交流思想、共享成果的高…

ProfiNet 转 CAN/CANopen 网关

一、功能概述 1.1 设备简介 本产品是 PN(Profinet)和 COE(CANopen)/CAN(自由口)网关&#xff0c;使用数据映射 方式工作。 本产品在 PN 侧作为 PN IO 从站&#xff0c;接西门子 PLC&#xff1b;在 COE 侧做为 COE 主站&#xff0c; 接 COE 设备&#xff0c;如伺服、变频器、…