【JAVA】建立一个图书管理系统

在建立一个图书管理系统的时候我们首先需要构造一个书类

public class Book {private String name;private String author;private int price;private String type;private boolean isBorrwed;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}//构造方法

因为类成员是 private修饰的所以我们要用到set和get构造器来访问它们

 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 isBorrwed() {return isBorrwed;}public void setBorrwed(boolean borrwed) {isBorrwed = borrwed;}//用于获取图书和设置图书

打印一下 用tosring

  @Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrwed==true)?"已经借出":"未被借出")+'}';}
}//它将生成并返回一个格式化的字符串,拿来打印的

第二步我们需要建立一个书架,这个书架的作用是拿取书 增加书,借阅书等操作都将在这里完成

所以我们建立一个新的类

package book;public class Booklist {private Book[] books;private int usedsize;private static final int DEA=10;public Booklist(){this.books=new Book[DEA];//放书this.books[0]=new Book("三国演义","罗贯中",10,"小说");this.books[1]=new Book("红楼梦","曹雪芹",19,"小说");this.books[2]=new Book("西游记","吴承恩",22,"小说");this.usedsize=3;}public int getUsedsize() {return usedsize;}public void setUsedsize(int usedsize) {this.usedsize = usedsize;}public Book getBook(int pos){return books[pos];}public void setBooks(int pos,Book book){books[pos]=book;}public Book[] getBooks(){return books;
}}

因为要放多本书,所以我们的类成员需要是数组

同样的下列方法

构造函数:

public Booklist() 初始化一个Booklist对象时,创建一个大小为DEA的Book数组,并填充了三本预设的书籍信息,同时设置了usedsize为3,表示已有3本书被使用

  1. getter 和 setter 方法:

    • getUsedsize() 返回当前使用的书籍数量。
    • setUsedsize(int usedsize) 设置当前使用的书籍数量。
    • getBook(int pos) 返回索引为pos位置处的Book对象。
    • setBooks(int pos, Book book) 将新的Book对象替换到索引为pos的位置上。
    • getBooks() 返回整个书籍数组,包含了所有存储的Book对象。

 第三步我们回到main函数来布置主要的逻辑

可以看到我们有两个界面一个是管理员界面一个是普通用户界面。首先我们需要完善它们的菜单

然后根据我们的选择进入哪个菜单

先完成主函数设置

public class Main {public static User login(){System.out.println("请输入你的姓名");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();System.out.println("请输入你的身份1.管理员 2.普通用户");int choice= scanner.nextInt();if (choice==1){return new Adimer(name);}else {return new NormalUser(name);}}

然后我们来设置管理员系统和普通用户系统,在设置它们两之前 我们要先弄一个总的用户系统

这个系统不需要实例化只需要被继承所以他应该是抽象类

package user;import book.Booklist;
import oper.IOperation;public abstract class User {protected String name;protected IOperation[] ioperations;public User(String name) {this.name = name;}public  abstract int menu();public void doOpenration(int choice, Booklist booklist){ioperations[choice].work(booklist);}
}
package oper;import book.Booklist;public interface IOperation {void work(Booklist booklist);
}

在实现这个类之前 我们需要构建一个接口

这个接口的设计意图是为了规定一种规范,任何实现了 IOperation 接口的类都需要提供一个执行具体工作的 work 方法,这个方法接受一个 Booklist 对象作为参数。

  1. 成员变量:

    • name:保护类型(protected)的字符串变量,用于存储用户的姓名。
    • ioperations:保护类型(protected)的 IOperation 接口数组,其中每个元素都是一个实现了 IOperation 接口的对象。这些对象代表用户可以执行的各种操作,如查找图书、添加图书、删除图书等。
  2. 构造函数:

    • public User(String name):接收一个字符串参数 name,用于初始化用户的名字。
  3. 抽象方法:

    • public abstract int menu():这是一个抽象方法,要求子类必须实现。这个方法通常用来展示一个操作菜单并获取用户选择的操作编号。
  4. 具体方法:

    • public void doOpenration(int choice, Booklist booklist):根据传入的 choice 参数调用 ioperations 数组中对应索引位置的操作对象的 work() 方法,并将一个 Booklist 对象作为参数传递给该方法。Booklist 类似于一个图书列表,包含了图书的相关信息。

现在来设置用户系统和管理员系统

 用户系统

package user;import oper.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);//帮助父类构造this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),new borropertation(),new returnpertation()};}public int menu(){System.out.println("*********************");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 choie=scanner.nextInt();return choie;}
}
  1. 类定义:public class NormalUser extends User 表示 NormalUser 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public NormalUser(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含四个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、borropertation(借阅图书操作)和 returnpertation(归还图书操作)。这些操作是普通用户在图书管理系统中可以执行的动作。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对普通用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

管理员系统

 

package user;import oper.*;import java.util.Scanner;public class Adimer extends User{public Adimer(String name) {super(name);this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),new Addoperation(),new Deloperation(),new Showoperation()};}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.退出系统*********");Scanner scanner = new Scanner(System.in);System.out.println("请输入你的操作");int choie=scanner.nextInt();return choie;}}

  1. 类定义:public class Adimer extends User 表示 Adimer 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public Adimer(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含五个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、Addoperation(新增图书操作)、Deloperation(删除图书操作)和 Showoperation(显示图书操作)。这些操作是管理员用户在图书管理系统中可以执行的动作,相比普通用户,管理员拥有更多的权限,例如新增和删除图书。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对管理员用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

现在我们来构造功能 

 增加图书

ackage oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Addoperation implements IOperation{public void work(Booklist booklist) {System.out.println("新增图书");Scanner scanner=new Scanner(System.in);System.out.println("请输入书名");String name=scanner.nextLine();System.out.println("请输入作者");String author =scanner.nextLine();System.out.println("请输入类型");String type=scanner.nextLine();System.out.println("请输入价格");int price=scanner.nextInt();Book book=new Book(name,author,price,type);//检查 数组当中有没有这本书int currentsize= booklist.getUsedsize();for (int i = 0; i <currentsize; i++) {Book book1=booklist.getBook(i);if (book1.getName().equals(name)){System.out.println("有这本书,不进行存放");return;}}if(currentsize== booklist.getBooks().length){System.out.println("书架满了");}else {booklist.setBooks(currentsize,book);booklist.setUsedsize(currentsize+1);}}
}
  1. 类定义:public class Addoperation implements IOperation 表示 Addoperation 类实现了 IOperation 接口,需要实现接口中定义的 work() 方法。

  2. work(Booklist booklist) 方法:

    • 打印提示信息,让用户输入新书的信息(书名、作者、类型、价格)。
    • 使用 Scanner 从控制台读取用户输入。
    • 根据用户输入创建一个新的 Book 对象。
    • 检查 Booklist 中是否存在同名的书籍。通过遍历 booklist 中已有的图书,比较书名是否相同。
    • 如果存在同名书籍,则打印提示信息并结束本次新增操作。
    • 如果 Booklist 已满(即已存图书的数量等于 booklist 数组的容量),则打印提示信息。
    • 若以上条件均不满足,则将新书添加到 Booklist 中,通过调用 booklist.setBooks(currentsize, book) 将新书放置在数组的下一个可用位置,并通过调用 booklist.setUsedsize(currentsize + 1) 更新已使用书籍的数量。

 借阅图书

package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class borropertation  implements IOperation{public void work(Booklist booklist) {Scanner scanner=new Scanner(System.in);System.out.println("借阅图书");String name=scanner.nextLine();int currensize=booklist.getUsedsize();for (int i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){book.setBorrwed(true);System.out.println("借阅成功");System.out.println(book);return;}}System.out.println("你借阅的图书不存在");}
}

与增加图书的接口一样

work(Booklist booklist) 方法:

使用 Scanner 从控制台读取用户输入的想要借阅的图书的书名。
获取图书列表 booklist 中当前已存图书的数量(currensize)。
遍历图书列表中的所有图书(通过 booklist.getBook(i) 获取每一本书),比较每本书的书名是否与用户输入的书名相同。
如果找到匹配的书名,则将该书的借阅状态设为 true(通过调用 book.setBorrwed(true)),输出借阅成功的消息,并打印出借阅后的图书详细信息。
若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“你借阅的图书不存在”。

删除图书

package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Deloperation  implements IOperation{public void work(Booklist booklist) {System.out.println("删除图书");Scanner scanner=new Scanner(System.in);System.out.println("请输入你要删除的图书");String name=scanner.nextLine();int pos=-1;int i=0;int currensize= booklist.getUsedsize();for ( i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){pos=i;break;}}if (i==currensize){System.out.println("没有你要删除的图书");return;}//开始删除int j=pos;for ( j = pos; j < currensize-1; j++) {//Book book=booklist.getBook(j+1);booklist.setBooks(j,book);}booklist.setBooks(j,null);booklist.setUsedsize(currensize-1);}
}

work(Booklist booklist) 方法:

  • 打印提示信息,让用户输入要删除的图书的书名。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 遍历图书列表 booklist 中的所有图书,寻找与用户输入相匹配的书名。
  • 如果找到了匹配的书名,记录下该书在列表中的位置(pos)并跳出循环。
  • 如果遍历完列表仍未找到匹配书名,则输出提示信息“没有你要删除的图书”,并直接返回。
  • 如果找到了匹配的书名,开始执行删除操作:从找到的书所在位置 (pos) 开始,将后面的所有图书向前移动一位,覆盖掉待删除图书的位置,相当于删除了该书。
  • 最后,将列表末尾的元素设为 null,并减少已使用图书的数量(通过调用 booklist.setUsedsize(currensize - 1)

退出系统

这里比较简单用个方法就好

package oper;import book.Booklist;public class Exitoperation implements IOperation{public void work(Booklist booklist) {System.out.println("退出图书");System.exit(0);}
}

 查找图书

package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class Findpritation  implements IOperation{public void work(Booklist booklist) {System.out.println("找到图书");Scanner scanner=new Scanner(System.in);String name=scanner.nextLine();int currentsize= booklist.getUsedsize();for (int i=0;i<currentsize;i++){Book book=booklist.getBook(i);if (book.getName().equals(name)){System.out.println("找到了这本书;信息如下");System.out.println(book);return;}}System.out.println("没有找到");}
}

work(Booklist booklist) 方法:

  • 打印提示信息,提示用户输入要查找的图书名称。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 获取图书列表 booklist 中当前已存图书的数量(currentsize)。
  • 遍历图书列表中的所有图书,通过调用 booklist.getBook(i) 获取每一本书,并判断每本书的书名是否与用户输入的书名相同。
  • 如果找到匹配的书名,则打印出找到的图书的信息,并通过 System.out.println(book) 输出图书详情,然后结束查找操作。
  • 若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“没有找到”

 归还图书

和借阅图书一样改一下bool的状态打印一下结果就好

package oper;import book.Book;
import book.Booklist;import java.util.Scanner;public class returnpertation  implements IOperation{public void work(Booklist booklist) {Scanner scanner=new Scanner(System.in);System.out.println("归还图书");String name=scanner.nextLine();int currensize=booklist.getUsedsize();for (int i = 0; i <currensize; i++) {Book book=booklist.getBook(i);if (book.getName().equals(name)){book.setBorrwed(false);System.out.println("归还成功");System.out.println(book);return;}}System.out.println("你归还的图书不存在");}
}

显示图书

package oper;import book.Book;
import book.Booklist;public class Showoperation  implements IOperation{public void work(Booklist booklist) {System.out.println("打印图书");int curernsize=booklist.getUsedsize();for (int i = 0; i <curernsize; i++) {Book book=booklist.getBook(i);System.out.println(book);}}}
  • 打印提示信息,提示正在打印图书列表。
  • 获取图书列表 booklist 中当前已存图书的数量(curernsize)。
  • 遍历图书列表,通过调用 booklist.getBook(i) 获取每一本书,并使用 System.out.println(book) 打印出每本书的详细信息

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

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

相关文章

【原创】RockyLinux9.3手动编译MySQL8.2.0源码,超详细!!

前言 MySQL安装如果使用rpm包安装实在过于麻烦&#xff0c;缺这缺那的&#xff0c;我就想能不能就源码包自己手动编译安装&#xff0c;编译完的包可以给其他服务器直接用&#xff0c;这样只需要麻烦一次&#xff0c;后面就方便了。至于为什么不用RockyLinux8.6版本&#xff0c…

Java虚拟机运行原理

在 Java 中新建一个类Test&#xff1a; class Test {int a; }在Main方法中创建两个 Test 对象&#xff0c;并给 a 赋不同的值。 写一个 exchange 方法&#xff0c;在方法中交换两个Test 对象&#xff0c;最后输出两个对象中 a 的值。 public class Main {public static void…

SaaS模式java智慧工地源码 有演示 AI视频智能分析解决工地安监需求

SaaS模式java智慧工地源码 AI视频智能分析解决工地安监需求 有演示 智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术&#xff0c;以PC端&#xff0c;移动端&#xff0c;平板端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳…

第四讲:隐语SecretFlow安装部署

SecretFLow安装 环境要求&#xff1a; Python>3.8&#xff1b; 操作系统&#xff1a;CentOS7&#xff0c;Anolis8&#xff0c;Ubuntu 18.04/20.04&#xff0c;macOS11.1&#xff0c;WSL2&#xff1b; 资源&#xff1a;>8核16GB 安装包&#xff1a;SecretFLow, SecretF…

物联网数据报表分析

随着物联网技术的迅猛发展&#xff0c;越来越多的企业开始将物联网解决方案应用于各个领域&#xff0c;从提高生产效率到优化用户体验&#xff0c;物联网都发挥着至关重要的作用。然而&#xff0c;如何有效地分析和管理物联网产生的海量数据&#xff0c;成为企业面临的挑战之一…

fl破解补丁下载2024FL Studio v21.1.1.3750 Crack永久下载和使用激活图文教程

FL Studio21简介 各位&#xff0c;大家晚上好&#xff0c;今天给大家带来最新最新2024水果编曲软件FL Studio 21中文版下载安装激活图文教程。我们一起先了解一些FL Studio 。FL Studio21是目前流行广泛使用人数最多音乐编曲宿主制作DAW软件&#xff0c;这款软件相信广大网友并…

【c++】【STL】stack类、queue类、deque类详解及模拟

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今日主菜&#xff1a;stack和queue&#xff0c;deque类 主厨&#xff1a;邪王真眼 所属专栏&#xff1a;c专栏 主厨的主页&#xff1a;Chef‘s blog 这可是…

JVM垃圾收集——概述

文章目录 1、什么是垃圾2、为什么需要垃圾收集3、如何进行垃圾收集3.1、早期垃圾收集3.2、Java垃圾收集机制 4、小结 垃圾收集(Garbage Collection,GC)并不是Java语言所独有的&#xff0c;早在1960年&#xff0c;Lisp语言中就已经开始使用内存的动态分配和垃圾收集技术。可见&a…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展&#xff0c;网络化的工作模式已经几乎覆盖到各个工作领域中的业务内&#xff0c;人们的日常生活也渐渐离不开互联网。因此&#xff0c;在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

Spring Boot整合Spring Security

Spring Boot 专栏&#xff1a;Spring Boot 从零单排 Spring Cloud 专栏&#xff1a;Spring Cloud 从零单排 GitHub&#xff1a;SpringBootDemo Gitee&#xff1a;SpringBootDemo Spring Security是针对Spring项目的安全框架&#xff0c;也是Spring Boot底层安全模块的默认技术…

Netty学习——源码篇6 Pipeline设计原理

1 Pipeline设计原理 在Netty中每个Channel都有且仅有一个ChannelPipeline与之对应&#xff0c;它们的组成关系如下图&#xff1a; 通过上图可以看到&#xff0c;一个Channel包含了一个ChannelPipeline&#xff0c;而ChannelPipeline中又维护了一个由ChannelHandlerContext组成的…

【笔记】深入理解JVM机制

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 JVM 运⾏流程图 JVM 中内存区域划分 方法区 / 元数据区 堆 栈 程序计数器 本地方法栈 内存区域总结 JVM 中类加载过程 …

C++ STL- list 的使用以及练习

目录 0.引言 1. list 介绍 2. list 使用 2.1 构造函数 2.2 list iterator 的使用 3 list capacity 4. list element access 5. list modifiers 6. list 迭代器失效 7. list 与vector 对vector 8. OJ 题讲解 删除链表的倒数第 N 个节点&#xff1a; 0.引言 …

Jetson AGX ORIN 配置 FGVC-PIM 神经网络(包含 arm64 下面 torch 和 torchvision 配置内容)

Jetson AGX ORIN 配置 FGVC-PIM 神经网络 文章目录 Jetson AGX ORIN 配置 FGVC-PIM 神经网络配置 ORIN 环境创建 FGVC-PIM 虚拟环境安装 PyTorch安装 torchvision安装其他依赖包 配置 ORIN 环境 首先先配置 ORIN 的环境&#xff0c;可以参考这个链接&#xff1a; Jetson AGX …

Go第三方框架--gin框架(一)

序言 Gin框架作为go语言使用最多的web框架&#xff0c;以其快速的响应速度和对复杂http路由配置的支持受到程序员和媛们的喜爱&#xff0c;几乎统治了web市场。但作为一名合格的程序员&#xff0c;要知其然更要知其所以然&#xff0c;不然八股文背的也没有啥意思。本着这个原则…

JavaScript中的Lexical Environment

概要 本文主要介绍JavaScript中的一个重要概念Lexical Environment&#xff0c;它可以帮助我们解释我们为什么可以通过嵌套方法&#xff0c;共享数据&#xff0c;以及为什么可以在函数中定义一个和全局变量同名的变量&#xff0c;并且不会影响到全局变量。 基本分析 基本概念…

如何使用Python进行网络安全与密码学【第149篇—密码学】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 用Python进行网络安全与密码学&#xff1a;技术实践指南 随着互联网的普及&#xff0c;网络…

几个常用的AI工具

人工智能大模型的出现对人类社会产生了深远的影响&#xff0c;这些影响既包括积极的方面&#xff0c;也包括一些潜在的挑战: 1. **提高效率**&#xff1a;AI大模型能够快速处理大量数据&#xff0c;提高工作效率&#xff0c;尤其在数据分析、自然语言处理等领域。 2. **辅助决…

面向对象【枚举类】

文章目录 枚举类定义枚举类enum 方式定义的要求和特点 enum 中常用方法实现接口的枚举类 枚举类 枚举类是一种特殊的类&#xff0c;它用于定义一组固定数量的常量。枚举类在实际开发中非常有用&#xff0c;因为它们可以增加代码的可读性和可维护性。本文将介绍Java枚举类的定义…

Java基于微信小程序的校园请假系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#…