图书管理系统(Java实现)

在写之前需要了解图书管理系统是怎样的,需要自己设定规则(我这个是借鉴他人的规则)。

  • 首先需要创建书籍(书名、作者、价格、类型、是否被借阅等属性),需要可以得到和改变各种属性;
  • 创建后需要书架将书进行存放,或者可以假设书架中存放了一些书(也可以不存放,由管理员存放书籍),书架这里就需要用数组存放,且还需要一个计数器来记录书架中书籍的数量,在书架中还需要知道书的下标(getbooks),需要根据计数器来存放新的书籍(setbooks),也需要得到书架中的书籍数量(getcount),还需要可以改变书籍数量的(setcount);
  • 然后就是创建使用者,这个图书管理系统可以分两种使用者(一类是管理员,另一类就是普通的借阅者),然后可以通过继承将两者联系在一块,使用者是父类,管理员和普通借阅者是子类,子类们都有自己的菜单;
  1. 管理员:增加、删除、改变、查找、显示(书架)、退出;
  2. 普通借阅者:借阅、归还、查找、显示、退出;
  • 最后就是写主方法;

目录

创建一个文件

创建一个book封装包

创建一个Book类

创建一个BookList类

创建一个user封装包

创建一个User类 

创建一个AdminiUser(继承User)类 

创建一个OrdinaryUser(继承User)类 

创建一个action封装包

创建一个IAction接口

创建一个AddAction类

创建一个BorrowAction类

创建一个ChangeAction类

创建一个DelAction类

创建一个EixtAction类

创建一个ReturnAction类

创建一个SearchAction类

创建一个ShowAction类 

创建一个Main类


创建一个文件

创建一个book封装包

创建一个Book类

       在Book类中首先需要创建属性以及方法。  get和set方法不需要自己写,可以直接生成,这些方法的作用就是可以通过(get和set)方法来得到和改变属性。  在构造方法中不加isBorrowed就是因为它只有两种结果(true和false),所以不需要输入它的初始值。  还有就是toString直接输出所有的属性。

package book;public class Book {private String bookName;//书名private String autor;//书的作者private double price;//书的价钱private String type;//书的类型private boolean isBorrowed;//默认false未被借出public String getAutor() {return autor;}public String getBookName() {return bookName;}public boolean isBorrowed() {return isBorrowed;}public double getPrice() {return price;}public String getType() {return type;}public void setAutor(String autor) {this.autor = autor;}public void setBookName(String bookName) {this.bookName = bookName;}public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;}public void setPrice(double price) {this.price = price;}public void setType(String type) {this.type = type;}public Book(String bookName, String autor, double price, String type) {this.autor = autor;this.bookName = bookName;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +", bookName='" + bookName + '\'' +"autor='" + autor + '\'' +", price=" + price +", type='" + type + '\'' +((isBorrowed == true)?"   已被借出":"    未被借出") +'}';}
}
创建一个BookList类

       这个类可以说是一个书架,通过数组将书籍进行排放、还有通过计数器计算书籍的数量  还有一些方法。  详细方法看下面代码:

package book;public class BookList {private Book[] books = new Book[30];private int count;//实例代码块
//    {
//        books[0] = new Book("《活着》", "余华", 20.1,"文学");
//        books[1] = new Book("《我与地坛》", "史铁生", 25, "小说");
//    }//构造方法public BookList(){//也可以在构造方法中创建this.books[0] = new Book("《活着》", "余华", 20.1,"文学");this.books[1] = new Book("《我与地坛》", "史铁生", 25, "小说");this.count = 2;}//得到书架中某本书的位置public Book getBooks(int pos) {return books[pos];}//将书架中某位置放入书籍public void setBooks(int pos,Book book) {books[pos] = book;}//得到书架中书籍的数量public int getCount(){return count;}//改变书架中的书籍的数量public void setCount(int count) {this.count = count;}
}

创建一个user封装包

创建一个User类 

这个类是一个父类,我们不需要调用这里面的方法,所以将这个父类置为抽象类 。

package user;import action.IAction;
import book.BookList;public abstract class User {public String name;//使用者public IAction[] iActions;//将菜单中的目录由数组完成public User(String name){this.name = name;}public abstract int menu();public void doAction(int choice, BookList booklist){iActions[choice].work(booklist);//这个是使用者选择的菜单目录,通过输入的选择访问初始化的菜单数组对应的下标}
}
创建一个AdminiUser类 

       AdminiUser类是管理员的菜单,继承父类(User)。  首先是先写菜单函数(menu),然后就是使用者输入菜单前的序号进行返回。  然后写构造方法,这个构造方法必须包含父类的成员、还要初始化菜单数组,也就是管理员执行的一些活动称为菜单,初始化就是想要通过数组下标进行访问菜单。  

package user;import action.*;import java.util.Scanner;public class AdminiUser extends User{public AdminiUser(String name) {super(name);this.iActions = new IAction[] {//初始化菜单数组new EixtAction(),new AddAction(),new DelAction(),new ChangeAction(),new SearchAction(),new ShowAction()};}public int menu(){System.out.println("*********************************");System.out.println(name+"欢迎来到管理员菜单");System.out.println("***** 1.新增图书");System.out.println("***** 2.删除图书");System.out.println("***** 3.改变图书");System.out.println("***** 4.查找图书");System.out.println("***** 5.显示图书");System.out.println("***** 0.退出图书");System.out.println("*********************************");Scanner sc = new Scanner(System.in);int choice =sc.nextInt();return choice;}
}
创建一个OrdinaryUser类 

OrdinaryUser类是借阅者的菜单,也是继承父类(User)。  首先是先写菜单函数(menu),然后就是使用者输入菜单前的序号进行返回。  然后写构造方法,这个构造方法必须包含父类的成员、还要初始化菜单数组,也就是借阅者执行的一些活动称为菜单,初始化就是想要通过数组下标进行访问菜单。  

package user;
import action.*;import java.util.Scanner;public class OrdinaryUser extends User{public OrdinaryUser(String name) {super(name);this.iActions = new IAction[]{new EixtAction(),new BorrowAction(),new ReturnAction(),new ShowAction(),new ShowAction()};}@Overridepublic int menu(){System.out.println("*********************************");System.out.println(name+"欢迎来到借书者菜单");System.out.println("***** 1.借阅图书");System.out.println("***** 2.归还图书");System.out.println("***** 3.查找图书");System.out.println("***** 4.显示图书");System.out.println("***** 0.退出图书");System.out.println("*********************************");Scanner sc = new Scanner(System.in);int choice =sc.nextInt();return choice;}
}

创建一个action封装包

创建一个IAction接口

接口的创建就是为了后面的类可以使用接口中的抽象方法。

package action;import book.BookList;public interface IAction {public void work(BookList booklist);
}
创建一个AddAction类

       新增图书需要输入书籍的所有属性,然后就是如果输入的书籍在书架中以及存在的话就不能新增图书,所以需要遍历书架中的书(通过上面的getBooks方法、下标是i遍历 ),将书架下标为i的书籍存入局部变量(book1)中,就开始比较两本书(新增图书和下标为i的书籍)的书名是否相同(用equals方法),如果相同就提示一下再结束;不同的话就将新增书放入书架中(setBooks将新增书放入书架中,通过count计数器加一改变书架的数量setCount)。

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class AddAction implements IAction{@Overridepublic void work(BookList booklist) {Scanner sc = new Scanner(System.in);System.out.println("请输入你要添加的书的名字:");String bookName = sc.nextLine();System.out.println("请输入你要添加的书的作者:");String autor = sc.nextLine();System.out.println("请输入你要添加的书的价格:");double price = sc.nextDouble();sc.nextLine();System.out.println("请输入你要添加的书的类型:");String type = sc.nextLine();Book book = new Book(bookName, autor, price, type);int count = booklist.getCount();for (int i = 0; i < count; i++) {//这一步是将创建的booklist中所有书籍中下标为i的书拿出来放入一个Book类型book1中存储Book book1 = booklist.getBooks(i);//如果相等就不添加,直接returnif (book1.equals(book)){System.out.println("这本书已经存在,无法添加!");return;}}//将新加的书放入书柜中booklist.setBooks(count, book);//将count加1放入存入书柜中booklist.setCount(count+1);}
}
创建一个BorrowAction类

       借阅图书需要输入书名,然后还是遍历书架的书,下标为i的书籍与借阅的书籍的书名进行比较,如果书架中存在同名的书然后还需要知道这本书是否被借阅(将在书架中同名的书访问isBorrowed是否为false进行借阅),如果是false那就可以借阅,且需要系统知道该书已被借阅(setBorrowed修改为已被借阅true);遍历一遍后还是没有这本书那就是书架中不存在这本书。

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowAction implements IAction{@Overridepublic void work(BookList booklist) {System.out.println("请输入你要借阅的书:");Scanner sc = new Scanner(System.in);String bookName = sc.nextLine();int count = booklist.getCount();for (int i = 0; i < count; i++) {Book book1 = booklist.getBooks(i);if (book1.getBookName().equals(bookName)){if (book1.isBorrowed() == false) {book1.setBorrowed(true);System.out.println("借阅成功!");return;}else{System.out.println("该书已被借出,无法借阅!");}}}System.out.println("书柜中不存在你想借阅的这本书!");}
}
创建一个ChangeAction类

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class ChangeAction implements IAction{@Overridepublic void work(BookList booklist) {System.out.println("请输入你要改变的书:");Scanner sc = new Scanner(System.in);String bookName = sc.nextLine();int count = booklist.getCount();for (int i = 0; i < count; i++) {Book book1 = booklist.getBooks(i);if (book1.getBookName().equals(bookName)){System.out.println("请输入你要改变的书的作者:");String autor = sc.nextLine();book1.setAutor(autor);System.out.println("请输入你要添加的书的价格:");double price = sc.nextDouble();book1.setPrice(price);System.out.println("请输入你要添加的书的类型:");String type = sc.nextLine();book1.setType(type);return;}}System.out.println("书柜中不存在你想要改变的这本书!");}}
创建一个DelAction类

       删除图书的重点就是将后面的图书往前挪。 

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class DelAction implements IAction{@Overridepublic void work(BookList booklist) {int count = booklist.getCount();if(count == 0){System.out.println("书架为空,无法删除!");return;}System.out.println("请输入你要删除的书:");Scanner sc = new Scanner(System.in);String bookName = sc.nextLine();for (int i = 0; i <= count - 1; i++) {Book book1 = booklist.getBooks(i);if (book1.getBookName().equals(bookName)){for (int j = i; j <= count - 1; j++) {Book book2 = booklist.getBooks(j+1);Book book3 = booklist.getBooks(j);book3 = book2;}booklist.setCount(count - 1);return;}}System.out.println("书柜中不存在你想借阅的这本书!");}
}
创建一个EixtAction类

       退出图书需要将书架中所有书置为空、计数器也为空。

package action;import book.BookList;public class EixtAction implements IAction{@Overridepublic void work(BookList booklist) {System.out.println("退出图书");int count = booklist.getCount();for (int i = 0; i < count; i++) {booklist.setBooks(i,null);}booklist.setCount(0);}
}
创建一个ReturnAction类

       归还图书也是遍历找要归还的书的书名(和借阅很相似)。

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnAction implements IAction{@Overridepublic void work(BookList booklist) {System.out.println("请输入你要归还的书:");Scanner sc = new Scanner(System.in);String bookName = sc.nextLine();int count = booklist.getCount();for (int i = 0; i < count; i++) {Book book1 = booklist.getBooks(i);if (book1.getBookName().equals(bookName)){book1.setBorrowed(false);return;}}System.out.println("书柜中不存在你要归还的这本书!");}
}
创建一个SearchAction类

       查找图书也是一个道理,先遍历,存在就打印这个书,不存在就提示一下。

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class SearchAction implements IAction{@Overridepublic void work(BookList booklist) {System.out.println("请输入你要查找的书:");Scanner sc = new Scanner(System.in);String bookName = sc.nextLine();int count = booklist.getCount();for (int i = 0; i < count; i++) {Book book1 = booklist.getBooks(i);if (book1.getBookName().equals(bookName)){System.out.println(book1);return;}}System.out.println("书柜中不存在你想查找的这本书!");}
}
创建一个ShowAction类 

       显示图示就是在遍历的同时打印图书,将书架中所有书都打印。

package action;import book.Book;
import book.BookList;import java.util.Scanner;public class ShowAction implements IAction{@Overridepublic void work(BookList booklist) {int count = booklist.getCount();for (int i = 0; i < count; i++) {Book book1 = booklist.getBooks(i);System.out.println(book1);}}
}

创建一个Main类

       主方法是所有项目的开始,一个项目都是从main开始的,现在开始将这个图书管理系统的main方法。首先要创建一个书架,然后创建一个使用者,使用者的姓名及身份(是通过一个方法返回使用者类型,这里使用了向上转型,因为不返回的类型不一致但是都是继承同一个父类所有返回一个使用者类型)。

import book.BookList;
import user.AdminiUser;
import user.OrdinaryUser;
import user.User;import java.util.Scanner;public class Main {public static User login(){Scanner sc = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = sc.nextLine();System.out.println("请输入你的身份(1是管理员,2是普通人员):");int choice = sc.nextInt();if (choice == 1){return new AdminiUser(name);}else {return new OrdinaryUser(name);}}public static void main(String[] args) {BookList booklist = new BookList();User user = login();while (true){int choice = user.menu();user.doAction(choice, booklist);}}
}

以上就是图书管理系统的整个流程。

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

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

相关文章

Python 实现阿里滑块全攻略

阿里划块技术为开发者提供了高精度的视觉分割能力&#xff0c;而 Python 作为一种简洁高效的编程语言&#xff0c;可以轻松调用阿里划块接口&#xff0c;实现各种场景下的图像分割需求。 Python 调用阿里云分割抠图 - 商品分割接口的步骤如下&#xff1a;首先&#xff0c;开通…

尤雨溪都点赞的测试工具,你还不用?

尤雨溪都点赞的测试工具&#xff0c;你还不用&#xff1f; 想要一个跨浏览器兼容、无闪退的测试体验&#xff1f;Playwright来了&#xff01;它不仅支持主流浏览器自动化&#xff0c;还能轻松跨平台&#xff0c;让你轻松构建可靠的端到端测试。本文带你了解Playwright的功能亮点…

「IDE」VS2022插件 Visual Assist X 番茄助手介绍说明

✨博客主页何曾参静谧的博客📌文章专栏「IDE」集成开发环境📚全部专栏「Win」Windows程序设计「IDE」集成开发环境「UG/NX」BlockUI集合「C/C++」C/C++程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「UG/NX」NX定制开发「Py」Py

qt QFrame详解

1、概述 QFrame是Qt框架中用于提供框架或边框的控件&#xff0c;主要用于在图形用户界面&#xff08;GUI&#xff09;中创建框架&#xff0c;并提供各种边框样式和功能。它是Qt中一个基础的容器类&#xff0c;也是许多基础控件的基类&#xff0c;可以被QLCDNumber、QToolBox、…

数据重塑:长宽数据转换【基于tidyr】

在数据分析和可视化过程中&#xff0c;数据的组织形式直接影响着我们能够进行的分析类型和可视化效果。这里简单介绍两种常见的数据格式&#xff1a;长格式&#xff08;Long Format&#xff09;和宽格式&#xff08;Wide Format&#xff09;&#xff0c;以及如何使用tidyr包进行…

【网络】应用层——HTTP协议

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是HTTP协议。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;网络 &g…

【安全测试】sqlmap工具(sql注入)学习

前言&#xff1a;sqimap是一个开源的渗透测试工具&#xff0c;它可以自动化检测和利用SQL注入缺陷以及接管数据库服务器的过程。它有一个强大的检测引擎&#xff0c;许多适合于终极渗透测试的小众特性和广泛的开关&#xff0c;从数据库指纹、从数据库获 取数据到访问底层文件系…

【Android】webview常用方法和使用

文章目录 前言一、常见用法二、基础属性webView的常用方法WebViewClient的常用方法WebChromeClient的常用方法WebSettings的相关方法 三、加载流程和事件回调四、webview和JS之间的互相调用总结 五、参考链接 前言 最近项目又用到了webview&#xff0c;在回顾复习一次webview相…

可编辑PPT | 指挥中心系统建设与应用方案

本方案是一份全面的指挥中心系统建设与应用方案&#xff0c;涵盖了建设方案分析、指挥调度、远程通讯、会务管理等多个方面&#xff0c;旨在通过整合语音、视频监控、会议、指挥调度等多种技术&#xff0c;构建一个现代化、网络化、智慧化的城市指挥中心&#xff0c;以提高应对…

计算机新手练级攻略——善用搜索引擎

计算机学生新手练级攻略——善用搜索引擎 在信息爆炸的时代&#xff0c;计算机专业的学生如何有效地自我提升&#xff1f;答案可能就藏在一个简单却强大的工具——搜索引擎中。搜索引擎不仅是获取知识的入口&#xff0c;更是解决问题的利器。下面&#xff0c;我将分享一些善用搜…

vs2019托管调试助手 “ContextSwitchDeadlock“错误

错误描述 托管调试助手 "ContextSwitchDeadlock":“CLR 无法从 COM 上下文 0xd183e0 转换为 COM 上下文 0xd18328&#xff0c;这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长…

【ARM】MDK-烧录配置文件无权限访问

【更多软件使用问题请点击亿道电子官方网站】 1、 问题场景 客户代码编译正常、调试出现报错<Error: Flash Download failed - "Cortex-M4"> 仿真器识别正常&#xff0c;keil-Debug内显示相关信息、设备启动正常。 记录排查步骤&#xff0c;找到配置文件位…

【C语言刷力扣】66.加一

题目&#xff1a; 解题思路&#xff1a; 最初思路是打算将数组中的数提出来&#xff0c;加一&#xff0c;再放回另一数组中。后来发现数组最大长度100&#xff0c;而100位的数字太大了。 所有在数组上实现加一。 利用 carry 标记每一位是否进位&#xff0c;即该位数加 carry &a…

Docker使用docker-compose一键部署nacos、Mysql、redis

下面是一个简单的例子&#xff0c;展示如何通过Docker Compose文件部署Nacos、MySQL和Redis。请确保您的机器上已经安装了Docker和Docker Compose。 1&#xff0c;准备好mysql、redis、nacos镜像 sudo docker pull mysql:8 && sudo docker pull redis:7.2 &&…

【LLM】3:从零开始训练大语言模型(预训练、微调、RLHF)

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

YOLO即插即用---PConv

Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks 论文地址&#xff1a; 1. 论文解决的问题 2. 解决问题的方法 3. PConv 的适用范围 4. PConv 在目标检测中的应用 5. 评估方法 6. 潜在挑战 7. 未来研究方向 8.即插即用代码 论文地址&#xff1a; …

Fortran安装(vscode+gcc+Python)

编写时间&#xff1a; 2024年11月7日 环境配置&#xff1a; gcc VScode Python 条件&#xff1a; Windows 10 x64 VMware虚拟机 前言 这是我出的第2个关于Fortran安装的教程&#xff0c;由于上一个方法&#xff08;你可以在本专栏里找到&#xff09;对储存空间的要求比较…

ModuleNotFoundError: No module named ‘_ssl‘ centos7中的Python报错

报错 ModuleNotFoundError: No module named ‘_ssl’ 解决步骤&#xff1a; 1.下载openssl wget https://www.openssl.org/source/openssl-3.0.7.tar.gz tar -zxvf openssl-3.0.7.tar.gz cd openssl-3.0.72.编译安装 ./config --prefix/usr/local/openssl make make install3…

TensorFlow|猫狗识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 要求&#xff1a; 了解model.train_on_batch()并运用了解tqdm&#xff0c;并使用tqdm实现可视化进度条 &#x1f37b; 拔高&#xff08;可选&#xff09;&…

Python学习从0到1 day27 Python 高阶技巧 ③ 设计模式 — 单例模式

此去经年&#xff0c;再难同游 —— 24.11.11 一、什么是设计模式 设计模式是一种编程套路&#xff0c;可以极大的方便程序的开发最常见、最经典的设计模式&#xff0c;就是我们所学习的面向对象了。 除了面向对象外,在编程中也有很多既定的套路可以方便开发,我们称之为设计模…