零基础Java第十八期:图书管理系统

     

目录

一、package book 

1.1.  Book

1.2. BookList 

二、package user

2.1. User

2.2. NormalUser与AdminiUser 

三、Main

四、NormalUser与AdminiUser的菜单界面

五、package operation 

5.1.  设计管理员菜单

六、业务逻辑

七、完整代码


今天博主来带大家实现一个图书管理系统。今天的这期博客我们需要用的知识点有:java的基础语法、类和对象、继承与多态、抽象类接口。

       在这个系统里面,我们需要创建的对象有书、书架、管理员、普通用户。 这么多对象,我们就要使用包来进行分类。我们先创建三个包:book、user、operation。

一、package book 

1.1.  Book

package book;public class Book {private String title;//书籍名称private String author;//作者private int price;//价格private String type;//类型private boolean BeBorrowed;//是否被借出public Book(String title, String author, int price, String type, boolean beBorrowed) {this.title = title;this.author = author;this.price = price;this.type = type;BeBorrowed = beBorrowed;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}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 isBeBorrowed() {return BeBorrowed;}public void setBeBorrowed(boolean beBorrowed) {BeBorrowed = beBorrowed;}@Overridepublic String toString() {return "Book{" +"title='" + title + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", BeBorrowed=" + BeBorrowed +'}';}
}

     我们定义的成员变量如上代码所示,我们只需要创建成员变量,剩下的都可以用编译器帮我们生成。

1.2. BookList 

package book;public class BooList {private Book[] books;//存放书籍private static final int DEFAULT_SIZE = 10;private int usedSize; // 有效书籍的个数public BooList(Book[] books) {this.books = books;}public int getUsedSize() {return usedSize;}public void setUsedSize(int usedSize) {this.usedSize = usedSize;}
}

       我们的书架要存储很多的书,那么我们就用一个数组来存储。我们利用SIZE来确定数组的长度。如果说,这个书架最多能放下10本书,而我们手上需要有三本书需要存放,那我们就定义一个有效书籍这个变量。

二、package user

2.1. User

package user;public abstract class User {public String name;public User(String name){this.name = name;}public abstract void menu();
}

      用户分为普通用户与管理员,后两者需要继承用户,我们就可以对用户这个类进行抽象化。我们在User类里面同时在写一个menu方法(且这个方法无具体表现)。

2.2. NormalUser与AdminiUser 

package user;public class NormalUser extends User{public NormalUser(String name) {super(name);}@Overridepublic void menu() {System.out.println("普通用户菜单");}
}package user;public class AdminiUser extends User{public AdminiUser(String name) {super(name);}@Overridepublic void menu() {System.out.println("管理员菜单");}
}

三、Main

      通过Main这个类,我们可以来进行一些操作,比如输入姓名,选择身份,查找图书等。我们在main方法之前,先写一个登录方法,因为我们的返回值是User的子类,所以把返回值类型void改成User。我们在这里可以先运行一下。

import user.AdminiUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User Login() {Scanner sca = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = sca.nextLine();System.out.println("请输入你的身份:1.管理员  2.普通用户");int choice = sca.nextInt();if(choice == 1){return new AdminiUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {User user = Login();user.menu();}
}

四、NormalUser与AdminiUser的菜单界面

    @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 sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}

      我们需要根据用户的选择来确定对应的菜单,并返回我们的choice,此时我们要对重写的menu方法的返回值也要进行修改,把void也要改成int。同样地,User类里面的抽象方法的返回值也要改成int。普通用户的菜单也同理。

    @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("0.退出系统");System.out.println("****************************");Scanner sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}

五、package operation 

       下面就是要根据用户对菜单的功能进行分类。分类要按照我们Main里面的选择来确定这个人是管理员还是普通用户。也就是通过choice的值来调用那个菜单。

5.1.  设计管理员菜单

       首先我们先来设计查找或者是图书,就要在书架里面遍历数组来查找我们的图书。 那我们如何对这些功能进行分类呢?那么这些功能就得有一个统一的类型,所以说我们下一步就是要设计统一的类型。我们可以使用一个数组,并且这个数组还得是最高的类型。那我们就可以新建一个接口IOperation。我们利用数组的下标来进行对功能的选择。普通用户的菜单也同理。

    public AdminiUser(String name) {super(name);this.iOperations = new IOperation[] {new ExitSystem(),new FindBook(),new AddBook(),new DeleteBook(),new DisplayBook()};}

        当我们选择用户并进入菜单界面之后,我们就需要调用方法来对我们的功能进行实现。下面的方法通过调用就可以帮助我们实现时调用管理员还是普通用户。因为我们已经在BooList类里面实现了一个数组,所以我们直接可以把Book类换成BooList类,当然因为两个对象在不同包里面,我们就需要在每个功能里面导入"import book.BooList;"。

public interface IOperation {void work(BooList books);
}public void doOperation(int choice, BooList books){IOperation iOperation = this.iOperations[choice];iOperation.work(books);}

 下面我们就可以给成员变量赋值了。

public BooList() {this.books = new Book[DEFAULT_SIZE];this.books[0] = new Book("骆驼祥子","老舍",26,"小说",false);this.books[1] = new Book("雷雨","曹禺",24,"戏剧",true);this.books[2] = new Book("再别康桥","徐志摩",19,"诗歌",false);this.books[3] = new Book("五猖会","鲁迅",21,"散文",false);
}

六、业务逻辑

      我们基本的框架已经搭建好了,下面我们该实现我们的业务逻辑。下面我们分别实现查找、借阅、归还的业务。 

public class FindBook implements IOperation{@Overridepublic void work(BooList booList) {System.out.println("查找图书...");Scanner sca = new Scanner(System.in);String name = sca.nextLine();1.先确定  当前数组当中 有效的书籍个数int currentSize = booList.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = booList.getBook(i);if(book.getTitle().equals(name)) {System.out.println("找到这本书籍了,书籍内容如下:");System.out.println(book);return;}}System.out.println("没有你要找的书籍。");}
}
public class ExitSystem implements IOperation{@Overridepublic void work(BooList books) {System.out.println("退出系统...");int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {
//            books[i] = null;books.setBooks(i,null);}System.exit(0);}
}
public class BorrowBook implements IOperation{@Overridepublic void work(BooList books) {System.out.println("借阅图书...");System.out.println("请输入你要借阅的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//1.先遍历数组 查找是否存在要借阅的图书int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = books.getBook(i);if(book.getTitle().equals(name)) {//2.如果存在 检查 是否已经被借出if (book.isBeBorrowed()) {System.out.println("这本书已经被借出了!");} else {//3. 如果没有借出 可以借book.setBeBorrowed(true);System.out.println(book);System.out.println("借阅成功!!");}return;}}//4.如果不存在 则不能借阅System.out.println("没有你要找的这本书,无法借阅!!");}
}

七、完整代码

import book.BooList;
import user.AdminiUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Main {public static User Login() {Scanner sca = new Scanner(System.in);System.out.println("请输入你的姓名:");String name = sca.nextLine();System.out.println("请输入你的身份:1.管理员  2.普通用户");int choice = sca.nextInt();if(choice == 1){return new AdminiUser(name);}else{return new NormalUser(name);}}public static void main(String[] args) {BooList booList = new BooList();User user = Login();int choice = user.menu();user.doOperation(choice,booList);}
}

package book;public class Book {private String title;//书籍名称private String author;//作者private int price;//价格private String type;//类型private boolean BeBorrowed;//是否被借出public Book(String title, String author, int price, String type, boolean beBorrowed) {this.title = title;this.author = author;this.price = price;this.type = type;BeBorrowed = beBorrowed;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}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 isBeBorrowed() {return BeBorrowed;}public void setBeBorrowed(boolean beBorrowed) {BeBorrowed = beBorrowed;}@Overridepublic String toString() {return "Book{" +"title='" + title + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +", BeBorrowed=" + BeBorrowed +'}';}public boolean beBorrowed(){return isBeBorrowed();}
}
package book;public class BooList {private Book[] books;//存放书籍private static final int DEFAULT_SIZE = 10;private int usedSize; // 有效书籍的个数public BooList() {this.books = new Book[DEFAULT_SIZE];this.books[0] = new Book("骆驼祥子","老舍",26,"小说",false);this.books[1] = new Book("雷雨","曹禺",24,"戏剧",true);this.books[2] = new Book("再别康桥","徐志摩",19,"诗歌",false);this.books[3] = new Book("五猖会","鲁迅",21,"散文",false);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;}
}
package user;import book.BooList;
import book.Book;
import operation.IOperation;public abstract class User {public String name;public IOperation[] iOperations;public User(String name){this.name = name;}public abstract int menu();public void doOperation(int choice, BooList books){
//       return this.iOperations[choice];IOperation iOperation = this.iOperations[choice];iOperation.work(books);}
}
package user;import operation.*;import java.util.Scanner;public class NormalUser extends User{public NormalUser(String name) {super(name);this.iOperations = new IOperation[]{new ExitSystem(),new FindBook(),new BorrowBook(),new ReturnBook()};}@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("0.退出系统");System.out.println("****************************");Scanner sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}
}
package user;import book.Book;
import operation.*;import java.util.Scanner;public class AdminiUser extends User{public AdminiUser(String name) {super(name);this.iOperations = new IOperation[] {new ExitSystem(),new FindBook(),new AddBook(),new DeleteBook(),new DisplayBook()};}@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 sca = new Scanner(System.in);int choice = sca.nextInt();return choice;}
}
package operation;import book.BooList;
import book.Book;public interface IOperation {void work(BooList books);
}
package operation;
import book.BooList;
import book.Book;public class AddBook implements IOperation{@Overridepublic void work(BooList books){System.out.println("新增图书...");}
}
package operation;
import book.BooList;
import book.Book;import java.util.Scanner;public class BorrowBook implements IOperation{@Overridepublic void work(BooList books) {System.out.println("借阅图书...");System.out.println("请输入你要借阅的图书:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//1.先遍历数组 查找是否存在要借阅的图书int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {Book book = books.getBook(i);if(book.getTitle().equals(name)) {//2.如果存在 检查 是否已经被借出if (book.isBeBorrowed()) {System.out.println("这本书已经被借出了!");} else {//3. 如果没有借出 可以借book.setBeBorrowed(true);System.out.println(book);System.out.println("借阅成功!!");}return;}}//4.如果不存在 则不能借阅System.out.println("没有你要找的这本书,无法借阅!!");}
}
package operation;
import book.BooList;
import book.Book;public class ExitSystem implements IOperation{@Overridepublic void work(BooList books) {System.out.println("退出系统...");int currentSize = books.getUsedSize();for (int i = 0; i < currentSize; i++) {
//            books[i] = null;books.setBooks(i,null);}System.exit(0);}
}

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

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

相关文章

系统架构师考试极限18天备考复盘(2024年11月)

前言 写下这篇复盘笔记的时候还没有出成绩。目前泽崽还是在读研究生&#xff0c;在经过 大概2周多个全日 的极限备考之后&#xff0c;于11月10日参加了软考的系统架构师考试&#xff08;高级&#xff09;。目前对于“基础知识-案例分析-论文”的估分预期大概是&#xff1a;55-…

Unity肢体控制(关节控制)

前面的基础搭建网上自己搜&#xff0c;我这个任务模型网上也有&#xff0c;可以去官网看看更多模型&#xff0c;这里只讲述有模型如何驱动肢体的操作方式 第一步&#xff1a;创建脚本 第二步&#xff1a;创建Rig Builder 建空容器 加部件&#xff08;Rig&#xff09;,加了之后…

二叉树遍历的非递归实现和复杂度分析

一&#xff0c;用栈实现二叉树先序遍历 1&#xff0c;原理 我用自己的口水话解释一下&#xff1a;准备一个栈&#xff0c;从根节点开始&#xff0c;先判断栈是否为空&#xff0c;如果否&#xff0c;就弹出一个元素&#xff0c;对弹出元素进行自定义处理&#xff0c;再将它的左…

redis序列化数据查询

可以看到是HashMap&#xff0c;那么是序列化的数据 那么我们来获得反序列化数据 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import redis.clients.jedis.Jedis;public class RedisDeserializeDemo {public static…

球差控制操作数【ZEMAX操作数】

在光学设计中&#xff0c;对于球差的控制是必要的&#xff0c;那么在zemax中如何控制球差的大小&#xff0c;理解球差&#xff0c;以及使用相应操作数控制球差&#xff1b; 在这篇中主要写如何使用zemax操作数去控制或者消除球差&#xff0c;对球差进行简单的描述&#xff0c;之…

学习threejs,使用TWEEN插件实现动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PLYLoader PLY模型加…

前端 JS 实用操作总结

目录 1、重构解构 1、数组解构 2、对象解构 3、...展开 2、箭头函数 1、简写 2、this指向 3、没有arguments 4、普通函数this的指向 3、数组实用方法 1、map和filter 2、find 3、reduce 1、重构解构 1、数组解构 const arr ["唐僧", "孙悟空&quo…

从0开始学习--Day26--聚类算法

无监督学习(Unsupervised learning and introduction) 监督学习问题的样本 无监督学习样本 如图&#xff0c;可以看到两者的区别在于无监督学习的样本是没有标签的&#xff0c;换言之就是无监督学习不会赋予主观上的判断&#xff0c;需要算法自己去探寻区别&#xff0c;第二张…

矩阵数组转置

#include<stdio.h> int main() {int arr1[3][4];//三行四列变成四行三列int arr2[4][3];for(int i0;i<3;i)//三行{for(int j0;j<4;j)//四列{scanf("%d",&arr1[i][j]);//录入}}for(int i0;i<3;i)//转置{for(int j0;j<4;j){arr2[j][i]arr1[i][j]…

利用正则表达式批量修改文件名

首先&#xff0c; 我们需要稍微学习一下正则表达式的使用方式&#xff0c;可以看这里&#xff1a;Notepad正则表达式使用方法_notepad正则匹配-CSDN博客 经过初步学习之后&#xff0c;比较重要的内容我做如下转载&#xff1a; 元字符是正则表达式的基本构成单位&#xff0c;它们…

rust高级特征

文章目录 不安全的rust解引用裸指针裸指针与引用和智能指针的区别裸指针使用解引用运算符 *&#xff0c;这需要一个 unsafe 块调用不安全函数或方法在不安全的代码之上构建一个安全的抽象层 使用 extern 函数调用外部代码rust调用C语言函数rust接口被C语言程序调用 访问或修改可…

【How AI Works】读书笔记3 出发吧! AI纵览 第二部分

目录 1.说明 2.第二部分(P9~P10) 机器学习算法总结(监督学习) 3.单词 4.专业术语 1.说明 书全名:How AI Works From Sorcery to Science 作者 Ronald T.Kneusel 2.第二部分(P9~P10) 总结机器学习算法 作者把机器学习的过程比喻成输入-->黑盒-->输出 这里的标签可…

HarmonyOS NEXT应用开发实战 ( 应用的签名、打包上架,各种证书详解)

前言 没经历过的童鞋&#xff0c;首次对HarmonyOS的应用签名打包上架可能感觉繁琐。需要各种秘钥证书生成和申请&#xff0c;混在一起也分不清。其实搞清楚后也就那会事&#xff0c;各个文件都有它存在的作用。 HarmonyOS通过数字证书与Profile文件等签名信息来保证鸿蒙应用/…

【自用】0-1背包问题与完全背包问题的Java实现

引言 背包问题是计算机科学领域的一个经典优化问题&#xff0c;分为多种类型&#xff0c;其中最常见的是0-1背包问题和完全背包问题。这两种问题的核心在于如何在有限的空间内最大化收益&#xff0c;但它们之间存在一些关键的区别&#xff1a;0-1背包问题允许每个物品只能选择…

Python_爬虫3_Requests库网络爬虫实战(5个实例)

目录 实例1&#xff1a;京东商品页面的爬取 实例2&#xff1a;亚马逊商品页面的爬取 实例3&#xff1a;百度360搜索关键词提交 实例4&#xff1a;网络图片的爬取和存储 实例5&#xff1a;IP地址归地的自动查询 实例1&#xff1a;京东商品页面的爬取 import requests url …

黑马微项目

目录 1 飞机票 2 生成一个五位数验证码 3 数字加密 4 数字解密 5 抢红包 6 双色球系统 7 用户登录 8 金额转换 9 手机号屏蔽 10 罗马数字转换 11 调整字符串 12 初级学生管理系统&#xff08;学生数据的管理&#xff09; 13 学生管理系统&#xff08;用户的相关操…

C2M柔性制造模式

C2M柔性制造模式&#xff08;Customer-to-Manufacturer&#xff0c;客户到制造商的柔性制造模式&#xff09;是一种新型的生产模式&#xff0c;强调客户需求与制造过程的直接对接&#xff0c;并且能够快速响应和适应客户个性化的定制需求。这种模式结合了定制化生产与智能制造&…

IoT [remote electricity meter]

IoT [remote electricity meter] 物联网&#xff0c;远程抄表&#xff0c;电表数据&#xff0c;举个例子

2、开发工具和环境搭建

万丈高楼平地起&#xff0c;学习C语言先从安装个软件工具开始吧。 1、C语言软件工具有两个作用 1、编辑器 -- 写代码的工具 2、编译器 -- 将代码翻译成机器代码0和1 接下来我们介绍两种C语言代码工具&#xff1a;devcpp 和 VS2019&#xff0c;大家可以根据自己的喜好安装。 dev…

20241115在飞凌的OK3588-C的核心板上跑Linux R4时拿大文件到电脑的方法

20241115在飞凌的OK3588-C的核心板上跑Linux R4时拿大文件到电脑的方法 2024/11/15 15:26 缘起&#xff1a;使用SONY 405的机芯&#xff0c;以1080p60录像了半小时&#xff0c;3.5GB的mp4视频要拿到电脑上播放确认。 方法&#xff1a;1、拷贝到TF卡。记住&#xff0c;对于FAT32…