【JAVA】建立一个图书管理系统

news2024/9/23 22:55:07

在建立一个图书管理系统的时候我们首先需要构造一个书类

public class Book {
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrwed;

    public Book(String name, String author, int price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }//构造方法

因为类成员是 private修饰的所以我们要用到set和get构造器来访问它们

 public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    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 isBorrwed() {
        return isBorrwed;
    }

    public void setBorrwed(boolean borrwed) {
        isBorrwed = borrwed;
    }//用于获取图书和设置图书

打印一下 用tosring

  @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ((isBorrwed==true)?"已经借出":"未被借出")+
                '}';
    }
}//它将生成并返回一个格式化的字符串,拿来打印的

第二步我们需要建立一个书架,这个书架的作用是拿取书 增加书,借阅书等操作都将在这里完成

所以我们建立一个新的类

package book;

public class Booklist {
    private Book[] books;
    private int usedsize;
    private static final int DEA=10;
    public Booklist(){
        this.books=new Book[DEA];
        //放书
        this.books[0]=new Book("三国演义","罗贯中",10,"小说");
        this.books[1]=new Book("红楼梦","曹雪芹",19,"小说");
        this.books[2]=new Book("西游记","吴承恩",22,"小说");
        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;
    }

public Book[] getBooks(){
        return books;
}


}

因为要放多本书,所以我们的类成员需要是数组

同样的下列方法

构造函数:

public Booklist() 初始化一个Booklist对象时,创建一个大小为DEA的Book数组,并填充了三本预设的书籍信息,同时设置了usedsize为3,表示已有3本书被使用

  1. getter 和 setter 方法:

    • getUsedsize() 返回当前使用的书籍数量。
    • setUsedsize(int usedsize) 设置当前使用的书籍数量。
    • getBook(int pos) 返回索引为pos位置处的Book对象。
    • setBooks(int pos, Book book) 将新的Book对象替换到索引为pos的位置上。
    • getBooks() 返回整个书籍数组,包含了所有存储的Book对象。

 第三步我们回到main函数来布置主要的逻辑

可以看到我们有两个界面一个是管理员界面一个是普通用户界面。首先我们需要完善它们的菜单

然后根据我们的选择进入哪个菜单

先完成主函数设置

public class Main {
    public static User login(){
        System.out.println("请输入你的姓名");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        System.out.println("请输入你的身份1.管理员 2.普通用户");
        int choice= scanner.nextInt();
        if (choice==1){
            return new Adimer(name);
        }
        else {
            return new NormalUser(name);

        }
    }

然后我们来设置管理员系统和普通用户系统,在设置它们两之前 我们要先弄一个总的用户系统

这个系统不需要实例化只需要被继承所以他应该是抽象类

package user;

import book.Booklist;
import oper.IOperation;

public abstract class User {
    protected String name;
    protected IOperation[] ioperations;

    public User(String name) {
        this.name = name;

    }

    public  abstract int menu();
    public void doOpenration(int choice, Booklist booklist){
        ioperations[choice].work(booklist);
    }
}
package oper;

import book.Booklist;

public interface IOperation {

    void work(Booklist booklist);
}

在实现这个类之前 我们需要构建一个接口

这个接口的设计意图是为了规定一种规范,任何实现了 IOperation 接口的类都需要提供一个执行具体工作的 work 方法,这个方法接受一个 Booklist 对象作为参数。

  1. 成员变量:

    • name:保护类型(protected)的字符串变量,用于存储用户的姓名。
    • ioperations:保护类型(protected)的 IOperation 接口数组,其中每个元素都是一个实现了 IOperation 接口的对象。这些对象代表用户可以执行的各种操作,如查找图书、添加图书、删除图书等。
  2. 构造函数:

    • public User(String name):接收一个字符串参数 name,用于初始化用户的名字。
  3. 抽象方法:

    • public abstract int menu():这是一个抽象方法,要求子类必须实现。这个方法通常用来展示一个操作菜单并获取用户选择的操作编号。
  4. 具体方法:

    • public void doOpenration(int choice, Booklist booklist):根据传入的 choice 参数调用 ioperations 数组中对应索引位置的操作对象的 work() 方法,并将一个 Booklist 对象作为参数传递给该方法。Booklist 类似于一个图书列表,包含了图书的相关信息。

现在来设置用户系统和管理员系统

 用户系统

package user;

import oper.*;

import java.util.Scanner;

public class NormalUser extends User{
    public NormalUser(String name) {
        super(name);//帮助父类构造
        this.ioperations=new IOperation[]{new Exitoperation(),new Findpritation(),new borropertation(),
        new returnpertation()};
    }
    public int menu(){
        System.out.println("*********************");
        System.out.println("****1.查找图书*********");
        System.out.println("****2.借阅图书*********");
        System.out.println("****3.归还图书*********");
        System.out.println("****0.退出************");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choie=scanner.nextInt();
        return choie;
    }
}
  1. 类定义:public class NormalUser extends User 表示 NormalUser 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public NormalUser(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含四个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、borropertation(借阅图书操作)和 returnpertation(归还图书操作)。这些操作是普通用户在图书管理系统中可以执行的动作。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对普通用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

管理员系统

 

package user;

import oper.*;

import java.util.Scanner;

public class Adimer extends User{
    public Adimer(String name) {
        super(name);
        this.ioperations=new IOperation[]{new Exitoperation(),
                new Findpritation(),new Addoperation(),new Deloperation(),
                new Showoperation()
        };
    }
    public int menu(){
        System.out.println("*********************");
        System.out.println("****1.查找图书*********");
        System.out.println("****2.新增图书*********");
        System.out.println("****3.删除图书*********");
        System.out.println("****4.显示图书*********");
        System.out.println("****0.退出系统*********");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的操作");
        int choie=scanner.nextInt();
        return choie;

    }

}

  1. 类定义:public class Adimer extends User 表示 Adimer 类继承自 User 类,可以获得父类的所有属性和方法。

  2. 构造函数:public Adimer(String name) 接收一个字符串参数 name,并在构造函数中调用父类的构造函数 super(name) 以初始化用户名字。同时,它创建了一个 IOperation 类型的数组,包含五个操作实现类对象:Exitoperation(退出操作)、Findpritation(查找图书操作)、Addoperation(新增图书操作)、Deloperation(删除图书操作)和 Showoperation(显示图书操作)。这些操作是管理员用户在图书管理系统中可以执行的动作,相比普通用户,管理员拥有更多的权限,例如新增和删除图书。

  3. menu() 方法:重写了父类的抽象方法 menu(),在此方法中打印出针对管理员用户的操作菜单,并通过 Scanner 从控制台读取用户的选择。根据用户输入的数字,返回相应的操作编号。

现在我们来构造功能 

 增加图书

ackage oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Addoperation implements IOperation{



    public void work(Booklist booklist) {
        System.out.println("新增图书");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入书名");
        String name=scanner.nextLine();
        System.out.println("请输入作者");
        String author =scanner.nextLine();

        System.out.println("请输入类型");
        String type=scanner.nextLine();
        System.out.println("请输入价格");
        int price=scanner.nextInt();

        Book book=new Book(name,author,price,type);

        //检查 数组当中有没有这本书
        int currentsize= booklist.getUsedsize();
        for (int i = 0; i <currentsize; i++) {
            Book book1=booklist.getBook(i);
            if (book1.getName().equals(name)){
                System.out.println("有这本书,不进行存放");
                return;
            }
        }
        if(currentsize== booklist.getBooks().length){
            System.out.println("书架满了");
        }
        else {
            booklist.setBooks(currentsize,book);
            booklist.setUsedsize(currentsize+1);
        }

    }
}
  1. 类定义:public class Addoperation implements IOperation 表示 Addoperation 类实现了 IOperation 接口,需要实现接口中定义的 work() 方法。

  2. work(Booklist booklist) 方法:

    • 打印提示信息,让用户输入新书的信息(书名、作者、类型、价格)。
    • 使用 Scanner 从控制台读取用户输入。
    • 根据用户输入创建一个新的 Book 对象。
    • 检查 Booklist 中是否存在同名的书籍。通过遍历 booklist 中已有的图书,比较书名是否相同。
    • 如果存在同名书籍,则打印提示信息并结束本次新增操作。
    • 如果 Booklist 已满(即已存图书的数量等于 booklist 数组的容量),则打印提示信息。
    • 若以上条件均不满足,则将新书添加到 Booklist 中,通过调用 booklist.setBooks(currentsize, book) 将新书放置在数组的下一个可用位置,并通过调用 booklist.setUsedsize(currentsize + 1) 更新已使用书籍的数量。

 借阅图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class borropertation  implements IOperation{



    public void work(Booklist booklist) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("借阅图书");
        String name=scanner.nextLine();
        int currensize=booklist.getUsedsize();
        for (int i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                book.setBorrwed(true);
                System.out.println("借阅成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你借阅的图书不存在");
    }
}

与增加图书的接口一样

work(Booklist booklist) 方法:

使用 Scanner 从控制台读取用户输入的想要借阅的图书的书名。
获取图书列表 booklist 中当前已存图书的数量(currensize)。
遍历图书列表中的所有图书(通过 booklist.getBook(i) 获取每一本书),比较每本书的书名是否与用户输入的书名相同。
如果找到匹配的书名,则将该书的借阅状态设为 true(通过调用 book.setBorrwed(true)),输出借阅成功的消息,并打印出借阅后的图书详细信息。
若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“你借阅的图书不存在”。

删除图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Deloperation  implements IOperation{


    public void work(Booklist booklist) {
        System.out.println("删除图书");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入你要删除的图书");
        String name=scanner.nextLine();
        int pos=-1;
        int i=0;

        int currensize= booklist.getUsedsize();
        for ( i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                pos=i;
                break;
            }

        }
        if (i==currensize){
            System.out.println("没有你要删除的图书");
            return;
        }
        //开始删除
        int j=pos;
        for ( j = pos; j < currensize-1; j++) {
            //
            Book book=booklist.getBook(j+1);
            booklist.setBooks(j,book);
        }

        booklist.setBooks(j,null);
        booklist.setUsedsize(currensize-1);
    }
}

work(Booklist booklist) 方法:

  • 打印提示信息,让用户输入要删除的图书的书名。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 遍历图书列表 booklist 中的所有图书,寻找与用户输入相匹配的书名。
  • 如果找到了匹配的书名,记录下该书在列表中的位置(pos)并跳出循环。
  • 如果遍历完列表仍未找到匹配书名,则输出提示信息“没有你要删除的图书”,并直接返回。
  • 如果找到了匹配的书名,开始执行删除操作:从找到的书所在位置 (pos) 开始,将后面的所有图书向前移动一位,覆盖掉待删除图书的位置,相当于删除了该书。
  • 最后,将列表末尾的元素设为 null,并减少已使用图书的数量(通过调用 booklist.setUsedsize(currensize - 1)

退出系统

这里比较简单用个方法就好

package oper;

import book.Booklist;

public class Exitoperation implements IOperation{


    public void work(Booklist booklist) {
        System.out.println("退出图书");
        System.exit(0);
    }
}

 查找图书

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class Findpritation  implements IOperation{



    public void work(Booklist booklist) {
        System.out.println("找到图书");
        Scanner scanner=new Scanner(System.in);
        String name=scanner.nextLine();
        int currentsize= booklist.getUsedsize();
        for (int i=0;i<currentsize;i++){
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                System.out.println("找到了这本书;信息如下");
                System.out.println(book);
                return;
            }
        }
        System.out.println("没有找到");
    }
}

work(Booklist booklist) 方法:

  • 打印提示信息,提示用户输入要查找的图书名称。
  • 使用 Scanner 从控制台读取用户输入的书名。
  • 获取图书列表 booklist 中当前已存图书的数量(currentsize)。
  • 遍历图书列表中的所有图书,通过调用 booklist.getBook(i) 获取每一本书,并判断每本书的书名是否与用户输入的书名相同。
  • 如果找到匹配的书名,则打印出找到的图书的信息,并通过 System.out.println(book) 输出图书详情,然后结束查找操作。
  • 若遍历完整个图书列表都没有找到与用户输入相符的书名,则输出提示信息:“没有找到”

 归还图书

和借阅图书一样改一下bool的状态打印一下结果就好

package oper;

import book.Book;
import book.Booklist;

import java.util.Scanner;

public class returnpertation  implements IOperation{


    public void work(Booklist booklist) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("归还图书");
        String name=scanner.nextLine();
        int currensize=booklist.getUsedsize();
        for (int i = 0; i <currensize; i++) {
            Book book=booklist.getBook(i);
            if (book.getName().equals(name)){
                book.setBorrwed(false);
                System.out.println("归还成功");
                System.out.println(book);
                return;
            }
        }
        System.out.println("你归还的图书不存在");
    }
}

显示图书

package oper;

import book.Book;
import book.Booklist;

public class Showoperation  implements IOperation{

    public void work(Booklist booklist) {
        System.out.println("打印图书");
        int curernsize=booklist.getUsedsize();
        for (int i = 0; i <curernsize; i++) {
            Book book=booklist.getBook(i);
            System.out.println(book);
        }
    }


}
  • 打印提示信息,提示正在打印图书列表。
  • 获取图书列表 booklist 中当前已存图书的数量(curernsize)。
  • 遍历图书列表,通过调用 booklist.getBook(i) 获取每一本书,并使用 System.out.println(book) 打印出每本书的详细信息

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

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

相关文章

一键采集主流电商平台商品详情数据以及接入演示示例

一键抓取电商平台数据通常涉及到网络爬虫技术&#xff0c;该技术可以自动化地从网页上提取信息。不过要注意&#xff0c;任何形式的数据采集都应遵守相关网站的使用条款和隐私政策&#xff0c;以及当地的法律法规。 以下是一个概念性的步骤说明&#xff0c;展示如何通过API采集…

GIT开发中的使用

目录 GIT什么是Git&#xff1f;Git的安装Git 的基本操作 认识工作区、暂存区、版本库查看.git文件 版本回退撤销修改删除&#xff08;版本库中&#xff09;文件分支管理理解分支创建分支切换分支合并分支删除分支合并冲突分支管理策略bug分支删除临时分支 远程仓库向远程仓库推…

2015年认证杯SPSSPRO杯数学建模D题(第二阶段)城市公共自行车全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 D题 城市公共自行车 原题再现&#xff1a; 城市交通问题直接影响市民的生活和工作。在地形平坦的城市&#xff0c;公共自行车出行系统是一种很好的辅助手段。一般来说&#xff0c;公共自行车出行系统由数据中心、驻车站点、驻车桩、自行车&…

PyPy为什么能让Python比C还快?一文了解内在机制

「如果想让代码运行得更快&#xff0c;您应该使用 PyPy。」—— Python 之父 Guido van Rossum 对于研究人员来说&#xff0c;迅速把想法代码化并查看其是否行得通至关重要。Python 是能够实现这一目标的出色语言&#xff0c;它能够让人们专注于想法本身&#xff0c;而不必过度…

Go第三方框架--gin框架(一)

序言 Gin框架作为go语言使用最多的web框架&#xff0c;以其快速的响应速度和对复杂http路由配置的支持受到程序员和媛们的喜爱&#xff0c;几乎统治了web市场。但作为一名合格的程序员&#xff0c;要知其然更要知其所以然&#xff0c;不然八股文背的也没有啥意思。本着这个原则…

海量数据处理项目-账号微服务和流量包数据库表+索引规范(下)

海量数据处理项目-账号微服务和流量包数据库表索引规范&#xff08;下&#xff09; 第2集 账号微服务和流量包数据库表索引规范讲解《下》 简介&#xff1a;账号微服务和流量包数据库表索引规范讲解 账号和流量包的关系&#xff1a;一对多traffic流量包表思考点 海量数据下每…

MySQL基础(DDL,DML,DQL)

目录 一DDL 1.1数据库操作 1.1.1查询所有数据库&#xff1a; 1.1.2创建数据库 1.1.3 使用数据库 1.1.4 删除数据库 1.2表操作 1.2.1表操作 1.2.1.1创建表 1.2.1.1.1约束 1.2.1.1.2 数据类型 1.2.1.1.2.1 数值类型 1.2.1.1.2.2 字符串类型 1.2.1.1.2.3日期类型 1.…

win10笔记本在显示设置中不慎将主显示器禁用掉导致开机黑屏的解决方案

因为笔记本电脑的显示扩展接口有问题&#xff0c;所以在电脑开机之后&#xff0c;会误识别出几个不存在的扩展屏幕&#xff0c;所以我就想从显示设置中将这几个误识别出来的扩展屏幕禁用掉&#xff08;不然鼠标总是移动到主屏幕边界之外的地方&#xff09;&#xff0c;在显示设…

2.8、下拉刷新与上拉加载

页面的下拉刷新与上拉加载功能在移动应用中十分常见,例如,新闻页面的内容刷新和加载。这两种操作的原理都是通过响应用户的触摸事件,在顶部或者底部显示一个刷新或加载视图,完成后再将此视图隐藏。 实现思路 以下拉刷新为例,其实现主要分成三步: 监听手指按下事件,记录…

Epic LootBox Effects

Lootbox的程式化粒子效果。 为每个效果添加稀有度效果。 (常见、不常见、罕见、史诗) 产品特点 - 25个战利品箱特效,4个稀有特效(普通、罕见、稀有、史诗) -适用于2D和3D游戏。 - 适用于移动设备和台式机。 - 包括演示场景和手册。 下载:​​Unity资源商店链接资源下载链…

C++ STL- list 的使用以及练习

目录 0.引言 1. list 介绍 2. list 使用 2.1 构造函数 2.2 list iterator 的使用 3 list capacity 4. list element access 5. list modifiers 6. list 迭代器失效 7. list 与vector 对vector 8. OJ 题讲解 删除链表的倒数第 N 个节点&#xff1a; 0.引言 …

绿盟《安全知识图谱技术白皮书》.PDF

共82页&#xff0c;包含网络安全智能化发展趋势、安全知识图谱技术框架、安全知识图谱关键技术、安全知识图谱典型应用场景、安全知识图谱技术发展趋势等。 由于篇幅限制&#xff0c;仅展示部分内容 完整版图谱PDF&#xff0c;请关公号【网络安全实战】&#xff0c;后台发送“…

考研数学一——概率论真题——自我总结题型整理(总分393)

系列文章目录 终于考完研了&#xff0c;本人考的是南京航空航天大学的仪器科学与技术&#xff0c;英一数一电路&#xff0c;以下是成绩单&#xff1a; 平时习惯整理自己的学习体系&#xff0c;以下是一个记录。 其实&#xff0c;每个人都应该训练&#xff0c;看到某一类题目…

Vue2手搓级联组件

本文的布局才用了叶落风尘大佬的一片文章&#xff0c;功能是自己加的 源代码 页面部分 <div class"h-100vh grid place-items-center"><div><div class"h-455px flex flex-col border-1px border-solid border-#eee w-885px"><div cl…

洁净环境监测相关法规指南汇总

一 洁净级别确认 1. 用于生产无菌药品的洁净室和洁净空气设备如单向流系统&#xff08;UDAF&#xff09;、限制进入屏障系统&#xff08;RABS&#xff09;和隔离器&#xff0c;应根据所需环境特性进行确认。生产操作需要在适当洁净度级别的环境中进行&#xff0c;以降低粒子或…

【漏洞复现】通天星CMSV6-inspect_file-upload文件上传漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

Android实现一周时间早中晚排班表

我们要做一个可以动态添加,修改一周早中晚时间排班表&#xff0c;需求图如下&#xff1a; one two 过程具体在这里不描述了&#xff0c;具体查看&#xff0c;https://github.com/yangxiansheng123/WorkingSchedule 上传数据格式&#xff1a; {"friday_plan":"…

个人周总结

个人周总结&#xff1a; 对于总体方向目标的完成&#xff0c;完成的不是很好&#xff0c;这周内的很多天都在游离&#xff0c;就是事情可能有需要做的&#xff0c;但是动力不很足&#xff0c;期间就是有点摆烂了。后面及时调整调整吧&#xff0c;有这种情况&#xff0c;一个原…

无人驾驶(移动机器人)路径规划之A star(Tie Breaker)算法及其matlab实现

在自动驾驶与移动机器人路径规划时&#xff0c;必定会用到经典的算法A star。下面是我未加入与加入Tie Breaker 的matlab实现效果。可以发现加入Tie Breaker之后效果明显改善。 目录 一、效果比较 1.未加入Tie Breaker&#xff08;黑色为障碍物&#xff0c;菱形绿色为目标点…

婴儿洗衣机有必要买吗?四大满分婴儿洗衣机入围榜单

宝宝衣服的清洗对父母来说都很重要&#xff0c;所以挑选一款适合宝宝的波轮洗衣机显得尤为重要。也许有许多人认为&#xff0c;为婴儿购买独立的洗衣机是不必要的&#xff0c;但是你是否了解呢&#xff1f;新生婴儿的肌肤要比成人更脆弱&#xff0c;更易受到感染而受到伤害&…