当前位置: 首页 > article >正文

基础版-图书管理系统

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

图书管理需要管理图书(对象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;//书的状态@Overridepublic String toString() {//book中的toString方法,用来显示书的相关信息return "Book{" +"书名:'" + name + '\'' +", 作者:'" + author + '\'' +", 价格:" + price +", 类型:'" + type + '\'' +(isBorrowed==true?" 已借出":" 未借出") +'}';}public Book(String name, String author, int price, String type) {//构造方法,用来初始化bookthis.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;}@Overridepublic 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{@Overridepublic 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{@Overridepublic 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{@Overridepublic 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{@Overridepublic void work(bookList booklist) {System.out.println("退出系统...");System.exit(0);}
}

6.查找图书:FIndoperation

public class FIndoperation implements Listoperation{@Overridepublic 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{@Overridepublic 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{@Overridepublic void work(bookList booklist) {System.out.println("显示图书...");for (int i = 0; i < booklist.getUsesize(); i++) {Book book=booklist.getBooks(i);System.out.println(book);}}
}

相关文章:

基础版-图书管理系统

现在我们用面向对象编程&#xff0c;首先我们要明确这个图书管理系统的对象有哪些&#xff1f; 图书管理需要管理图书&#xff08;对象1&#xff09;&#xff0c;在哪管理图书呢&#xff1f;书架&#xff08;对象2&#xff09;上 然后由谁来管呢&#xff1f;有两类人&#xf…...

【单片机 C语言】单片机学习过程中常见C库函数(学习笔记)

memset() ​C 标准库 - <string.h> string .h 头文件定义了一个变量类型、一个宏和各种操作字符数组的函数。 <string.h> 是 C 标准库中的一个头文件&#xff0c;提供了一组用于处理字符串和内存块的函数。这些函数涵盖了字符串复制、连接、比较、搜索和内存操作…...

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

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

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

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

文件的物理结构和逻辑结构的区分

文件的物理结构和逻辑结构是文件系统中两个重要的概念&#xff0c;它们分别描述了文件在存储设备上的实际存储方式以及用户在编程或操作文件时所看到的抽象组织形式。理解这两者的区别和联系对于深入掌握文件系统的设计和实现至关重要。 ​一、文件的逻辑结构 ​定义 文件的逻…...

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

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

Coze平台​ 创建AI智能体的详细步骤指南

一、创建智能体的基础流程​ ​注册与登录​ 访问Coze官网&#xff08;www.coze.cn&#xff09;&#xff0c;使用邮箱或手机号注册账号并登录。 ​创建智能体​ 在控制台点击左侧“”按钮&#xff0c;选择“创建智能体”&#xff0c;输入名称&#xff08;如“职场鼓励师”&…...

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

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

android Stagefright框架

作为Android音视频开发人员&#xff0c;学习Stagefright框架需要结合理论、源码分析和实践验证。以下是系统化的学习路径&#xff1a; 1. 基础准备 熟悉Android多媒体体系 掌握MediaPlayer、MediaCodec、MediaExtractor等核心API的用法。 理解Android的OpenMAX IL&#xff08…...

Shell脚本-变量的分类

在Shell脚本编程中&#xff0c;变量是存储数据的基本单位。它们可以用来保存字符串、数字甚至是命令的输出结果。正确地定义和使用变量能够极大地提高脚本的灵活性与可维护性。本文将详细介绍Shell脚本中变量的不同分类及其应用场景&#xff0c;帮助你编写更高效、简洁的Shell脚…...

<C#>.NET WebAPI 的 FromBody ,FromForm ,FromServices等详细解释

在 .NET 8 Web API 中&#xff0c;[FromBody]、[FromForm]、[FromHeader]、[FromKeyedServices]、[FromQuery]、[FromRoute] 和 [FromServices] 这些都是用于绑定控制器动作方法参数的特性&#xff0c;下面为你详细解释这些特性。 1. [FromBody] 作用&#xff1a;从 HTTP 请求…...

让数据应用更简单: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.隐藏网络…...

Mysql相关知识2:Mysql隔离级别、MVCC、锁

文章目录 MySQL的隔离级别可重复读的实现原理Mysql锁按锁的粒度分类按锁的使用方式分类按锁的状态分类 MySQL的隔离级别 在 MySQL 中&#xff0c;隔离级别定义了事务之间相互隔离的程度&#xff0c;用于控制一个事务对数据的修改在何时以及如何被其他事务可见。MySQL 支持四种…...

Python爬虫实战:获取海口最近2周天气数据,为出行做参考

一、引言 天气状况对人们的出行计划影响重大。获取准确的天气信息并进行分析,能助力用户更好地规划出行。天气网虽提供丰富的天气数据,但因网站存在反爬机制,直接获取数据存在一定难度。本研究借助 Python 的 Scrapy 框架,结合多种技术手段,实现对海口最近两周天气数据的…...

并发设计模式之双缓冲系统

双缓冲的本质是 ​​通过空间换时间​​&#xff0c;通过冗余的缓冲区解决生产者和消费者的速度差异问题&#xff0c;同时提升系统的并发性和稳定性。 双缓冲的核心优势 优势具体表现解耦生产与消费生产者和消费者可以独立工作&#xff0c;无需直接同步。提高并发性生产者和消…...

linux sysfs的使用

在Linux内核驱动开发中&#xff0c;device_create_file 和 device_remove_file 用于动态创建/删除设备的 sysfs 属性文件&#xff0c;常用于暴露设备信息或控制参数。以下是完整示例及详细说明&#xff1a; 1. 头文件引入 #include <linux/module.h> #include <linux/…...

【数据结构和算法】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…...

LintCode第192题-通配符匹配

描述 给定一个字符串 s 和一个字符模式 p &#xff0c;实现一个支持 ? 和 * 的通配符匹配。匹配规则如下&#xff1a; ? 可以匹配任何单个字符。* 可以匹配任意字符串&#xff08;包括空字符串&#xff09;。 两个串完全匹配才算匹配成功。 样例 样例1 输入: "aa&q…...

redis常用的五种数据类型

redis常用的五种数据类型 文档 redis单机安装redis数据类型-位图bitmap 说明 官网操作命令指南页面&#xff1a;https://redis.io/docs/latest/commands/?nameget&groupstring 常用命令 keys *&#xff1a;查看所有键exists k1 k2&#xff1a;键存在个数type k1&…...

Linux 进程与线程间通信方式及应用分析

Linux 进程与线程间通信方式及应用分析 文章目录 Linux 进程与线程间通信方式及应用分析 1. 管道&#xff08;Pipe&#xff09;1.1 匿名管道&#xff08;Anonymous Pipe&#xff09;示例代码&#xff1a;结果&#xff1a; 1.2 命名管道&#xff08;FIFO&#xff09;示例代码&am…...

AI日报 - 2024年04月22日

&#x1f31f; 今日概览(60秒速览) ▎&#x1f916; 模型进展 | Google发布Gemini 2.5 Flash&#xff0c;强调低延迟与成本效益&#xff1b;Kling AI 2.0展示多轴运动视频生成&#xff1b;研究揭示SLM在知识图谱上优于LLM&#xff0c;RLHF在推理提升上存局限。 ▎&#x1f4bc;…...

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时&…...

基于大模型的血栓性外痔全流程风险预测与治疗管理研究报告

目录 一、引言 1.1 研究背景与目的 1.2 研究意义 二、血栓性外痔概述 2.1 定义与发病机制 2.2 临床表现与诊断方法 2.3 现有治疗手段综述 三、大模型在血栓性外痔预测中的应用原理 3.1 大模型技术简介 3.2 模型构建与训练数据来源 3.3 模型预测血栓性外痔的工作流程…...

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

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

C++如何处理多线程环境下的异常?如何确保资源在异常情况下也能正确释放

多线程编程的基本概念与挑战 多线程编程的核心思想是将程序的执行划分为多个并行运行的线程&#xff0c;每个线程可以独立处理任务&#xff0c;从而充分利用多核处理器的性能优势。在C中&#xff0c;开发者可以通过std::thread创建线程&#xff0c;并使用同步原语如std::mutex、…...