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

Java SE 实现简单的图书管理系统(完善菜单操作)

在前文中,已经搭建好图书管理系统的基本框架了,还差菜单的操作没有完善,只是简单的打印。现在让我们将它的菜单操作完善,按照难易程度来挨个实现。

我们一个个来。

1.查找图书

可以根据图书的名字来进行查找,利用遍历的思路(可通过循环实现)。先输入要查找图书的名字,接着按名字在书架上一个个找,找到了就展示该图书的状态;找不到就说明书架上没有这本书。

查找图书操作:

package operations;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperation{public void work(BookList bookList) {System.out.println("1. 查找图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的图书的名字:");String name = scanner.nextLine();int sz = bookList.getBookSize();   //获取当前书架上图书的数量for (int i = 0 ;i < sz ;i++) {if(name.equals(bookList.getBook(i).getName())) {   //通过equals方法进行名字比较Book book = bookList.getBook(i);System.out.println("找到了:");System.out.println(book);   //展示该图书的状态return;                      //结束遍历(找到时)}}System.out.println("没有这本书!");   //未找到执行return;}
}

在写上述查找图书操作代码前,有些必要的工作是要做的:在书架类BookList中,我们并未其字段提供访问方法,因此这里需要提供一下

书架类:

package book;public class BookList {private Book[] books = new Book[10];  //这个书架存放10本书,具体存放几本书可以修改。private int bookSize;                 //当前书架上图书的数目//无参数的构造方法public BookList() {books[0] = new Book("三国演义","罗贯中",20,"小说");books[1] = new Book("水浒传","施耐庵",20,"小说");books[2] = new Book("西游记","吴承恩",20,"小说");books[3] = new Book("红楼梦","曹雪芹",20,"小说");this.bookSize = 4;}//先往书架上放4本书//以下为Book类中字段的访问方法:public Book getBook(int i) {  //获取第i本图书return books[i];}public int getBookSize() {return bookSize;}public void setBooks(Book[] books) {this.books = books;}public void setBookSize(int bookSize) {this.bookSize = bookSize;}
}

 书架上默认放了四本书,现在我们来测试一下,预期的结果:如果找到了指定的图书,则展示该图书当前的状态,否则告知我们没有这本书。

运行结果:

很好,符合我们的预期,但是在展示图书状态时,并不能让人满意,因为这个借阅状态不是很明确,这里可以通过对Book类中重写的 toString方法 进行修改来解决,具体如下:

public String toString() {return "Book{" +"书名:" + name  +"  作者:" + author  +"  价格:" + price +"  类型:" + type  +"  借阅状态:" + ((isBorrowed == true?"已被借阅":"未被借阅")) +'}';
}

因为借阅状态是 boolean型,我们可以通过三目操作符进行判断,如果 isBorrowed 为真,则说明图书被借走了;否则,未被借阅。这样子展示图书状态看着就舒服多了。

这样,查找图书操作就完成了! 

2.新增图书

图书管理系统的操作对象是书架,而书架是用数组来实现的,那么对于新增图书操作,我们可以从数组的角度切入,先输入一图书的信息,接着放到BookList数组中,同时图书数+1即可。用图片可以这样表示:

那么通过代码实现如下:

package operations;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOperation{public void work(BookList bookList) {//获取当前书架上的图书数int sz = bookList.getBookSize();//判断书架是否满了if (sz == bookList.getBooks().length) {System.out.println("书架满了,放不下了!");return;}//没满就继续执行Scanner scanner = new Scanner(System.in);System.out.println("请输入需要新增图书的书名:");String name = scanner.nextLine();System.out.println("请输入需要新增图书的作者:");String author = scanner.nextLine();System.out.println("请输入需要新增图书的价格:");int price = scanner.nextInt();System.out.println("请输入需要新增图书的类型:");String type = scanner.nextLine();//新增的图书Book book = new Book(name,author,price,type);//将新增的图书放到书架上bookList.setBooks(sz,book);//令书本数+1bookList.setBookSize(sz+1);return;}
}

注:在新增图书之前,先判断一下书架满了没,可以通过BookList类的对字段的访问方法得到BookList数组,再通过length方法得到数组的大小,与当前图书数进行比较,相等即满了,不然还能装。

BookList类中新增的访问字段方法:

package book;public class BookList {private Book[] books = new Book[10];  //这个书架存放10本书,具体存放几本书可以修改。private int bookSize;                 //当前书架上图书的数目//无参数的构造方法public BookList() {books[0] = new Book("三国演义","罗贯中",20,"小说");books[1] = new Book("水浒传","施耐庵",20,"小说");books[2] = new Book("西游记","吴承恩",20,"小说");books[3] = new Book("红楼梦","曹雪芹",20,"小说");this.bookSize = 4;}//先往书架上放4本书//以下为Book类中字段的访问方法:public Book getBook(int i) {  //获取第i本图书return books[i];}public int getBookSize() {return bookSize;}public Book[] getBooks() {  //获取图书数组,即书架return books;} //将新增的图书放到书架上public void setBooks(int sz,Book book) {this.books[sz] = book;}public void setBookSize(int bookSize) {this.bookSize = bookSize;}
}

进行测试,得:

可以看到新图书“语文课本”成功添加到书架上了。

 3.显示图书

显示图书操作其实很简单,只需要遍历书架,然后一个个展示就好。代码如下:

package operations;import book.Book;
import book.BookList;public class ShowOperation implements IOperation{public void work(BookList bookList) {//获取当前图书数int sz = bookList.getBookSize();//开始遍历、展示for(int i = 0 ;i < sz ;i++) {Book book = bookList.getBook(i);System.out.println(book);}}
}

进行测试,得:

成功实现。

4.退出系统

要实现退出系统操作,需要借助 System.exit(int status) 方法,参数status表示退出状态,传入0为正常退出。可以使用它来退出main方法,实现代码如下:

package operations;import book.BookList;public class ExistOperation implements IOperation{public void work(BookList bookList) {System.out.println("成功退出系统!");System.exit(0);}
}

测试结果如下:

成功实现。

5.借阅图书

对于借阅图书操作,思路其实与查找图书差不多,可以根据图书书名找到该书,先判断一下该书是否被借,如果未被借阅,则修改它的借阅状态即可。实现代码如下:

package operations;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{public void work(BookList bookList) {Scanner scanner = new Scanner(System.in);System.out.println("请输入你要借阅的图书的名字:");String name = scanner.nextLine();int sz = bookList.getBookSize();   //获取当前书架上图书的数量for (int i = 0 ;i < sz ;i++) {if(name.equals(bookList.getBook(i).getName())) {   //通过equals方法进行名字比较Book book = bookList.getBook(i);if(book.isBorrowed() == true) {System.out.println("这本书被借走了!");return;}else {System.out.println("借阅成功!");book.setBorrowed(true);return;}}System.out.println("没有这本书!");   //未找到执行return;}}
}

在写代码之前要在Book类中补充获取和设置借阅状态的访问方法:

//获得借阅状态的访问方法
public boolean isBorrowed() {return isBorrowed;
}//设置借阅状态的访问方法
public void setBorrowed(boolean borrowed) {isBorrowed = borrowed;
}

进行测试,得:

 很好,成功!

6.归还图书

归还图书操作其实就是借阅图书的相反操作。实现代码如下:

进行测试,得:

 也是成功实现了!

7. 删除图书

删除图书的操作就稍微难一点了,不过问题不大,还是回归到数组,经过前面的操作实现,我们发现:对书架进行操作时,往往依靠的是图书数,遍历也是如此,有几本书我就遍历几次。那么删除图书操作可以通过要被删除的图书的下标实现,具体方式:先用遍历的方式找出该图书的位置,若遍历完了也没找到,说明书架上没有这本书,如果这本书在书架上,无非就两种情况:1.这本书的后面有书;2.这本书的后面没书。

对于第一种情况,我们用它后面的书把它覆盖掉即可,图示:

对于第二种情况,我们只需把图书数-1即可,图示:

总结:其实无论是第一种情况还是第二种情况,我们都可以通过被删除图书后面的图书前移覆盖和图书数-1的操作实现。 

具体代码如下:

package operations;import book.BookList;import java.util.Scanner;public class DeleteOperation implements IOperation{public void work(BookList bookList) {int sz = bookList.getBookSize();Scanner scanner = new Scanner(System.in);System.out.println("请输入你要删除的图书的名字:");String name = scanner.nextLine();int i = 0;int pos = -1;//开始找要删除图书的位置,找到了就退出循环for (; i < sz; i++) {if(bookList.getBook(i).getName().equals(name)) {pos = i;break;}}//i = sz说明书架遍历结束,但未找到图书的位置,那么书架上没有该图书if(i == sz) {System.out.println("书架上没有你要删除的图书。");return;}//若该图书在书架上,则将它后面的图书前移for (int j = pos; j < sz - 1; j++) {       //这里j < sz-1,如果是 j < sz 会导致越界访问!!!bookList.setBooks(j,bookList.getBook(j+1));}//图书数-1bookList.setBookSize(sz - 1);System.out.println("删除完成!");}
}

进行测试,得:

确实按照我们的要求去删除了,成功!

到此,简易式图书管理系统就大功告成了,比起如何去丰富它的内容,如何构建框架更加的重要! 

http://www.lryc.cn/news/583515.html

相关文章:

  • 【DOCKER】-3 数据持久化
  • 项目进度受制于资源分配,如何动态调配资源
  • 20250709: WSL+Pycharm 搭建 Python 开发环境
  • PHP 基于模板动态生成 Word 文档:图片 + 表格数据填充全方案(PHPOffice 实战)
  • 爬虫-数据解析
  • 20-C#构造函数--虚方法
  • 机器视觉之工业相机讲解
  • 【leetcode100】下一个排列
  • 题解:P13017 [GESP202506 七级] 线图
  • RAC-CELL(小区)处理
  • 射频前端的革新力量:ATR2057超低噪声放大器深度解析
  • C#基础篇(10)集合类之列表
  • AMIS全栈低代码开发
  • Claude Code 开发使用技巧
  • 一天一道Sql题(day05)
  • 双立柱式带锯床cad【1张总图】+设计说明书+绛重
  • MS32C001-C单片机,32位ARM M0+内核,宽电压、低功耗、小封装。
  • Python PyDub详解:音频处理从未如此简单
  • 高效集成-C#全能打印报表设计器诞生记
  • Paimon 原子提交实现
  • 无人机雷达模块运行与技术解析
  • 【RK3568+PG2L50H开发板实验例程】FPGA部分 | ROM、RAM、FIFO 的使用
  • UI前端与数字孪生结合实践探索:智慧物流的仓储优化与管理系统
  • 缓存三大问题详解与工业级解决方案
  • 分类预测 | Matlab基于KPCA-ISSA-SVM和ISSA-SVM和SSA-SVM和SVM多模型分类预测对比
  • 【算法训练营Day10】栈与队列part2
  • 微算法科技从量子比特到多级系统,Qudits技术革新引领量子计算新时代
  • 三码合一:OneCode注解驱动的新时代编码范式
  • C++学习笔记三
  • 类模板的语法