图书管理系统(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.mzph.cn/web/59090.shtml

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

相关文章

多路转接之poll

多路转接之poll 一、关于poll认识poll基于poll实现的服务器的原理 二、基于poll实现的服务器main.cpppollServer.hppsock.hppLog.hpppublic.hpp 一、关于poll 认识poll #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout);struct pollfd {int …

# filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝, 失败,无法连接服务器”解决方案

filezilla连接 虚拟机ubuntu系统出错“尝试连接 ECONNREFUSED - 连接被服务器拒绝&#xff0c; 失败&#xff0c;无法连接服务器”解决方案 一、问题描述&#xff1a; 当我们用filezilla客户端 连接 虚拟机ubuntu系统时&#xff0c;报错“尝试连接 ECONNREFUSED - 连接被服务…

TCP编程API

这里写自定义目录标题 主要的 TCP 编程 API 函数1.1 socket()1.2 bind()1.3 listen()1.4 accept()1.5 connect()1.6 send()1.7 recv()1.8 close() 主要的 TCP 编程 API 函数 1.1 socket() 创建一个新的套接字。 int socket(int domain, int type, int protocol);domain&…

STM32WB55RG开发(1)----开发板测试

STM32WB55RG开发----1.开发板测试 概述硬件准备视频教学样品申请源码下载产品特性参考程序生成STM32CUBEMX串口配置LED配置堆栈设置串口重定向主循环演示 概述 STM32WB55 & SENSOR是一款基于STM32WB55系列微控制器的评估套件。该套件采用先进的无线通信技术&#xff0c;支…

人工智能、机器学习与深度学习:层层递进的技术解读

引言 在当今科技快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为一个热门话题&#xff0c;几乎渗透到了我们生活的方方面面。从智能手机的语音助手&#xff0c;到自动驾驶汽车&#xff0c;再到医疗诊断中的图像识别&#xff0c;人工智能的应用正在改变我…

【Java学习】电脑基础操作和编程环境配置

CMD 在Windows中用命令行的方式操作计算机。 打开CMD Win R输入CMD按下回车键 Win E 进入我的电脑 常用的CMD命令 盘符名称冒号 说明&#xff1a;盘符切换 举例&#xff1a;E:回车&#xff0c;表示切换到E盘 dir 说明&#xff1a;查看当前路径下的内容 cd目录 说明&a…

Mac中禁用系统更新

Mac中禁用系统更新 文章目录 Mac中禁用系统更新1. 修改hosts&#xff0c;屏蔽系统更新检测联网1. 去除系统偏好设置--系统更新已有的小红点标记 1. 修改hosts&#xff0c;屏蔽系统更新检测联网 打开终端&#xff0c;执行命令&#xff1a; sudo vim /etc/hosts127.0.0.1 swdis…

Unity3D UI 双击和长按

Unity3D 实现 UI 元素双击和长按功能。 UI 双击和长按 上一篇文章实现了拖拽接口&#xff0c;这篇文章来实现 UI 的双击和长按。 双击 创建脚本 UIDoubleClick.cs&#xff0c;创建一个 Image&#xff0c;并把脚本挂载到它身上。 在脚本中&#xff0c;继承 IPointerClickHa…

sql专题 之 where和join on

文章目录 前言where介绍使用过滤结果集关联两个表 连接外连接内连接自然连接 使用inner join和直接使用where关联两个表的区别总结 前言 从数据库查询数据时&#xff0c;一张表不足以查询到我们想要的数据&#xff0c;更多的时候我们需要联表查询。 联表查询我们一般会使用连接…

LeetCode 热题100之 动态规划1

对于动态规划的问题&#xff0c;解题步骤有以下几部(总结为动态规划五部曲&#xff1a;参考代码随想录动态规划 确定dp数组以及下标的含义&#xff1b;确定递推公式&#xff1b;dp数组如何初始化&#xff1b;确定遍历顺序&#xff1b;举例推导dp数组 下面的解题思路分析都将从…

python可视化将多张图整合到一起(画布)

这周有点事忙着&#xff0c;没时间重温刚结束的Mathurcup数学建模&#xff0c;这两天也是再看了下&#xff0c;论文还是赶紧挺烂的&#xff0c;但比国赛又有进步&#xff08;说起国赛又不得不抱怨了&#xff0c;基本其余省份都发了&#xff0c;但江西......哎&#xff09;。哎&…

MFC图形函数学习07——画扇形函数

绘制扇形函数是MFC中绘图的基本函数&#xff0c;它绘制的仍是由椭圆弧与椭圆中心连线构成的椭圆扇形&#xff0c;特例是由圆弧与圆心连线构成的圆扇形。 一、绘制扇形函数 原型&#xff1a;BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4); …

vue 依赖注入(Provide、Inject )和混入(mixins)

Prop 逐级透传问题​ 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。想象一下这样的结构&#xff1a;有一些多层级嵌套的组件&#xff0c;形成了一棵巨大的组件树&#xff0c;而某个深层的子组件需要一个较远的祖先组件中的部分数据。…

手机上用什么方法可以切换ip

手机上用什么方法可以切换IP&#xff1f;在某些特定情境下&#xff0c;用户可能需要切换手机的IP地址&#xff0c;以满足网络安全、隐私保护或绕过地域限制等需求。下面以华为手机为例&#xff0c;将详细介绍手机IP地址切换的几种方法&#xff0c;帮助用户轻松实现这一目标。 一…

一个强大的Stable Diffusion comfyUI 工作流,能实现写真自由、各种风格融合、面部特征一致性等等

今天&#xff0c;我们将向您介绍一款非常实用的工具——Stable Diffusion comfyUI工作流。这款工作流基于Stable Diffusion技术&#xff0c;旨在为您提供一键式生成图像的便捷体验。无论您是AI绘画的新手还是专业人士&#xff0c;这个工作流都能为您带来极大的便利。 在这个教…

外泌体相关基因肝癌临床模型预测——2-3分纯生信文章复现——6.外泌体基因功能注释(二)

内容如下: 1.外泌体和肝癌TCGA数据下载 2.数据格式整理 3.差异表达基因筛选 4.预后相关外泌体基因确定 5.拷贝数变异及突变图谱 6.外泌体基因功能注释 7.LASSO回归筛选外泌体预后模型 8.预后模型验证 9.预后模型鲁棒性分析 10.独立预后因素分析及与临床的相关性分析…

【Homework】【1--4】Learning resources for DQ Robotics in MATLAB

Learning resources for DQ Robotics in MATLAB Lesson 1 代码 % Step 2: Define the real numbers a1 and a2 a1 123; a2 321;% Step 3: Calculate and display a3 a1 a2 a3 a1 a2; disp([a3 (a1 a2) , num2str(a3)])% Step 4: Calculate and display a3 a1 * a2 a3…

linux命令详解,存储管理相关

存储管理 一、内存使用量&#xff0c;free free 命令是一个用于显示系统中物理内存&#xff08;RAM&#xff09;和交换空间&#xff08;swap&#xff09;使用情况的工具 free -m free -m -s 5参数 -b 功能: 以字节&#xff08;bytes&#xff09;为单位显示内存使用情况。说…

推荐一款功能强大的视频修复软件:Apeaksoft Video Fixer

Apeaksoft Video Fixer是一款功能强大的视频修复软件&#xff0c;专门用于修复损坏、不可播放、卡顿、画面失真、黑屏等视频问题。只需提供一个准确且有效的样本视频作为参考&#xff0c;该软件就能将受损视频修复到与样本视频相同的质量。该软件目前支持MP4、MOV、3GP等格式的…

Redis如何保证数据不丢失(可靠性)

本文主要以学习为主&#xff0c;详细参考&#xff1a;微信公众平台 Redis 保证数据不丢失的主要手段有两个&#xff1a; 持久化 多机部署 我们分别来看它们两的具体实现细节。 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中&#xff08;如硬盘&#xf…