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类型在不赋值的情况下默认人为false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public 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类型在不赋值的情况下默认人为false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public 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);
    }

    @Override
  public 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);
    }

    @Override
  public 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{
    @Override
    public void work() {
        System.out.println("添加图书");
    }
}
public class BorrowedBehavior implements Ibehavior{
    @Override
    public void work() {
        System.out.println("借阅图书");
    }
}
public class ExitBehavior implements Ibehavior{
    @Override
    public void work() {
        System.out.println("退出系统!");
    }
}
public class RemoveBehavior implements Ibehavior{
    @Override
    public void work() {
        System.out.println("归还图书!");
    }
}
public class ReturnBehavior implements Ibehavior{
    @Override
    public void work() {
        System.out.println("归还图书");
    }
}
public class ShowBehavior implements Ibehavior{
    @Override
    public void work() {
        System.out.println("展示未借阅的图书!");
    }
}

public class FindBehavior implements Behavior{
    @Override
    public 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()};

    @Override
    public 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()};
    @Override
    public 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()};

    @Override
    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("5.增加图书");
        System.out.println("6.删除图书");
        System.out.println("0.退出系统!");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
    @Override
    public 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()};
    @Override
    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);
        int choice = scanner.nextInt();
        return choice;
    }
    @Override
    public void DoBehavior(int choice){
        this.behaviors[choice].work();
    }
}

对各项操作进行实现

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

public class ExitBehavior implements Behavior{
    @Override
    public 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类型在不赋值的情况下默认人为false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public 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{
    @Override
    public 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类型在不赋值的情况下默认人为false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public 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{
    @Override
    public 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类型在不赋值的情况下默认人为false
    public Book(String name, String author, double price, String type) {
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }

    @Override
    public 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 {
    @Override
    public 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 {
    @Override
    public 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{
    @Override
    public 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 {
    @Override
    public 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;
    }
}

测试


感谢观看

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Axure RP 10汉化版修改文字

效果 安装目录 lang/default Axure 10 RP 汉化包&#xff08;概览改图层&#xff09;

Express 的 req 和 res 对象

新建 learn-express文件夹&#xff0c;执行命令行 npm init -y npm install express 新建 index.js const express require(express); const app express();app.get(/, (req, res, next) > {res.json(return get) })app.post(/, (req, res, next) > {res.json(retur…

单机一天轻松300+ 最新微信小程序拼多多+京东全自动掘金项目、

现代互联网经济的发展带来了新型的盈利方式&#xff0c;这种方法通过微信小程序的拼多多和京东进行商品自动巡视&#xff0c;以此给商家带来增加的流量&#xff0c;同时为使用者带来利润。实践这一手段无需复杂操作&#xff0c;用户仅需启动相应程序&#xff0c;商品信息便会被…

【东山派Vision K510开发板试用笔记】WiFi配网问题

目录 概述 WiFi配网的修改 悬而未决的问题 概述 最近试用了百问网提供的东山派Vision开发板&#xff0c;DongshanPI-Vision开发板是百问网针对AI应用开发设计出来的一个RSIC-V架构的AI开发板&#xff0c;主要用于学习使用嘉楠的K510芯片进行Linux项目开发和嵌入式AI应用开发…

闲话 .NET(5):.NET Core 有什么优势?

前言 .NET Core 并不是 .NET FrameWork 的升级版&#xff0c;它是一个为满足新一代的软件设计要求而从头重新开发的开发框架和平台&#xff0c;所以它没有 .NET FrameWork 的历史包袱&#xff0c;相对于 .NET FrameWork&#xff0c;它具备很多优势。 .NET Core 有哪些优势&am…

什么是DDoS流量清洗?

随着互联网的飞速发展&#xff0c;网络安全问题日益凸显&#xff0c;其中分布式拒绝服务&#xff08;DDoS&#xff09;攻击尤为引人关注。为了有效应对这一威胁&#xff0c;流量清洗服务应运而生&#xff0c;成为网络安全领域的一项重要技术。 流量清洗服务是一种专门针对DDoS…

最小生成树【做题记录】c++(Prim,Kruskal)

目录 Prim算法求最小生成树 【算法思想】 【算法实现】 【数据结构设计】 【算法步骤】 【输入输出】 【代码示例】 Kruskal算法求最小生成树 【算法思想】 判断是否会产生回路的方法 【算法描述】 【图的存储结构】 【输入输出】 【代码示例】 Prim算法求最小生…

Reactor设计模式

Reactor设计模式 Reactor模式称为反应器模式或应答者模式&#xff0c;是基于事件驱动的设计模式&#xff0c;拥有一个或多个并发输入源&#xff0c;有一个服务处理器和多个请求处理器&#xff0c;服务处理器会同步的将输入的请求事件以多路复用的方式分发给相应的请求处理器。…

Android 自定义图片进度条

用系统的Progressbar&#xff0c;设置图片drawable作为进度条会出现图片长度不好控制&#xff0c;容易被截断&#xff0c;或者变形的问题。而我有个需求&#xff0c;使用图片背景&#xff0c;和图片进度&#xff0c;而且在进度条头部有个闪光点效果。 如下图&#xff1a; 找了…

Nginx部署静态网页

1、首先拿到前端给的dist包&#xff0c;上传到服务器指定位置&#xff1a;/ajd/dist 2、找到nginx.conf配置文件&#xff0c;修改 server {listen 9300;server_name xxx.xx.xx.xx;location / {root /ajd/dist;try_files $uri $uri/ /index.html;index index.html …

电赛一等奖!基于TMS320F2812的简易数字频率计

电赛一等奖&#xff01;简易数字频率计设计&#xff08;原理图、PCB、源码、分析报告&#xff09; 这份文件是关于合肥工业大学电气与自动化工程学院的一个项目报告&#xff0c;题目为“基于TMS320F2812的简易数字频率计”。项目由方敏、侯其立、李苗、张巧云四位本科生完成&am…

区块链技术和应用

文章目录 前言 一、区块链是什么&#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工作量证明 总结 前言 学习长…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器&#xff0c;首先回到数据的存储上&#xff0c;数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据&#xff0c;需要对数据在哪这个抽象的概念进行表述&#xff0c;我们科技树发展过程中把数据在哪用地址表示。一个数…

2. C++服务器编程-信号

什么是信号 其实信号就是一个中断。就是在执行程序的时候突然来了一个信号&#xff0c;然后我们去执行这个新来的程序了&#xff0c;这就是中断。 处理方法 信号的处理方式∶忽略、捕获、默认处理 linux中都有那些信号 man7 signal 比如说kill -9 安装man中文手册 自己百…

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

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

【CSP CCF记录】202012-2 期末预测之最佳阈值

题目 过程 思路 第一次没用前缀和&#xff0c;暴力求解得50分。 采用前缀和方法。 1. 对原数组stu[i]进行排序。 2. 计算前缀和数组s[]&#xff0c;s[i]表示安全指数的y_i的前缀和&#xff0c;即安全指数小于等于y_i时的实际挂科情况&#xff0c;y_i之前有多少个未挂科&am…

边用边充电影响寿命吗?看看计算机指令组成与操作类型

计算机指令集体系结构之指令 指令由操作码和地址码字段组成。 操作码指明了指令要完成的操作。 长度可以固定&#xff1a;比如RISC&#xff08;reduced instruction set computer&#xff09;精简指令集计算机 与之对应的RISC&#xff08;复杂指令集计算机&#xff09;&…

【css3】02-css3新特性之选择器篇

目录 1 属性选择器 2 结构伪类选择器 3 其他选择器 :target和::selection ::first-line和::first-letter 4 伪类和伪元素的区别 伪类&#xff08;Pseudo-classes&#xff09; 伪元素&#xff08;Pseudo-elements&#xff09; 伪类和伪元素的区别 1 属性选择器 ☞ 属性选…

失落的方舟台服预下载教程 一键下载+账号注册教程

失落的方舟台服预下载教程 一键下载&#xff0b;账号注册教程 是一款今年备受瞩目的游戏&#xff0c;将于5月30日正式上线&#xff0c;这款游戏搭建在虚幻引擎的基础上&#xff0c;为玩家们带来了极佳的视觉体验。这款游戏秉承着MMO类型游戏一贯的玩法&#xff0c;但是制作组在…

【面试干货】数据库乐观锁,悲观锁的区别,怎么实现

【面试干货】数据库乐观锁&#xff0c;悲观锁的区别&#xff0c;怎么实现 1、乐观锁&#xff0c;悲观锁的区别2、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、乐观锁&#xff0c;悲观锁的区别 悲观锁&#xff08;Pessimistic Lo…