Java——简易图书管理系统

本文使用 Java 实现一个简易图书管理系统

一、思路

简易图书管理系统说白了其实就是 用户 与 图书 这两个对象之间的交互

书的属性有

书名

作者

类型

价格

借阅状态


而用户可以分为

普通用户

管理员

使用数组将书统一管理起来

用户对这个数组进行操作


普通用户可以进行

查看所有书籍

借阅书籍

归还书

退出系统


而管理员可以进行普通用户的所有操作,此外

增加书籍

删除书籍


大致如此

二、实现

2.1 创建对象

2.1.1 书

public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态  
}

书需要构造方法

以及重写 toString,方便输出

public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态//构造方法//书一开始的状态都是未借出//boolean类型在不赋值的情况下默认人为falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((IsBorrowed == true)?"已接触":"未借出") +'}';}
}

为方便管理,将所有与书有关的类放到同一个包下面去

package book;public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态//构造方法//书一开始的状态都是未借出//boolean类型在不赋值的情况下默认人为falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((IsBorrowed == true)?"已接触":"未借出") +'}';}
}

目前就是如此

其他方法在实现用户与图书交互时进行补充

2.1.2 用户

为方便管理,将用户相关类放到另一个包中

用户与管理员在属性上是相同的

那么就可以继承于一个抽象类

package user;abstract public class User {protected String name;public User(String name) {this.name = name;}
}
package user;public class NormalUser extends User {public NormalUser(String name) {super(name);}
}
package user;public class Administrator extends User{public Administrator(String name) {super(name);}
}

可能用到的方法依旧是在后文中进行补充


2.2 交互

2.2.1 操作界面

用户在登陆时会检测身份

public static  User  login(){System.out.println("欢迎使用图书管理系统!!!");Scanner scanner = new Scanner(System.in);System.out.println("请输入您的姓名");String name = scanner.nextLine();System.out.println("请选择你的身份");System.out.println("1.普通用户");System.out.println("2.管理员");int choice = scanner.nextInt();if(choice == 1){return new NormalUser (name);}else if(choice == 2){return new Administrator(name);}else {System.out.println("输入的值无效");}return null;}

无论是管理员还是普通用户都会有操作界面

那就可以将这个方法作为抽象方法放在 User 类

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

在子类中实现

package user;public class NormalUser extends User {public NormalUser(String name) {super(name);}@Overridepublic void menu() {System.out.println("请选择操作");System.out.println("1.显示图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("4.查找图书");System.out.println("0.退出系统!");}
}
package user;public class Administrator extends User{public Administrator(String name) {super(name);}@Overridepublic void menu() {System.out.println("请选择操作");System.out.println("1.显示图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("4.查找图书");System.out.println("5.增加图书");System.out.println("6.删除图书");System.out.println("0.退出系统!");}
}

测试

  public static void main(String[] args) {User user = login();user.menu();}

2.2.2 书架

将书放到一个数组中方便管理

定义一个书架类

这个书架中默认会有几本书

书架有默认容量和已存书本数量

package book;public class BookList {private final int defaultcapacity = 10;//默认容量protected Book[] booklist = new Book[defaultcapacity];private int usespace;//已存书本容量public BookList() {this.booklist[0] = new Book("三体", "刘慈欣", 18.88, "小说");this.booklist[1] = new Book("西游记", "吴承恩", 17.77, "小说");this.booklist[2] = new Book("红楼梦", "曹雪芹", 16.66, "小说");usespace = 3;}public int usesize(){return this.usespace;}public int size(){return this.booklist.length;}
}

所有操作实际上都是对 booklist 这个数组进行

2.2.3 对图书操作

无论是管理员还是普通用户的操作

都可以理解成一种行为的多态

那就可以用一个接口

package behavior;import book.BookList;public interface Behavior{void work();//各种操作BookList booklist = new BookList();
}

所有的操作都是实现了这个接口的类

public class AddBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("添加图书");}
}
public class BorrowedBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("借阅图书");}
}
public class ExitBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("退出系统!");}
}
public class RemoveBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("归还图书!");}
}
public class ReturnBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("归还图书");}
}
public class ShowBehavior implements Ibehavior{@Overridepublic void work() {System.out.println("展示未借阅的图书!");}
}

public class FindBehavior implements Behavior{@Overridepublic void work() {System.out.println("查找图书!");}
}

2.2.4 具体实现对图书操作

普通用户与管理员有对应的操作

可以在普通用户类与管理员类中创建一个数组

public class Administrator extends User{public Administrator(String name) {super(name);}protected Behavior[] behaviors = {new ExitBehavior(),new ShowBehavior(),new BorrowedBehavior(),new ReturnBehavior(),new FindBehavior(),new AddBehavior(),new RemoveBehavior()};@Overridepublic void menu() {System.out.println("请选择操作");System.out.println("1.显示图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("4.查找图书");System.out.println("5.增加图书");System.out.println("6.删除图书");System.out.println("0.退出系统!");}
}
public class NormalUser extends User {public NormalUser(String name) {super(name);}
protected Behavior[] behaviors = {new ExitBehavior(),new ShowBehavior(),new BorrowedBehavior(),new ReturnBehavior(),new FindBehavior()};@Overridepublic void menu() {System.out.println("请选择操作");System.out.println("1.显示图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("4.查找图书");System.out.println("0.退出系统!");}
}

这里就需要对应的下标值来对数组进行操作

而对应下标值可以通过 menu 方法来返回

修改一下就可以了

public class Administrator extends User{public Administrator(String name) {super(name);}protected Behavior[] behaviors = {new ExitBehavior(),new ShowBehavior(),new BorrowedBehavior(),new ReturnBehavior(),new FindBehavior(),new AddBehavior(),new RemoveBehavior()};@Overridepublic int menu() {System.out.println("请选择操作");System.out.println("1.显示图书");System.out.println("2.借阅图书");System.out.println("3.归还图书");System.out.println("4.查找图书");System.out.println("5.增加图书");System.out.println("6.删除图书");System.out.println("0.退出系统!");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();return choice;}@Overridepublic void DoBehavior(int choice){this.behaviors[choice].work();}
}
public class NormalUser extends User {public NormalUser(String name) {super(name);}
protected Behavior[] behaviors = {new ExitBehavior(),new ShowBehavior(),new BorrowedBehavior(),new ReturnBehavior(),new FindBehavior()};@Overridepublic 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);int choice = scanner.nextInt();return choice;}@Overridepublic void DoBehavior(int choice){this.behaviors[choice].work();}
}

对各项操作进行实现

2.2.4.1 退出系统(即结束程序)

public class ExitBehavior implements Behavior{@Overridepublic void work() {System.out.println("退出系统!");System.exit(0);}
}

测试


2.2.4.2 查找图书

根据书名进行对应图书查找

需要拿到书名

BookBookList 中增加方法

public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态//构造方法//书一开始的状态都是未借出//boolean类型在不赋值的情况下默认人为falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((IsBorrowed == true)?"已接触":"未借出") +'}';}public String getName(){return this.name;}
}
package book;public class BookList {private final int defaultcapacity = 10;//默认容量protected Book[] booklist = new Book[defaultcapacity];private int usespace;//已存书本容量public BookList() {this.booklist[0] = new Book("三体", "刘慈欣", 18.88, "小说");this.booklist[1] = new Book("西游记", "吴承恩", 17.77, "小说");this.booklist[2] = new Book("红楼梦", "曹雪芹", 16.66, "小说");usespace = 3;}public int usesize(){
//        存放书本数量return this.usespace;}public int size(){
//        书架总容量return this.booklist.length;}public String getBookName(int index){
//        返回对应位置的书名return this.booklist[index].getName();}public Book getBook(int index){
//        返回对应位置的书return this.booklist[index];}
}

package behavior;import java.util.Scanner;public class FindBehavior implements Behavior{@Overridepublic void work() {System.out.println("查找图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入你要查找的书籍名称:");String name = scanner.nextLine();for (int i = 0; i < booklist.usesize(); i++) {if(name.equals(booklist.getBookName(i))){System.out.println("已找到您要查找的图书");System.out.println(booklist.getBook(i));return;}}System.out.println("没有您要查找的书籍");}
}

测试


2..2.4.3 打印图书

将书架上所有书打印出来

只展示没有被借出的图书

那就需要获得书的借出状态

public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态//构造方法//书一开始的状态都是未借出//boolean类型在不赋值的情况下默认人为falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((IsBorrowed == true)?"已接触":"未借出") +'}';}public String getName(){return this.name;}public Boolean IsBorrowed(){return this.IsBorrowed;}
}
package behavior;public class ShowBehavior implements Behavior{@Overridepublic void work() {System.out.println("展示未借阅的图书!");for (int i = 0; i < booklist.usesize(); i++) {if(!booklist.getBook(i).IsBorrowed()){System.out.println(booklist.getBook(i));}}}
}

测试


2.2.4.4 借阅与归还图书

查找到对应图书

修改该书的 IsBorrowed 属性即可

需要在 Book 中增加 set 方法

package book;public class Book {private String name;//书名private String author;//作者private double price;//价格private String type;//类型boolean IsBorrowed;//借出状态//构造方法//书一开始的状态都是未借出//boolean类型在不赋值的情况下默认人为falsepublic Book(String name, String author, double price, String type) {this.name = name;this.author = author;this.price = price;this.type = type;}@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +((IsBorrowed == true)?"已接触":"未借出") +'}';}public void setBorrowed_borrow(){this.IsBorrowed = true;}public void setBorrowed_return(){this.IsBorrowed = false;}public String getName(){return this.name;}public Boolean IsBorrowed(){return this.IsBorrowed;}
}
package behavior;import java.util.Scanner;public class ReturnBehavior implements Behavior {@Overridepublic void work() {System.out.println("归还图书");System.out.println("请输入您要归还的图书名称:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for (int i = 0; i < booklist.usesize(); i++) {if (name.equals(booklist.getBookName(i)) && !booklist.getBook(i).IsBorrowed()){System.out.println("本系统已录入该图书");return;}if (name.equals(booklist.getBookName(i))) {booklist.getBook(i).setBorrowed_return();System.out.println("归还成功!");return;}}System.out.println("这本书不属于本系统!");}
}
package behavior;import java.util.Scanner;public class BorrowedBehavior implements Behavior {@Overridepublic void work() {System.out.println("借阅图书");System.out.println("请输入您要借阅的图书名称:");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();for (int i = 0; i < booklist.usesize(); i++) {if (name.equals(booklist.getBookName(i)) && booklist.getBook(i).IsBorrowed()){System.out.println("该图书已借出");return;}if (name.equals(booklist.getBookName(i))) {booklist.getBook(i).setBorrowed_borrow();System.out.println("借阅成功!");return;}}System.out.println("没有您要借阅的书籍");}
}

测试


2.2.4.5 增加图书 

先判断书架是否是满的

再判断是否存在同名书籍

增加后需要将 usespace++

需要一个 set 方法

package book;public class BookList {private final int defaultcapacity = 10;//默认容量protected Book[] booklist = new Book[defaultcapacity];private int usespace;//已存书本容量public BookList() {this.booklist[0] = new Book("三体", "刘慈欣", 18.88, "小说");this.booklist[1] = new Book("西游记", "吴承恩", 17.77, "小说");this.booklist[2] = new Book("红楼梦", "曹雪芹", 16.66, "小说");usespace = 3;}public int usesize(){
//        存放书本数量return this.usespace;}public int size(){
//        书架总容量return this.booklist.length;}public void setUsespace(int usespace) {//改变书架书的数量this.usespace = usespace;}public void setBooklist(Book book){
//        增加书籍this.booklist[usespace++] = book;}public String getBookName(int index){
//        返回对应位置的书名return this.booklist[index].getName();}public Book getBook(int index){
//        返回对应位置的书return this.booklist[index];}
}
public class AddBehavior implements Behavior{@Overridepublic void work() {System.out.println("添加图书");if (booklist.size() == booklist.usesize()) {System.out.println("书架已满!");return;}//判断书架是否已满Scanner scanner = new Scanner(System.in);System.out.println("请输入您要添加的书籍名称:");String name = scanner.nextLine();for (int i = 0; i < booklist.usesize(); i++) {
//            判断是否存在同名书籍if (name.equals(booklist.getBookName(i))) {System.out.println("系统已收录该图书");return;}}System.out.println("请输入该书的作者");String author = scanner.nextLine();System.out.println("请输入该书的价格");double price = scanner.nextDouble();String type = scanner.nextLine();//接受回车键System.out.println("请输入该书的类型");type = scanner.nextLine();Book book = new Book(name,author,price,type);booklist.setBooklist(book);System.out.println("新增图书成功!");}
}

测试

2.2.4.6 删除图书 

找到对应的图书

如果已经借出就不能删除

如果没有借出

将他所在空间置为 null

然后将他所在位置之后的图书向前移动

同样需要在 BookList 类中补充方法

package book;public class BookList {private final int defaultcapacity = 10;//默认容量protected Book[] booklist = new Book[defaultcapacity];private int usespace;//已存书本容量public BookList() {this.booklist[0] = new Book("三体", "刘慈欣", 18.88, "小说");this.booklist[1] = new Book("西游记", "吴承恩", 17.77, "小说");this.booklist[2] = new Book("红楼梦", "曹雪芹", 16.66, "小说");usespace = 3;}public int usesize(){
//        存放书本数量return this.usespace;}public int size(){
//        书架总容量return this.booklist.length;}public void setUsespace(int usespace) {//改变书架书的数量this.usespace = usespace;}public void setBooklist(Book book){
//        增加书籍(放在尾部)this.booklist[usespace++] = book;}public void setBooklist(Book book,int index){
//        增加书籍(指定位置)this.booklist[index] = book;}public void removeBook(int index){//删除对应下标位置的书this.booklist[index] = null;}public String getBookName(int index){
//        返回对应位置的书名return this.booklist[index].getName();}public Book getBook(int index){
//        返回对应位置的书return this.booklist[index];}
}
package behavior;import java.util.Scanner;public class RemoveBehavior implements Behavior {@Overridepublic void work() {System.out.println("删除图书!");Scanner scanner = new Scanner(System.in);System.out.println("请输入您要删除的书籍名称:");String name = scanner.nextLine();for (int i = 0; i < booklist.usesize(); i++) {if (name.equals(booklist.getBookName(i)) && booklist.getBook(i).IsBorrowed()) {
//                已借出不能删除System.out.println("该图书已借出");return;}if (name.equals(booklist.getBookName(i)) && !booklist.getBook(i).IsBorrowed()) {booklist.removeBook(i);//指定位置置空for (int j = i; j < booklist.usesize() - 1; j++) {//指定位置处的书向前移动booklist.setBooklist(booklist.getBook(j + 1), j);}System.out.println("删除成功!");int newspace = booklist.usesize();booklist.setUsespace(--newspace);//删除后 书架中的存储的书的数量减少return;}}System.out.println("没有您要删除的书籍");return;}
}

测试


感谢观看

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

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

相关文章

有趣的css - 圆形背景动效多选框

大家好&#xff0c;我是 Just&#xff0c;这里是「设计师工作日常」&#xff0c;今天分享的是用 css 实现一个圆形背景动效多选框&#xff0c;适用提醒用户勾选场景&#xff0c;突出多选框选项&#xff0c;可以有效增加用户识别度。 最新文章通过公众号「设计师工作日常」发布…

VBA批量合并带有图片、表格与文本框的Word

本文介绍基于VBA语言&#xff0c;对大量含有图片、文本框与表格的Word文档加以批量自动合并&#xff0c;并在每一次合并时添加分页符的方法。 在我们之前的文章基于Python中docx与docxcompose批量合并多个Word文档文件并逐一添加分页符&#xff08;https://blog.csdn.net/zhebu…

helloworld 可执行程序得到的过程

// -E 预处理 开发过程中可以确定某个宏 // -c 把预处理 编译 汇编 都做了,但是不链接 // -o 指定输出文件 // -I 指定头文件目录 // -L 指定链接库文件目录 // -l 指定链接哪一个库文件 #include <stdio.h> #include <stdlib.h> #include <string.h>int mai…

【微积分】CH16 integrals and vector fields听课笔记

【托马斯微积分学习日记】13.1-线积分_哔哩哔哩_bilibili 概述 16.1line integrals of scalar functions [中英双语]可视化多元微积分 - 线积分介绍_哔哩哔哩_bilibili 16.2vector fields and line integrals&#xff1a; work circulation and flux 向量场差不多也是描述某种…

gpt-4o继续迭代考场安排程序 一键生成考场清单

接上两篇gpt-4o考场安排-CSDN博客&#xff0c;考场分层次安排&#xff0c;最终exe版-CSDN博客 当然你也可以只看这一篇。 今天又添加了以下功能&#xff0c;程序见后。 1、自动分页&#xff0c;每个考场打印一页 2、添加了打印试场单页眉 3、添加了页脚 第X页&#xff0c;…

Leetcode刷题笔记1:数组基础1

导语 leetcode刷题笔记记录&#xff0c;本篇博客记录数组基础1部分的题目&#xff0c;主要题目包括&#xff1a; Leetcode 704 二分查找Leetcode 27 移除元素 知识点 二分查找 原理 二分查找的适用对象为有序数组且数组中无重复元素&#xff0c;其主要原理是每次都从有序…

AI视频教程下载:全面掌握ChatGPT和LangChain开发AI应用(附源代码)

这是一门深入的课程&#xff0c;涉及ChatGPT、LangChain和Python。打造专注于现实世界AI集成的AI应用&#xff0c;课件附有每一节涉及到的源代码。 **你将学到什么&#xff1a;** - 将ChatGPT集成到LangChain的生产风格应用中 - 使用LangChain组件构建复杂的文本生成管道 - …

推荐五个线上兼职,在家也能轻松日入百元,适合上班族和全职宝妈

在这个瞬息万变的时代&#xff0c;你是否也曾考虑过在繁忙的工作之外&#xff0c;寻找一份兼职副业来补贴家用&#xff0c;同时保持生活的多样性&#xff1f;别急&#xff0c;现在就让我为你揭秘五个可靠的日结线上兼职岗位&#xff0c;助你轻松迈向财务自由之路&#xff01; 一…

云WAF与传统WAF:网络安全的双重防线

在网络安全领域&#xff0c;Web应用防火墙&#xff08;WAF&#xff09;是守护企业网络安全的重要盾牌。随着云计算技术的迅猛发展&#xff0c;云WAF作为一种新型的安全服务模式&#xff0c;正逐渐成为企业网络安全防护的新宠。本文将深入探讨云WAF与传统WAF的区别&#xff0c;分…

使用 Flask 和 Celery 构建异步任务处理应用

文章目录 什么是 Flask&#xff1f;什么是 Celery&#xff1f;如何在 Flask 中使用 Celery&#xff1f;步骤 1&#xff1a;安装 Flask 和 Celery步骤 2&#xff1a;创建 Flask 应用程序步骤 3&#xff1a;运行 Celery Worker步骤 4&#xff1a;启动 Flask 应用程序 结论 在构建…

高校网站群及融媒体中心建设方案

一、项目背景 随着信息技术的飞速发展&#xff0c;互联网已成为高校展示形象、传播信息、服务师生、沟通社会的重要渠道。然而&#xff0c;目前许多高校在网站建设和媒体传播方面存在以下问题&#xff1a; 网站分散、缺乏统一规划&#xff1a;各高校内部往往存在多个部门或学院…

零拷贝(Zero-Copy)

1.背景 现在有这样一个场景&#xff0c;我们需要在本地选择一个文件后&#xff0c;然后上传到网络上。 我们再看看文件的内容数据的具体搬运过程&#xff1a; 你会发现&#xff0c;在整个文件搬运的过程中&#xff0c;发生了多次的数据拷贝和上下文转换。 4次数据拷贝&#…

深入探索:移动云服务器的强大之处

文章目录 一 什么是移动云二 移动云服务器的使用三 移动云服务器的优点四 在移动云上部署node.js项目五 移动云服务器的应用场景六 移动云服务器的使用体验总结 一 什么是移动云 移动云是指用户可以通过移动设备访问云端的数据和应用&#xff0c;无需在本地设备上进行存储和处…

单片机LCD1602显示电子时钟设计

基于52单片机电子时钟的设计 摘要 本次设计的多功能时钟系统采用STC89C52单片机为核心器件&#xff0c;利用其定时器/计数器定时和记数的原理&#xff0c;结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来&#xff0c;使得系…

汇编实现的操作系统

掌握X86汇编语言和GDB程序调试工具对于程序员来说是非常重要的_gdb 查看x86汇编-CSDN博客 掌握编译器和虚拟机的开发有哪些方面的好处-CSDN博客 Ville Mikael Turjanmaan开发的一个操作系统MenuetOS可运行在IA-32, x86-64平台上&#xff0c;完全用 64 位汇编语言编写。功能包…

从参数变化解读 MySQL 8.2.0 发版说明

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 日前&#xff0c;MySQL 8.2.0 创新版本已正式上线&#xff0c;并提供安装包下载&#xff0c;但 docker 镜像尚未更新。 在 MySQL 8.1.0 刚发版时也做过分析&#xff0c;欢迎阅读&#xff1a; 重…

区块链技术和应用

文章目录 前言 一、区块链是什么&#xff1f; 二、区块链核心数据结构 2.1 交易 2.2 区块 三、交易 3.1 交易的生命周期 3.2 节点类型 3.3 分布式系统 3.4 节点数据库 3.5 智能合约 3.6 多个记账节点-去中心化 3.7 双花问题 3.8 共识算法 3.8.1 POW工作量证明 总结 前言 学习长…

Drone+Gitee自动执行构建、测试和发布工作流

拉取Drone:(至于版本&#xff0c;你可以下载最新的) sudo docker pull drone/drone:2 拉取runner&#xff1a; sudo docker pull drone/drone-runner-docker 在Gitee中添加第三方应用&#xff1a; 进入个人主页&#xff0c;点击设置&#xff1a; 往下翻&#xff0c;找到数…

前缀和,差分算法理解

前缀和是什么&#xff1a; 前缀和指一个数组的某下标之前的所有数组元素的和&#xff08;包含其自身&#xff09;。前缀和分为一维前缀和&#xff0c;以及二维前缀和。前缀和是一种重要的预处理&#xff0c;能够降低算法的时间复杂度 说个人话就是比如有一个数组&#xff1a; …