【面向对象项目之图书馆管理系统】

项目需求

不同的用户有不同的菜单,然后进行操作。 

设计思路

通过需求我们可以提取图书类,书架类
图书类存放图书的基本信息,书架类存放书本及其它的数量,以及操作图书的方法等等。
接口类(用来操作书架里面的图书)-》写具体的操作实现类

其次提取出用户类,用户类分为普通用户类 管理员类

基本框架代码:

package book;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-16 - 11 - 16 - 20:59
 * @Description: com.bookmanagement.book
 * @version: 1.0
 */
public class Book {//书类
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出
    public Book(String name, String author, int price, String type) {//这里没构造isBorrowed是因为它的默认值是false,意味着刚开始书都是未被借出的
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    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 isBorrowed() {
        return isBorrowed;
    }
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}
package book;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-17 - 11 - 17 - 23:55
 * @Description: com.bookmanagement.book
 * @version: 1.0
 */
public class BookList {//书架类
    public static final int DEFAULT_SIZE = 10;
    private Book[] books = new Book[DEFAULT_SIZE];
    private int usedSize;//当前books数组当中的数量
    
    public int getUsedSize() {
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:37
 * @Description: operate
 * @version: 1.0
 */
public interface Ioperation {//图书的操作接口
    void work(BookList bookList);//操作书架类中的书数组
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:48
 * @Description: operate
 * @version: 1.0
 */
public class AddOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:53
 * @Description: operate
 * @version: 1.0
 */
public class BrrowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:50
 * @Description: operate
 * @version: 1.0
 */
public class DeleteOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:51
 * @Description: operate
 * @version: 1.0
 */
public class ExitOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:49
 * @Description: operate
 * @version: 1.0
 */
public class FindOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:52
 * @Description: operate
 * @version: 1.0
 */
public class ReturnOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:51
 * @Description: operate
 * @version: 1.0
 */
public class ShowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");
    }
}
package user;
import book.BookList;
import operate.Ioperation;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:34
 * @Description: user
 * @version: 1.0
 */
public abstract class User {
    protected String name;
    protected Ioperation[] ioperations;//操作方法的接口数组,存放操作方法的实现类
    public User(String name) {
        this.name = name;
    }
    //因为菜单在这儿不需要具体的实现,所以将菜单定义为抽象方法,自然User也变成了抽象类
    public abstract int menu();
    //通过用户的选择,来实现不同的操作,调用接口数组里面的操作实现类的方法
    public void doWork(int choice, BookList bookList) {
        this.ioperations[choice].work(bookList);//通过接口数组下标得到具体的操作实现类,再调用操作类的方法
    }
}
package user;
import operate.*;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:35
 * @Description: user
 * @version: 1.0
 */
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        /*this.ioperations = new Ioperation[4];
        ioperations[0] = new ExitOperation();
        ioperations[1] = new FindOperation();
        ioperations[2] = new BrrowOperation();
        ioperations[3] = new ReturnOperation();*/
        //动态初始化接口数组的变量  (接口数组存放操作的实现类)
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BrrowOperation(),
                new ReturnOperation()
        };
    }
    @Override
    public int menu() {
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("hello🌻 " + name + " 欢迎来到图书管理系统🕌");
        System.out.println("         1️⃣查找图书!");
        System.out.println("         2️⃣借阅图书!");
        System.out.println("         3️⃣归还图书!");
        System.out.println("         0️⃣退出系统!");
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("请输入你的操作👉:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
package user;
import operate.*;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:34
 * @Description: user
 * @version: 1.0
 */
public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new ShowOperation()
        };
    }
    @Override
    public int menu() {//因为要根据不同的输入,做不同的操作,所以返回值用int接受
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("hello🌻 " + name + " 欢迎来到图书管理系统🕌");
        System.out.println("         1️⃣查找图书!");
        System.out.println("         2️⃣新增图书!");
        System.out.println("         3️⃣删除图书!");
        System.out.println("         4️⃣显示图书!");
        System.out.println("         0️⃣退出系统!");
        System.out.println("❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀");
        System.out.println("请输入你的操作👉:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 9:53
 * @Description: PACKAGE_NAME
 * @version: 1.0
 */
public class Main {
    public static User login() {//父类当作方法的返回值,返回的是一个具体的子类对象(向上转型)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1-》管理员 0-》普通用户");
        int choice = scanner.nextInt();
        if (1 == choice) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();//根据返回的不同用户,调用不同的菜单
        while (true) {
            int choice = user.menu();//接受操作数,根据操作数调用不同的操作方法
            //根据 choice 和 user 来确定调用哪个对象的哪个操作
            user.doWork(choice, bookList);
        }
    }
}

此时的框架已经搭建好了,只需要写具体操作实现类的业务逻辑。

Book类的toString方法修改:

BookList类新增getBook方法: 

ShowOperation类修改:

ExitOperation类修改: 

FindOperation类修改: 

BookList类新增setBook方法:

AddOpration类:

BookLisk类重载setBook方法:

DeleteOperation类:

 

BorrowOperation类: 

 

ReturnOperation类:

最终代码

package book;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-16 - 11 - 16 - 20:59
 * @Description: book
 * @version: 1.0
 */
public class Book {//书类
    private String name;//书名
    private String author;//作者
    private int price;//价格
    private String type;//类型
    private boolean isBorrowed;//是否被借出
    public Book(String name, String author, int price, String type) {//这里没构造isBorrowed是因为它的默认值是false,意味着刚开始书都是未被借出的
        this.name = name;
        this.author = author;
        this.price = price;
        this.type = type;
    }
    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 isBorrowed() {
        return isBorrowed;
    }
    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", type='" + type + '\'' +
                //", isBorrowed=" + isBorrowed +
                (isBorrowed == false ? " 未被借出" : " 已被借出") +
                '}';
    }
}
package book;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-17 - 11 - 17 - 23:55
 * @Description: book
 * @version: 1.0
 */
public class BookList {//书架类
    public static final int DEFAULT_SIZE = 10;
    private Book[] books = new Book[DEFAULT_SIZE];
    private int usedSize;//当前books数组当中的数量
    public BookList() {
        books[0] = new Book("数据结构", "张三", 40, "计算机类");
        books[1] = new Book("计算机组成原理", "李四", 45, "计算机类");
        books[2] = new Book("操作系统", "王五", 50, "计算机类");
        books[3] = new Book("计算机网络", "themyth", 35, "计算机类");
        books[4] = new Book("Java程序设计", "Holis", 25, "计算机类");
        this.usedSize = 5;
    }
    //因为存放Book类的数组是被封装的,所以要提供方法来获取书,通过下标pos得到具体的一本书
    public Book getBook(int pos) {
        return this.books[pos];//返回的是下标为pos的书
    }
    //在书架的最后一本书位置后面接着存放一本书
    public void setBook(Book book) {
        this.books[usedSize] = book;//[0, usedSize - 1]这个区间是原来每本书的下标
    }
    //在书架的指定位置增加一本书
    public void setBook(int pos, Book book) {
        this.books[pos] = book;
    }
    public int getUsedSize() {
        return usedSize;
    }
    public void setUsedSize(int usedSize) {
        this.usedSize = usedSize;
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:37
 * @Description: operate
 * @version: 1.0
 */
public interface Ioperation {//图书的操作接口
    void work(BookList bookList);//操作书架类中的书数组
}
package operate;
import book.Book;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:51
 * @Description: operate
 * @version: 1.0
 */
public class ShowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("显示图书!");
        int currentSize = bookList.getUsedSize();//得到书架类当前书的数量
        for (int i = 0; i < currentSize; i++) {
            //System.out.println(bookList[i]);bookList只是一个引用,不是数组
            Book book = bookList.getBook(i);//通过下标的变换,得到不同的书
            System.out.println(book);//因为这里重写了toString,可以直接打印书的详细信息
        }
    }
}
package operate;
import book.BookList;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:51
 * @Description: operate
 * @version: 1.0
 */
public class ExitOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("退出系统!");
        System.exit(0);//退出JVM
    }
}
package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:49
 * @Description: operate
 * @version: 1.0
 */
public class FindOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("查找图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要查找的书名:");
        String findBookName = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book book = bookList.getBook(i);
            if (findBookName.equals(book.getName())) {
                System.out.println("找到了这本书!");
                System.out.println(book);
                return;
            }
        }
        System.out.println("查无此书!");
    }
}
package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:48
 * @Description: operate
 * @version: 1.0
 */
public class AddOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("新增图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入书名:");
        String addBookName = scanner.nextLine();
        System.out.println("请输入作者:");
        String author = scanner.nextLine();
        System.out.println("请输入价格:");
        int price = scanner.nextInt();
        System.out.println("请输入类型:");
        String type = scanner.next();//注意这儿不能用nextLine(),因为会读取上面的回车符,导致不能录入类型
        Book book = new Book(addBookName, author, price, type);
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmpBook = bookList.getBook(i);
            if (addBookName.equals(tmpBook.getName())) {
                System.out.println("已经有这本书了,不能存入了!");
                return;
            }
        }
        bookList.setBook(book);
        //修改usedSize
        bookList.setUsedSize(currentSize + 1);
    }
}
package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:50
 * @Description: operate
 * @version: 1.0
 */
public class DeleteOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("删除图书!");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要删除的书名:");
        String deleteBookName = scanner.nextLine();
        int index = -1;
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmpBook = bookList.getBook(i);
            if (deleteBookName.equals(tmpBook.getName())) {
                index = i;
                break;
            }
        }
        if (index != -1) {
            for (int j = index; j < currentSize - 1; j++) {//j <= currentSize - 2
                //bookList[j] = bookList[j + 1];
                Book book = bookList.getBook(j + 1);
                bookList.setBook(j, book);
            }
            //书本数量减少一本
            bookList.setUsedSize(currentSize - 1);
            //因为删除的是对象,要把最后一个元素置为null
            bookList.setBook(currentSize - 1, null);
            System.out.println("删除成功!");
        } else {
            System.out.println("这本书不存在,无法删除!");
        }
    }
}
package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:53
 * @Description: operate
 * @version: 1.0
 */
public class BrrowOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("借阅图书!");
        System.out.println("输入你要借阅的图书:");
        Scanner scanner = new Scanner(System.in);
        String borrowBookName = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmpbook = bookList.getBook(i);
            if (borrowBookName.equals(tmpbook.getName()) && !tmpbook.isBorrowed()) {//tmpbook.isBorrowed() == false
                tmpbook.setBorrowed(true);
                System.out.println("借阅成功!");
                return;
            }
            /*if (borrowBookName.equals(bookList.getBook(i).getName()) && !bookList.getBook(i).isBorrowed()) {
                bookList.getBook(i).setBorrowed(true);
                System.out.println("借阅成功!");
            }*/
        }
        System.out.println("没有这本书!");
    }
}
package operate;
import book.Book;
import book.BookList;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:52
 * @Description: operate
 * @version: 1.0
 */
public class ReturnOperation implements Ioperation {
    @Override
    public void work(BookList bookList) {
        System.out.println("归还图书!");
        System.out.println("输入你要归还的图书:");
        Scanner scanner = new Scanner(System.in);
        String returnBookName = scanner.nextLine();
        int currentSize = bookList.getUsedSize();
        for (int i = 0; i < currentSize; i++) {
            Book tmpbook = bookList.getBook(i);
            if (returnBookName.equals(tmpbook.getName()) && tmpbook.isBorrowed()) {//tmpbook.isBorrowed() == ture
                tmpbook.setBorrowed(false);
                System.out.println("归还成功!");
                return;
            }
        }
    }
}
package user;
import book.BookList;
import operate.Ioperation;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:34
 * @Description: user
 * @version: 1.0
 */
public abstract class User {
    protected String name;
    protected Ioperation[] ioperations;//接口数组存放操作的实现类
    public User(String name) {
        this.name = name;
    }
    //因为菜单在这儿不需要具体的实现,所以将菜单定义为抽象方法,自然User也变成了抽象类
    public abstract int menu();
    //通过用户的选择,来实现不同的操作,调用接口数组里面的操作实现类的方法
    public void doWork(int choice, BookList bookList) {
        this.ioperations[choice].work(bookList);//通过接口数组下标得到具体的操作实现类,再调用操作类的方法
    }
}
package user;
import operate.*;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:35
 * @Description: user
 * @version: 1.0
 */
public class NormalUser extends User {
    public NormalUser(String name) {
        super(name);
        /*this.ioperations = new Ioperation[4];
        ioperations[0] = new ExitOperation();
        ioperations[1] = new FindOperation();
        ioperations[2] = new BrrowOperation();
        ioperations[3] = new ReturnOperation();*/
        //动态初始化接口数组的变量  (接口数组存放操作的实现类)
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new BrrowOperation(),
                new ReturnOperation()
        };
    }
    @Override
    public int menu() {
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("hello🌻 " + name + " 欢迎来到图书管理系统🕌");
        System.out.println("         1️⃣查找图书!");
        System.out.println("         2️⃣借阅图书!");
        System.out.println("         3️⃣归还图书!");
        System.out.println("         0️⃣退出系统!");
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("请输入你的操作👉:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
package user;
import operate.*;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 0:34
 * @Description: user
 * @version: 1.0
 */
public class AdminUser extends User {
    public AdminUser(String name) {
        super(name);
        this.ioperations = new Ioperation[]{
                new ExitOperation(),
                new FindOperation(),
                new AddOperation(),
                new DeleteOperation(),
                new ShowOperation()
        };
    }
    @Override
    public int menu() {//因为要根据不同的输入,做不同的操作,所以返回值用int接受
        System.out.println("❀❀*********❀❀❀**********❀❀");
        System.out.println("hello🌻 " + name + " 欢迎来到图书管理系统🕌");
        System.out.println("         1️⃣查找图书!");
        System.out.println("         2️⃣新增图书!");
        System.out.println("         3️⃣删除图书!");
        System.out.println("         4️⃣显示图书!");
        System.out.println("         0️⃣退出系统!");
        System.out.println("❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀❀");
        System.out.println("请输入你的操作👉:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}
import book.BookList;
import user.AdminUser;
import user.NormalUser;
import user.User;
import java.util.Scanner;
/**
 * @Auther: TheMyth
 * @Date: 2022-11-18 - 11 - 18 - 9:53
 * @Description: PACKAGE_NAME
 * @version: 1.0
 */
public class Main {
    public static User login() {//父类当作方法的返回值,返回的是一个具体的子类对象(向上转型)
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的姓名:");
        String name = scanner.nextLine();
        System.out.println("请输入你的身份:1-》管理员 0-》普通用户");
        int choice = scanner.nextInt();
        if (1 == choice) {
            return new AdminUser(name);
        } else {
            return new NormalUser(name);
        }
    }
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        BookList bookList = new BookList();
        User user = login();//根据返回的不同用户,调用不同的菜单
        while (true) {
            int choice = user.menu();//接受操作数,根据操作数调用不同的操作方法
            //根据 choice 和 user 来确定调用哪个对象的哪个操作
            user.doWork(choice, bookList);
        }
    }
}

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

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

相关文章

2023年“中银杯”安徽省网络安全B模块(部分解析)

前言 以下是2023年中银杯安徽省网络安全B模块题目&#xff0c;镜像可以私聊我 B模块安全事件响应/网络安全数据取证/应用安全&#xff08;400 分&#xff09; B-1&#xff1a;CMS网站渗透测试 任务环境说明&#xff1a; √服务器场景&#xff1a;Server2206&#xff08;关…

虚幻UE 材质-PDO像素深度偏移量

2024年的第一天&#xff01;&#xff01;&#xff01;大家新年快乐&#xff01;&#xff01;&#xff01; 可能是长大了才知道 当你过得一般 你的亲朋好友对你真正态度只可能是没有表露出来的冷嘲热讽了 希望大家新的一年平安、幸福、 永远活力满满地追求自己所想做的、爱做的&…

计算图与动态图机制

一、计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素&#xff1a;结点&#xff08;Node&#xff09;和边&#xff08;Edge&#xff09; 结点表示数据&#xff0c;如向量&#xff0c;矩阵&#xff0c;张量边表示运算&#xff0c;如加减乘除卷积等 用计算图表…

nginx源码分析-4

这一章内容讲述nginx的模块化。 ngx_module_t&#xff1a;一个结构体&#xff0c;用于描述nginx中的各个模块&#xff0c;其中包括核心模块、HTTP模块、事件模块等。这个结构体包含了一些模块的关键信息和回调函数&#xff0c;以便nginx在运行时能够正确地加载和管理这些模块。…

【话题】ChatGPT等大语言模型为什么没有智能2

我们接着上一次的讨论&#xff0c;继续探索大模型的存在的问题。正巧CSDN最近在搞文章活动&#xff0c;我们来看看大模型“幻觉”。当然&#xff0c;本文可能有很多我自己的“幻觉”&#xff0c;欢迎批评指正。如果这么说的话&#xff0c;其实很容易得出一个小结论——大模型如…

【Linux】socket基础API

目录 1. 创建socket&#xff08;TCP/UDP&#xff0c;客户端服务器&#xff09; 1.1 第一个参数——domain 1.2 第二个参数——type 1.3 第三个参数——protocol 2. 绑定socket地址&#xff08;TCP/UDP&#xff0c;服务器&#xff09; 2.1 字节序及转换函数 2.2 IP地址及…

听GPT 讲Rust源代码--library/proc_macro

File: rust/library/proc_macro/src/bridge/rpc.rs 在Rust源代码中&#xff0c;rust/library/proc_macro/src/bridge/rpc.rs文件的作用是实现了Rust编程语言的编译过程中的远程过程调用&#xff08;RPC&#xff09;机制。 这个文件定义了与编译器的交互过程中使用的各种数据结构…

bilibili深入理解计算机系统笔记(3):使用C语言实现静态链接器

本文是2022年的项目笔记&#xff0c;2024年1月1日整理文件的时候发现之&#xff0c;还是决定发布出来。 Github链接&#xff1a;https://github.com/shizhengLi/csapp_bilibili 文章目录 可执行链接文件(ELF)ELF headerSection header符号表symtab二进制数如何和symtab结构成员…

OpenCV-Python(29):图像特征

目录 目标 背景介绍 常用特征 应用场景 目标 理解什么是图像特征 为什么图像特征很重要 为什么角点很重要 背景介绍 相信大多数人都玩过拼图游戏吧。首先你们拿到一张图片的一堆碎片&#xff0c;你要做的就是把这些碎片以正确的方式排列起来从而重建这幅图像。问题是&…

【并发设计模式】聊聊Thread-Per-Message与Worker-Thread模式

在并发编程中&#xff0c;核心就是同步、互斥、分工。 同步是多个线程之间按照一定的顺序进行执行&#xff0c;比如A执行完&#xff0c;B在执行。而互斥是多个线程之间对于共享资源的互斥。两个侧重点不一样&#xff0c;同步关注的是执行顺序&#xff0c;互斥关注的是资源的排…

RedisTemplate序列化

SpringBoot整合Redis&#xff0c;配置RedisTemplate序列化。如果使用StringRedisTemplate&#xff0c;那么不需要配置序列化&#xff0c;但是StringRedisTemplate只能存储简单的String类型数据&#xff0c;如图&#xff1a; 如果使用StringRedisTemplate存储一个常规对象&#…

python实现Ethernet/IP协议的客户端(三)

Ethernet/IP是一种工业自动化领域中常用的网络通信协议&#xff0c;它是基于标准以太网技术的应用层协议。作为工业领域的通信协议之一&#xff0c;Ethernet/IP 提供了一种在工业自动化设备之间实现通信和数据交换的标准化方法。python要实现Ethernet/IP的客户端&#xff0c;可…

灸哥问答:软件架构在软件研发中的作用

软件架构在软件开发中扮演着至关重要的角色。我们在软件研发的过程中&#xff0c;类比于建造一座公寓楼&#xff0c;而软件架构就像是盖楼之前的设计图纸&#xff0c;如果没有设计图纸就直接盖楼&#xff0c;可想而知带来的后果是什么。我对软件架构的作用表现总结如下&#xf…

Go语言TCP Socket编程

:::tip 声明 本文源于Go语言TCP Socket编程 | Tony Bai&#xff0c;可能会有稍微的修改。 ::: 文章目录 一、模型二、TCP连接的建立对于客户端而言&#xff0c;连接的建立会遇到如下几种情形&#xff1a;1、网络不可达或对方服务未启动2、对方服务的listen backlog满3、网络延…

【重磅新品】小眼睛科技推出紫光同创盘古系列FPGA开发板套件,盘古200K开发板,紫光同创PG2L200H,Logos2系列

FPGA&#xff0c;即现场可编程门阵列&#xff0c;作为可重构电路芯片&#xff0c;已经成为行业“万能芯片”&#xff0c;在通信系统、数字信息处理、视频图像处理、高速接口设计等方面都有不俗的表现。近几年&#xff0c;随着国家战略支持和产业发展&#xff0c;国产FPGA迎来迅…

PyTorch官网demo解读——第一个神经网络(4)

上一篇&#xff1a;PyTorch官网demo解读——第一个神经网络&#xff08;3&#xff09;-CSDN博客 上一篇我们聊了手写数字识别神经网络的损失函数和梯度下降算法&#xff0c;这一篇我们来聊聊激活函数。 大佬说激活函数的作用是让神经网络产生非线性&#xff0c;类似人脑神经元…

Python算法例33 删除数字

1. 问题描述 给出一个字符串A&#xff0c;表示一个n位的正整数&#xff0c;删除其中k位数字&#xff0c;使得剩余的数字仍然按照原来的顺序排列产生一个新的正整数&#xff0c;本例将找到删除k个数字之后的最小正整数&#xff0c;其中n≤240&#xff0c;k≤n。 2. 问题示例 …

HarmonyOS4.0系统性深入开发10卡片事件能力说明

卡片事件能力说明 ArkTS卡片中提供了postCardAction()接口用于卡片内部和提供方应用间的交互&#xff0c;当前支持router、message和call三种类型的事件&#xff0c;仅在卡片中可以调用。 接口定义&#xff1a;postCardAction(component: Object, action: Object): void 接口…

性能优化(CPU优化技术)-ARM Neon详细介绍

本文主要介绍ARM Neon技术&#xff0c;包括SIMD技术、SIMT、ARM Neon的指令、寄存器、意图为读者提供对ARM Neon的一个整体理解。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09…

IRQ Handler 的使用——以USART串口接收中断分别在标准库与HAL库版本下的举例

前言&#xff1a; 1.中断系统及EXTI外部中断知识点见我的博文&#xff1a; 9.中断系统、EXTI外部中断_eirq-CSDN博客文章浏览阅读301次&#xff0c;点赞7次&#xff0c;收藏6次。EXTI&#xff08;Extern Interrupt&#xff09;外部中断EXTI可以监测指定GPIO口的电平信号&…