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

图书管理系统

图书管理系统

在初步学习过JavaSE的相关知识之后我们就可以将学过的知识利用起来,因此可以做一个图书管理系统的小练习。

结果图:

1.登录

首先需要一个登陆界面来区分我们的身份是管理员还是普通用户;

//登录选择
public static User login() {System.out.println("请输入你的姓名:");Scanner sc = new Scanner(System.in);String username = sc.nextLine();System.out.println("欢迎"+username+"来到图书管理系统");System.out.println("请输入你的身份:1.管理员 2.普通用户");int choice = sc.nextInt();if (1 == choice) {return new AdminUser(username);} else if(2 == choice){return new NormalUser(username);}return null;
}

2.使用者不同造成功能不同

该系统主要分为两个部分,普通用户菜单管理员菜单,这是两个不同的面板,因此我们需要创建普通用户类和管理员类,但是为了方便管理,可以将这两个不同的类都继承同一个User类便于管理和操作;

package user;
import Operation.*;
import java.util.Scanner;
/*** 管理员面板*/
public class AdminUser extends User {public AdminUser(String name) {super(name);//创建管理员所需要的操作的数组面板this.iOperations =new IOperation[]{new ExitBook(),new FindBook(),new AddBook(),new DelBook(),new ShowBook(),};}@Overridepublic 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.println("请输入你的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}
package user;
import Book.BookList;
import Operation.*;public abstract class User {public String name;//创建数组但是不需要初始化,这是因为需要不同的类创建不同的对象IOperation[] iOperations;public User(String name) {this.name = name;}public abstract int menu();//使用具体的操作方法public void doOperations(int choice, BookList bookList) {//创建一个对象IOperation iOperation = this.iOperations[choice];iOperation.work(bookList);}
}
import Operation.*;import java.util.Scanner;/*** 普通用户面板*/
public class NormalUser extends User {public NormalUser(String name) {super(name);//这里体现出了多态的特点this.iOperations = new IOperation[]{new ExitBook(),new FindBook(),new BorrowBook(),new ReturnBook(),new ShowBook(),};}@Overridepublic int menu() {System.out.println("欢迎来到用户界面");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.println("请输入你的操作:");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}
}

在User类中就可以创建一个操作类的数组,但是User类无需实例化,因此它就可以是一个抽象类。

注:这里User之所以能够接收login的返回值是由于向上转型,它本质上还是子类。

3.管理类方法(增删查改等功能)

之后我们还需要针对不同的身份设计不同的管理图书的方法,这些可以创建一些不同的类,而这些类为了便于管理也可以实现同一个操作类接口,这样就能够将这些类放在同一个数组中;

4.图书和书架

而图书管理系统最主要的对象就是图书了,我们还可以用一个书架来存放图书,这个书架主要实现的功能就是存放和取出图书,而图书主要包括书名、作者、价格、类型以及是否被借出五个属性,这些属性构成了一本书。

package Book;/*** 书架*/
public class BookList {private Book[] books;private int usedSize;private int defaultSize = 3;public BookList() {books = new Book[defaultSize];this.books[0] = new Book("三国演义","罗贯中",18,"历史类");this.books[1] = new Book("水浒传","施耐庵",32,"武侠");this.books[2] = new Book("红楼梦","曹雪芹",24,"恋爱");usedSize = 3;}public int getDefaultSize() {return defaultSize;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}public void setBooks(int count, Book books) {this.books[count] = books;this.usedSize++;}public Book[] getBooks() {return books;}public void setBooksSpace(int newDefaultSize,Book[] books){this.books = books;this.defaultSize = newDefaultSize;}}
package Book;
/**** 书籍*/
public class Book {private String name;private String author;private int price;private String type;private Boolean isBorrowed = false;public Book(String name, String author, int price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}public String getName() {return name;}public Boolean getIsBorrow() {return isBorrowed;}public void setBorrowed(Boolean borrowed) {this.isBorrowed = borrowed;}//    打印书籍@Overridepublic String toString() {if(this.isBorrowed){return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +",已借出}";}else {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +",未借出}";}}
}

5.具体实现

5.1添加图书

package Operation;
import Book.Book;
import Book.BookList;import java.util.Arrays;
import java.util.Scanner;//增加图书
public class AddBook implements IOperation{@Overridepublic void work(BookList bookList) {//添加书籍之前需要检查书架是否为满Boolean isFulled = isFull(bookList);if(isFulled){Book[] books = Arrays.copyOf(bookList.getBooks(), bookList.getDefaultSize()*2);bookList.setBooksSpace(bookList.getDefaultSize()*2,books);}Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("添加图书...");System.out.println("请输入你要添加书籍的名字:");String name = sc.nextLine();for(int i = 0; i < count; i++){if(bookList.getBooks()[i].getName().equals(name)){System.out.println("已经有这本书了,不能重复添加!!!");return;}}System.out.println("请输入你要添加书籍的作者:");String author = sc.nextLine();System.out.println("请输入你要添加书籍的价格:");int price = sc.nextInt();System.out.println("请输入你要添加书籍的类型:");sc.nextLine();String type = sc.nextLine();bookList.setBooks(count,new Book(name, author, price, type));System.out.println("添加完成!");bookList.setUsedSize(count + 1);System.out.println(bookList.getBooks()[count].toString());}//判断书架中的书是否满员public static boolean isFull(BookList bookList){if(bookList.getUsedSize() >= bookList.getDefaultSize()){return true;}else {return false;}}
}

注:添加图书时需要注意书架的容量是否充足,如果不充足还需要扩容,可以使用Arrays.copyof来扩容;

Arrays.copyOf扩容时是将数组对象复制下来创建一个新的数组,因此需要将其传回给原来的Book数组。

5.2删除图书

package Operation;import Book.BookList;
import Book.Book;import java.util.Scanner;public class DelBook implements IOperation {@Overridepublic void work(BookList bookList) {assert bookList.getBooks()[0] != null;System.out.println("删除图书.....");Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("请输入你要删除书籍的名字:");String name = sc.nextLine();for (int i = 0; i < count; i++) {//寻找书是否存在if (bookList.getBooks()[i].getName().equals(name)) {bookList.getBooks()[i] = null;for (int j = i; j < count - 1; j++) {Book book = bookList.getBooks()[j + 1];bookList.setBooks(j, book);}bookList.setBooks(count - 1, null);bookList.setUsedSize(count - 1);System.out.println("删除成功!!!");return;}}System.out.println("未找到这本书,无法删除!!!");}
}

5.3查找图书

 
package Operation;import Book.BookList;import java.util.Scanner;//查找图书
public class FindBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查找图书....");Scanner sc = new Scanner(System.in);int count = bookList.getUsedSize();System.out.println("请输入你要查找书籍的名字:");String name = sc.nextLine();for(int i = 0; i < count; i++){if(bookList.getBooks()[i].getName().equals(name)){System.out.println("查找成功:");System.out.println(bookList.getBooks()[i].toString());return;}}System.out.println("没找到这本书!");}
}

5.4展示图书

 
package Operation;import Book.BookList;//展示图书
public class ShowBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示图书信息....");int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {System.out.println(bookList.getBooks()[i].toString());}}
}

5.5归还图书

package Operation;import Book.BookList;import java.util.Scanner;//归还书籍
public class ReturnBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书.....");Scanner sc = new Scanner(System.in);System.out.println("请输入你要归还的图书的名字:");String bookName = sc.nextLine();int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {if(bookList.getBooks()[i].getName().equals(bookName)){if(bookList.getBooks()[i].getIsBorrow()){bookList.getBooks()[i].setBorrowed(false);System.out.println("还书成功。");return;}else {System.out.println("该书已经被归还,无需归还!!!");return;}}}System.out.println("未找到"+bookName+"这本书,无法归还!!!");}
}

5.6退出系统

package Operation;
/*** 退出图书系统*/import Book.BookList;public class ExitBook implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统....");int count = bookList.getUsedSize();if(bookList.getBooks() != null){for (int i = count - 1; i >= 0; i--) {bookList.setBooks(i, null);}}System.exit(0);}
}

5.7借阅图书

package Operation;import Book.BookList;import java.util.Scanner;//借阅图书
public class BorrowBook implements IOperation {@Overridepublic void work(BookList bookList) {System.out.println("借出图书.....");Scanner sc = new Scanner(System.in);System.out.println("请输入你要借出的图书的名字:");String bookName = sc.nextLine();int count = bookList.getUsedSize();for (int i = 0; i < count; i++) {if(bookList.getBooks()[i].getName().equals(bookName)){if(!bookList.getBooks()[i].getIsBorrow()){bookList.getBooks()[i].setBorrowed(true);System.out.println("借书成功。");return;}else {System.out.println("该书已经被借出,无法借出!!!");return;}}}System.out.println("没有找到该书,无法借阅!!");}
}

6.书籍统一管理

 
package Operation;import Book.BookList;//书籍统一操作
public interface IOperation {//动态绑定实现具体操作public void work(BookList bookList);
}

这里是一个接口,无需实现,其最主要的作用就是统一管理操作书架的方法。

7.测试

 
import Book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Test {//登录选择public static User login() {System.out.println("请输入你的姓名:");Scanner sc = new Scanner(System.in);String username = sc.nextLine();System.out.println("欢迎"+username+"来到图书管理系统");System.out.println("请输入你的身份:1.管理员 2.普通用户");int choice = sc.nextInt();if (1 == choice) {return new AdminUser(username);} else if(2 == choice){return new NormalUser(username);}return null;}public static void main(String[] args) {BookList bookList = new BookList();//返回操作图书系统的对象User user = login();while(true){//返回选择的操作int choice =user.menu();user.doOperations(choice,bookList);}}
}

8.总结

总的来说,图书管理系统涉及到的知识有类和对象的基础知识,数组、变量等,封装、继承和多态,动态绑定和方法重写,接口的实现和抽象类的继承;而其难点主要在于图书管理系统架构的搭建,总体框架搭好以后其中的内容倒不是很难。

http://www.xdnf.cn/news/7201.html

相关文章:

  • 滑动窗口算法详解与C++实现
  • 【背包dp】小结
  • 20250518 黎曼在三维空间中总结的一维二维的规律,推广到高维度合适吗?有没有人提出反对意见
  • Power BI Desktop运算符和新建列
  • 职场方法论总结(3)-金字塔原理
  • Redis的持久化机制
  • 深入探索PointNet:点云处理的革命性算法
  • 【MySQL】02.数据库基础
  • 安装和升级到devExpress23.1.7
  • #Redis黑马点评#(七)实战篇完结
  • 2025 ISCC 练武赛Pwn-wp(含附件)
  • 知识图谱(KG)与大语言模型(LLM)
  • 《算法导论(第4版)》阅读笔记:p83-p85
  • buck变换器的simulink/matlab仿真和python参数设计
  • 互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
  • 进程概念及操作系统的知识点
  • 基于STM32的多传感器融合的设施农业小型搬运机器人避障控制系统设计
  • React方向:react的基本语法-数据渲染
  • 备战!全国青少年信息素养大赛图形化编程-省赛——求最小公倍数
  • 【CF】Day61——Codeforces Round 939 (Div. 2) CD (思维构造 | 思维构造 + dfs枚举)
  • Python实例题:基于scrapy爬虫的天气数据采集
  • 构建 TypoView:一个富文本样式预览工具的全流程记录
  • 基于RDMA的跨节点GPU显存共享技术实践
  • Linux系统编程——system函数和popen函数的使用方法以及区别
  • ImgShrink:摄影暗房里的在线图片压缩工具开发记
  • C#里与嵌入式系统W5500网络通讯(2)
  • STM32SPI实战-Flash模板
  • 第6章 实战案例:基于 STEVAL-IDB011V1 板级 CI/CD 全流程
  • 深入解析Java事件监听机制与应用
  • std::is_same