当前位置: 首页 > news >正文

Java篇图书管理系统

目录

前言

一. 图书管理系统的核心

二. 图书管理系统基本框架

2.1 book包

2.1.1 Book(书籍类)

 2.1.2 Booklist (书架类)

2.2 user包

2.2.1 User类

2.2.2  Administrator(管理员类)

2.2.3 Visitor(用户类)

2.3 图书管理系统操作菜单

管理员菜单

用户菜单

2.4 operation(操作包)

三. 实现服务

 3.1 显示所有书籍

3.2 查找书籍

 3.3 退出系统

3.4 增加书籍

3.5 删除书籍

3.6 借阅书籍

 3.7 归还书籍

四. 总代码

结语


前言

相信大家都有去过图书馆吧,那么在借阅图书和归还的时候,都有一个系统来记录并操作这些过程,所以今天就带着大家利用之前的所学知识来简单实现一下图书管理系统的基本逻辑构造

一. 图书管理系统的核心

图书管理系统的核心包括三个部分:书籍的信息(书本属性)、操作书籍的人(管理员和读者)、 对书籍的操作(借阅、归还)

所以在这里我们分别创建3个包 bookoperationuser 来实现各个部分的操作:

二. 图书管理系统基本框架

2.1 book包

我们在book这个包中创建2个类:Book、Booklist,Book用来描述书籍的基本信息,Booklist充当书架,里面用来记录书架中书籍的信息。

2.1.1 Book(书籍类)

首先在Book中我们要创建变量来记录书籍的基本信息:

    private String name; //书名private String author; //作者private  int price;  //价格private String type; //书籍类型private boolean isborrow; //是否被借出

并且这里的书籍基本信息,我们是用private访问修饰限定符修饰变量的,其他类想要直接访问是访问不了的,所以这里需要我们创建方法间接访问。

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 isIsborrow() {return isborrow;}public void setIsborrow(boolean isborrow) {this.isborrow = isborrow;}

接下来我们来写Book类的构造方法:

那么当我们每次新增一本书的时候 ,该书籍默认就是未借出的状态,默认初始值就是false,所以不需要在构造方法中进行初始化

public Book(String name, String author, int price, String type) {//初始化书的属性this.name = name;this.author = author;this.price = price;this.type = type;}

这时候书籍的信息属性都能够被记录了,那么我们想看看这些书籍的信息该怎么办呢?没错打印出来,此时我们需要对 ToString 方法进行重写:

 2.1.2 Booklist (书架类)

能够记录书籍信息的Book类创建完成后,我们来创建一个书架类(Booklist),书架类的作用就是能够存放每一本书,并且记录每一本书的借阅状态。

    private Book [] books;//表示书架可以存放10本书private int usedbooks;//表示books数组中存放了几本书

那么我们依然需要通过间接访问才能访问书架中的基本信息,需要自己提供方法间接访问:

    public int getUsedbooks() {return usedbooks;//返回有效书本数量}public void setUsedbooks(int usedbooks) {this.usedbooks = usedbooks;//更改有效书本数量}public Book getbook(int pos){return books[pos];  //返回书架中 第pos本书}public void setBooks(int pos,Book book){this.books[pos]=book;  //更改书架中的书}

那么我们还是写一下Booklist类的构造方法,默认书架中已经存放了书籍:

public BookList() {this.books = new Book [10];  //默认创建存放10本书大小的数组this.books[0]=new Book("三国演义","罗贯中",20,"四大名著");this.books[1]=new Book("西游记","吴承恩",22,"四大名著");this.books[2]=new Book("红楼梦","曹雪芹",24,"四大名著");this.books[3]=new Book("水浒传","施耐庵",26,"四大名著");this.usedbooks=4;//初始化有效书本数量为4本}

 那么在book这个包的操作就告一段落,后续随着思路的深入再进行补充~

2.2 user包

在user包中我们新建三个类来描述管理员用户,那么管理员和用户也是拥有相同属性的,而第三个类User,我们就定义成抽象类,让管理员类与用户类去继承,这样就可以省略一些重复的代码啦

2.2.1 User类

那么管理员与用户共同拥有的特征就是都有名字,那么我们就在User类中定义一个名字属性的变量,并且通过构造方法初始化 管理员 或 用户 的名称:

public abstract class User {public String name; //名字public User(String name) {this.name = name; //初始化名称}
}

2.2.2  Administrator(管理员类)

因为我们的管理员类继承了User类,所以需要在构造方法中调用父类的构造方法:

public class Administrator extends User{public Administrator(String name) {super(name);//通过父类初始化管理员名称}
}

2.2.3 Visitor(用户类)

同理用户类也继承了User类,所以也需要构造方法调用父类的构造方法:

public class Visitor extends User{public Visitor(String name) {super(name); //通过父类初始化用户名称}
}

那么书籍的属性和操作者的基本框架我们已经实现了,接下来该实现一下图书管理系统的功能了~

2.3 图书管理系统操作菜单

管理员菜单

1.查找图书

2.新增图书

3.删除图书

4.显示图书

0.退出系统

用户菜单

1.查找图书

2.借阅图书

3.归还图书

0.退出系统

接下来,我们就针对这些功能创建一个包,实现这些功能。

2.4 operation(操作包)

在这个包中我们去实现上述描述的相关操作,接着我们创建一个接口来实现多态,从而降低代码的复杂度

operate接口:

public interface Operate {  //服务接口void work(BookList books);//功能的实现我们都要利用到书架,所以这里参数给定一个书架对象
}

接下来我们创建实现各个功能的类:

Addbook类:(新增书籍)

public class Addbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("增加书籍...");}
}

Borrowbook类:(借阅书籍)

public class Borrowbook implements Operate {@Overridepublic void work(BookList books) {System.out.println("借阅书籍....");}
}

 Deletebook类:(删除书籍)

public class Deletebook implements Operate{@Overridepublic void work(BookList books) {System.out.println("删除书籍...");}
}

Exitbook类:(退出系统)

public class Exitbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("退出系统.....");}
}

Findbook类:(查阅书籍)

public class Findbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("查找书籍....");]
}

Returnbook类:(归还书籍)

public class Retuenbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("归还书籍....");

Showbook类:(显示书籍)

public class Showbook implements Operate {@Overridepublic void work(BookList books) {System.out.println("显示书籍....");}
}

接下来就要慢慢的去将每个类的功能具体的实现,并且将每个类联系起来运作图书管理系统。

既然知道了管理员和用户的菜单后,我们就分别给管理员和用户添加一下菜单:

在Administrator类添加管理员菜单:

public void 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("<<******************************************>>");
}

在Visitor类中添加用户菜单:

public void 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("<<**************************************>>");
}

 那么我们现在创建一个Main类,在类中写上我们的main方法实现一下基本逻辑:

​
public class Main {public static User login(){   //登录系统过程Scanner scanner=new Scanner(System.in);System.out.println("请输入你的名字:");String name = scanner.nextLine();System.out.println("请输入你要登入的帐号:1.管理员登录 -----> 2.游客登录 ----->");int choice=scanner.nextInt();if(choice==1){return new Administrator(name); //如果选择了1,就实例化一个管理员对象,并返回}else{return new Visitor(name); //如果选择了2,就实例化一个用户对象,并返回}//此时的返回值我们不能确定返回的是管理员对象还是用户对象,所以这里用向上转型返回User类型的对象}public static void main(String[] args) {User user=login(); //进入登录系统user.menu(); //打印菜单}
}​

但是此时login方法的返回对象我们使用User类型的对象进行接收的,此时我们是不能使用user.menu()的,那么该怎么办呢?我们之前将User抽象出来作为管理员类和用户类的父类,那么此时我们在User类中写一个menu()方法就可以实现多态,打印菜单啦~

public abstract class User {public String name; //用户名称public User(String name) {this.name = name; //初始化用户名称}public abstract int menu(); //抽象方法实现多态,打印菜单
}

那么此时只需要将子类做出相应的改动,改变成重写的形式就可以了:

这就实现了打印菜单的功能,但是光打印选择不了功能可不行呀,所以我们要在菜单中加上一个选择功能:

  @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 scanner=new Scanner(System.in);System.out.println("请选择您需要的服务:-->>");int choice=scanner.nextInt();return choice;}

通过输入标号来选择我们想要的服务,那么我们应该返回这个标号,所以menu()方法的返回值也要改成 int 类型,Visitor类的menu()方法也是同理。

那么能够选择服务后,我们应该根据对象(管理员或用户)选择该调用哪一个菜单方法:

Administrator(管理员类):

public Administrator(String name) {super(name);//通过父类初始化管理员名称this.operate=new Operate[]{  //创建 管理员账户提供的服务new Exitbook(),new Findbook(),new Addbook(),new Deletebook(),new Showbook()};}

Visitor(用户类):

public class Visitor extends User{public Visitor(String name) {super(name); //通过父类初始化用户名称this.operate=new Operate[]{   //创建 游客账户提供的服务new Exitbook(),new Findbook(),new Borrowbook(),new Retuenbook()};}

 那么当我们分别在它们的构造方法中创建一个Operate类型的数组后,里面存放Operate接口实现的方法,那么在new一个管理员对象或者用户对象时,系统就会为这个数组分配内存:

那么我们需要在User类中加上这么一段代码利用动态绑定调用管理员菜单中的方法还是调用用户菜单中的方法:

    public Operate []operate;  //创建服务数组,子类通过数组下标调用 各个服务public void Dooperate(int choice,BookList books){this.operate[choice].work(books);  //调用 游客/管理员 所选择的服务}

this.operate[ choice ]就是我们new的那个对象中构造方法中下标为 choice 的那个类,而后面的 .work(books)就是调用的对应类的work方法。

那么现在我们在main方法中打印菜单的时候就需要有个变量来接收选择的服务啦,再通过new对应的对象调用上面写的 Dooperate方法调用所选择的服务。

public static void main(String[] args) {BookList bookList=new BookList(); //实例化书架User user=login(); //进入登录系统while(true) {int chioce = user.menu(); //接收选择服务的选项user.Dooperate(chioce, bookList); //调用 游客/管理员 提供的服务}}

而为了实现用户输入0时才退出系统,所以这里的while循环我们设置为死循环。此时基本框架就搭建完成啦~

我们来看看测试效果:

那么我们来画图分析一下运行的过程:

1. 通过主函数调用login方法:

 

2. 通过login方法返回的对象调用该对象类中的menu()方法

3. 最后通过调用user.Dooperate方法一步一步实现所选择的服务

三. 实现服务

 3.1 显示所有书籍

那么在实现显示书籍功能之前,我们应该在Booklist类中写一个方法让Showbook类中的work方法能够通过数组下标打印书籍的信息:

    public Book getbook(int pos){return this.books[pos];  //返回书架中 第pos本书}

接下来我们就可以实现显示书籍这个服务啦~

在Showbook类中实现:
 

public class Showbook implements Operate {@Overridepublic void work(BookList books) {System.out.println("显示书籍....");int count=books.getUsedbooks();for(int i=0;i<count;i++) {//通过循环遍历数组;调用books.getbook(i)方法获取指定的书籍对象System.out.println(books.getbook(i).toString());}System.out.println();}
}

3.2 查找书籍

查找书籍的过程与显示所有书籍相似,也是通过循环遍历数组,利用equal()方法进行对比,实现服务。

在Findbook类中实现:

public class Findbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("查找书籍....");Scanner scanner=new Scanner(System.in);System.out.print("请输入要查找书籍的名字:-->");String name=scanner.nextLine();int count=books.getUsedbooks();for(int i=0;i<count;i++){Book book=books.getbook(i);if(book.getName().equals(name)){System.out.println("找到了,书本内容如下:");System.out.println(book);System.out.println();return;}}System.out.println("很抱歉,没有查找到你要查找的书籍");System.out.println("后续会尽快联系管理员添加~");System.out.println();}
}

 3.3 退出系统

在Exitbook类中实现:

public class Exitbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("退出系统.....");int count=books.getUsedbooks();for(int i=0;i<count;i++){books.setBooks(i,null); //}books.setUsedbooks(0); //将有效书籍数量 制为空System.exit(0);}
}

书架中存放的书籍都是对象,那么在退出系统之前我们应该将书籍对象都进行回收,避免发生内存泄漏,并且将书架中的书本数量变成0,最后在结尾加上 System.exit(0); 就可以结束程序,退出系统了。

3.4 增加书籍

在增加书籍之前,我们应该先判断这个书籍是否已经在书架中存放,如果书架中没有那么就添加到书架中

在Addbook类中实现:

public class Addbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("增加书籍...");int count=books.getUsedbooks();Scanner scanner=new Scanner(System.in);System.out.print("请输入新添加的书名:--->");String name=scanner.nextLine();System.out.print("请输入新添加书籍的作者:--->");String author=scanner.nextLine();System.out.print("请输入书籍的价格:--->");int price=scanner.nextInt();scanner.nextLine();System.out.print("请输入书籍的类型:--->");String type=scanner.nextLine();for(int i=0;i<count;i++) {if(books.getbook(i).getName().equals(name)){System.out.println("该书籍已经存在了,不需要添加-----");System.out.println();return ;}}Book book=new Book(name,author,price,type);books.setBooks(count,book);System.out.println("添加成功---");books.setUsedbooks(count+1);System.out.println();}
}

那么在Booklist类中我们就要提供一个方法用来新增书籍:

    public void setBooks(int pos,Book book){this.books[pos]=book;  //更改书架中的书}

3.5 删除书籍

在删除书籍中我们有两个点需要注意:当我们删除了某本书籍后,需要将该书籍后面的书籍往前移动,并且将移动完最后的那个空间进行回收,并且更改书架中书籍的数量

在Deletebook类中实现:

public class Deletebook implements Operate{@Overridepublic void work(BookList books) {System.out.println("删除书籍...");System.out.print("请输入你要删除的书籍:--->");Scanner scanner=new Scanner(System.in);String name =scanner.nextLine();int count=books.getUsedbooks();int index=-1;boolean flag=false;for (int i = 0; i <count ; i++) {if(books.getbook(i).getName().equals(name)){index=i;flag=true;break;}}if(flag==false) {System.out.println("没有找到你要删除的书籍-----");System.out.println();return ;}if (books.getbook(index).isIsborrow()==true){System.out.println("该书本已经被借出,暂时不能进行操作-----");System.out.println();return;}else{for(int j=index;j<count-1;j++){books.setBooks(j,books.getbook(j+1));}System.out.println("删除成功------->");books.setUsedbooks(count-1);books.setBooks(count-1,null);}}
}

那么在删除书籍的时候为了实现将后面的书籍往前面移动,我们需要在Booklist类中调用setBooks方法来实现这个过程:

    public void setBooks(int pos,Book book){this.books[pos]=book;  //更改书架中的书}

3.6 借阅书籍

借阅书籍的时候我们应该判断该书籍是否在书架上存在,如果存在再判断该书籍是否被借出,如果没有被借出,那么就可以进行借阅

在Borrowbook类中实现:

ublic class Borrowbook implements Operate {@Overridepublic void work(BookList books) {System.out.println("借阅书籍....");System.out.print("请输入你要借阅的图书:-->");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int count = books.getUsedbooks();for (int i = 0; i < count; i++) {if (books.getbook(i).getName().equals(name)) {if (books.getbook(i).isIsborrow() == false) {books.getbook(i).setIsborrow(true);System.out.println("借阅成功---");System.out.println(books.getbook(i));System.out.println();return;}else{System.out.println("这本书已经被借出,请等待读者归还后再进行借阅---");System.out.println();return ;}}}System.out.println("查找不到你要借阅的书籍,后续会联系管理员尽快上架!!!");System.out.println();}
}

这个时候我们需要在Book类中提供一个方法,返回当前书籍是否被借出的状态,并且还要提供一个方法改变书籍是否被借出的状态,在Book类中实现:

    public boolean isIsborrow() {return isborrow;}public void setIsborrow(boolean isborrow) {this.isborrow = isborrow;}

 3.7 归还书籍

在归还之前我们需要判断一下这本书是否在书架上存在过,如果存在再进行判断这本书是否有被借出,如果有被借出则可以归还

在Returnbook类中实现:
 

public class Retuenbook implements Operate{@Overridepublic void work(BookList books) {System.out.println("归还书籍....");System.out.print("请输入你要归还的图书:-->");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int count = books.getUsedbooks();for (int i = 0; i < count; i++) {if (books.getbook(i).getName().equals(name)) {if (books.getbook(i).isIsborrow() == true) {books.getbook(i).setIsborrow(false);System.out.println("归还成功---欢迎再次借阅");System.out.println(books.getbook(i));System.out.println();return;}else{System.out.println("这本书没有被借出,不需要归还---");System.out.println();return ;}}}System.out.println("查找不到你要归还的书籍,你可能是在其他图书馆借阅的书籍---");System.out.println();}
}

如果将书籍归还后我们需要将书籍是否借出的状态进行改变,在Book类中实现:

public boolean isIsborrow() {return isborrow;}public void setIsborrow(boolean isborrow) {this.isborrow = isborrow;}

四. 总代码

Main类:

import book.BookList;
import user.Administrator;
import user.User;
import user.VipPerson;
import user.Visitor;
import java.util.Scanner;public class Main {public static User login(){   //登录系统过程Scanner scanner=new Scanner(System.in);System.out.println("请输入你的名字:");String name = scanner.nextLine();System.out.println("请输入你要登入的帐号:1.管理员登录 -----> 2.游客登录 ----->");int choice=scanner.nextInt();if(choice==1){return new Administrator(name); //如果选择了1,就创建一个管理员对象,并返回}else if(choice==2){return new Visitor(name); //如果选择了2,就创建一个游客对象,并返回}else{return new VipPerson(name);}//此时的返回值我们不能确定返回的是管理员对象还是用户对象,所以这里用向上转型返回User类型的对象}public static void main(String[] args) {BookList bookList=new BookList(); //实例化书架User user=login(); //进入登录系统while(true) {int chioce = user.menu(); //接收选择服务的选项user.Dooperate(chioce, bookList); //调用 游客/管理员 提供的服务}}
}

User类:

package user;
import book.BookList;
import operation.Operate;public abstract class User {public String name; //用户名称public Operate []operate;  //创建服务数组,子类通过数组下标调用 各个服务public User(String name) {this.name = name; //初始化用户名称}public abstract int menu(); //服务菜单public void Dooperate(int choice,BookList books){this.operate[choice].work(books);  //调用 游客/管理员 所选择的服务}
}

 Administrator类:

package user;
import operation.*;
import java.util.Scanner;
public class Administrator extends User{public Administrator(String name) {super(name);//通过父类初始化管理员名称this.operate=new Operate[]{  //创建 管理员账户提供的服务new Exitbook(),new Findbook(),new Addbook(),new Deletebook(),new Showbook()};}@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 scanner=new Scanner(System.in);System.out.println("请选择您需要的服务:-->>");int choice=scanner.nextInt();return choice;}
}

Visitor类:

package user;
import operation.*;
import java.util.Scanner;
public class Visitor extends User{public Visitor(String name) {super(name); //通过父类初始化用户名称this.operate=new Operate[]{   //创建 游客账户提供的服务new Exitbook(),new Findbook(),new Borrowbook(),new Retuenbook()};}public 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 scanner=new Scanner(System.in);System.out.println("请选择您需要的服务:-->>");int choice=scanner.nextInt();return choice;}
}

Book类:

package book;
public class Book {     //书的属性private String name; //书名private String author; //作者private  int price;  //价格private String type; //书籍类型private boolean isborrow; //是否被借出public Book(String name, String author, int price, String type) {//初始化书的属性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 isIsborrow() {return isborrow;}public void setIsborrow(boolean isborrow) {this.isborrow = isborrow;}@Overridepublic String toString() {return "Book{" +"书名='" + name + '\'' +", 作者='" + author + '\'' +", 价格=" + price +", 类型='" + type + '\'' +(isborrow==true?" ,已经借出":" ,未被借出") +'}';}
}

Booklist类:

package book;
public class BookList {private Book [] books;//表示书架可以存放10本书private int usedbooks;//表示books数组中存放了几本书public BookList() {this.books = new Book [10];  //默认创建存放10本书大小的数组this.books[0]=new Book("三国演义","罗贯中",20,"四大名著");this.books[1]=new Book("西游记","吴承恩",22,"四大名著");this.books[2]=new Book("红楼梦","曹雪芹",24,"四大名著");this.books[3]=new Book("水浒传","施耐庵",26,"四大名著");this.usedbooks=4;//初始化有效书本数量为4本}public int getUsedbooks() {return usedbooks;//返回有效书本数量}public void setUsedbooks(int usedbooks) {this.usedbooks = usedbooks;//更改有效书本数量}public Book getbook(int pos){return this.books[pos];  //返回书架中 第pos本书}public void setBooks(int pos,Book book){this.books[pos]=book;  //更改书架中的书}
}

 那么operation这个包中各个类的代码都在 实现服务 那里写啦,这里就不在重新上传了~

结语

以上就是利用我们过去的所学知识实现的图书管理系统的基本逻辑构造,在此感谢大家的观看!!!

相关文章:

Java篇图书管理系统

目录 前言 一. 图书管理系统的核心 二. 图书管理系统基本框架 2.1 book包 2.1.1 Book&#xff08;书籍类&#xff09; 2.1.2 Booklist (书架类&#xff09; 2.2 user包 2.2.1 User类 2.2.2 Administrator(管理员类) 2.2.3 Visitor&#xff08;用户类&#xff09; 2.…...

BUUCTF之web篇

第一题 [极客大挑战 2019]EasySQL 打开靶机后可以看到这是一个登陆的页面 我们可以尝试两种方式登录 弱口令爆破&#xff08;burpsuite&#xff09; 通过SQL注入里的万能密码来跳过账户和密码验证的过程 这里就需要万能密码aor true # 在这里单引号的作用是结束用户名或者密码…...

010——二叉树(2)线索化

引入&#xff1a; 问题1&#xff1a; n个节点的二叉树&#xff0c;用二叉链表存储&#xff0c;问在这个二叉链表中一共有 __个指针域? 其中&#xff0c;有 __个指针域不为NULL&#xff0c;__个指针域为NULL? 答&#xff1a;2n n-1 n1 在二叉链表中&#xf…...

鸿蒙拍照小助手02

项目文件目录 为了确保项目文件目录清晰,以下是完整的项目文件目录结构: code 拍照小助手/ │ ├── entry/ │ ├── src/ │ │ ├── main/ │ │ │ ├── js/ │ │ │ │ └── 默认/ │ │ │ │ ├── 页面/ │ │ │ │ │ ├── 主页/ │ │ │ │ │ │ ├…...

lua while循环

软考鸭微信小程序 过软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 Lua作为一种小巧精致的语言&#xff0c;特别适用于嵌入其他程序提供脚本支持。在编程中&#xff0c;循环结构是不可或缺的一部分&#xff0c;而while循环则是…...

JAVA篇之类和对象

目录 一. 面向对象 1.1 面向对象和面向过程 二. 类的定义和使用 2.1 什么是类 2.2 类的定义格式 三. 类的实例化 四. this引用 4.1 this引用的作用 五. 构造方法 5.1 构造方法重载 5.2 通过this调用其他构造方法 5.3 默认初始化 结语 一. 面向对象 Java 是一门面向对…...

IO流详解_CoderLix

主要内容 File类IO流字节流字符流异常处理Properties缓冲流转换流序列化流打印流 File类 1.1 概述 java.io.File 类是文件和目录路径名的抽象表示&#xff0c;主要用于文件和目录的创建、查找和删除等操作。 1.2 构造方法 public File(String pathname) &#xff1a;通过…...

241023-RHEL非管理员安装Docker并开放指定宿主机端口部署Gitlab

A. RHEL非管理员安装Docker 要在没有管理员权限的情况下离线安装 Docker 和 Docker Compose&#xff0c;虽然受到一定限制&#xff0c;仍有一些可行的步骤可以帮助你在有限权限下完成这项任务。需要注意的是&#xff0c;这种方式适用于本地用户环境下的 Docker 安装&#xff0…...

python ubuntu安装加速

ubuntu升级python到python3.11&#xff08;可能是全网最靠谱的方法&#xff0c;亲测有效&#xff09;_ubuntu python3.11-CSDN博客 python-release安装包下载_开源镜像站-阿里云...

100种算法【Python版】第12篇——快速幂算法

本文目录 1 基本原理2 基本步骤3 数学示例4 python代码1 基本原理 快速幂算法(Fast Exponentiation)是一种高效计算整数幂的方法,尤其适用于计算大数的幂。其主要思想是利用分治法和二进制表示来减少乘法运算的次数,从而加快计算速度。 计算 x n x^n x...

Java多线程详解②(全程干货!!!)Thread Runnable

这里是Themberfue 上节主要讲完了多线程的一些基础知识&#xff0c;这节通过代码进一步理解多线程&#x1fae1; 多线程 Java标准库中提供了Thread类&#xff0c;以程序员们编写多线程代码&#xff0c;我们可以查看官方文档进一步了解Thread的特性以及提供的接口。 类似于Sy…...

机器学习——图神经网络

图神经网络(GNN)&#xff1a;理解复杂网络数据的有效工具 图神经网络&#xff08;Graph Neural Network, GNN&#xff09;是近年来机器学习领域的热门话题。GNN 以图结构数据为核心&#xff0c;能够高效地捕捉节点和边的复杂关系&#xff0c;广泛应用于社交网络、推荐系统、生…...

一、在cubemx下RTC配置调试实例测试

一、rtc的时钟有lse提供。 二、选择rtc唤醒与闹钟功能 内部参数介绍 闹钟配置 在配置时间时&#xff0c;注意将时间信息存储起来&#xff0c;防止复位后时间重新配置。 if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0)! 0x55AA)//判断标志位是否配置过&#xff0c;没有则进…...

【Nas】X-DOC:Mac mini Docker部署中国特供版Jellyfin

【Nas】X-DOC&#xff1a;Mac mini Docker部署中国特供版Jellyfin 1、拉取镜像&#xff1a;2、启动镜像3、访问服务4、参考文档 Mac mini Docker部署中国特供版Jellyfin 1、拉取镜像&#xff1a; docker pull nyanmisaka/jellyfin:230901-amd64jellyfin 10.8.10版本&#xff…...

合合信息:生成式Al时代的内容安全与系统构建加速,开启智能文档的全新潜能

文章目录 写在前面图像内容安全图像篡改应用场景伪造文档/证照检测伪造人脸检测 GAI时代系统构建加速通用文档解析 合合信息 写在前面 随着人工智能技术的飞速发展&#xff0c;生成式AI已经悄然步入了我们的日常生活&#xff0c;以其强大的内容生成能力&#xff0c;重塑了信息…...

京东双十一高并发场景下的分布式锁性能优化

背景 在电商领域&#xff0c;尤其是像京东双十一这样的大促活动&#xff0c;系统需要处理极高的并发请求。这些请求往往涉及库存的查询和更新&#xff0c;如果处理不当&#xff0c;很容易出现库存超卖、数据不一致等问题。分布式锁作为一种有效的解决方案&#xff0c;能够在多…...

华为ICT题库-AI 人工智能部分

1178、以下哪个选项是华为的云端AI芯片&#xff1f;&#xff08;云服务考点&#xff09; (A)Inferentia (B)MLU100 (C)Cloud TPU (D)Ascend 910 答案&#xff1a;D 解析&#xff1a;华为的云端AI芯片被称为Ascend芯片系列&#xff0c;其中Ascend 910是其旗舰产品。Ascend 910…...

React Native 修改安卓应用图片和名称

在React Native&#xff08;RN&#xff09;项目中&#xff0c;修改安卓应用图标和名称通常涉及对Android原生代码的一些修改。以下是详细步骤&#xff1a; 修改应用图标 准备图标资源&#xff1a; 创建或获取你想要的图标&#xff0c;并确保它们符合Android的图标规范&#xf…...

普推知产:商标初审已下,商标申请通过如何高些!

近期下来一批商标注册的初步审公告通知书&#xff0c;一些客户对商标下证要求比较高的&#xff0c;普推知产商标老杨发现&#xff0c;要像下证高核心还是在于名称&#xff0c;名称起好备用的多&#xff0c;让商标专业人士经检索后层层过滤后提报&#xff0c;通过会好很多。 普推…...

HICP--2

在area 0的路由器只生成 area 0 的数据库&#xff0c;只在area 1 的一样。但是既在又在的生成两个 area的 LSDB 一、区域间三类LSA 在OSPF&#xff08;Open Shortest Path First&#xff09;协议中&#xff0c;区域间三类LSA&#xff08;Link-State Advertisement&#xff09…...

sheng的学习笔记-AI基础-正确率/召回率/F1指标/ROC曲线

AI目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 分类准确度问题 假设有一个癌症预测系统&#xff0c;输入体检信息&#xff0c;可以判断是否有癌症。如果癌症产生的概率只有0.1%&#xff0c;那么系统预测所有人都是健康&#xff0c;即可达到99.9%的准确率。 但显然这样的…...

Linux -- 共享内存(2)

目录 命令 ipcs -m &#xff1a; 命令 ipcrm -m shmid&#xff1a; 共享内存的通信&#xff1a; 为什么共享内存更高效&#xff1f; 代码&#xff1a; ShmClient.cc&#xff1a; ShmServer.cc&#xff1a; 结果&#xff1a; 如何让共享内存实现同步&#xff1f; 代码&a…...

云函数实现发送邮件,以qq邮箱为例

云函数实现发送邮件,前端传参调用发送邮件即可。以qq邮箱为例。 1、开启qq邮箱的smtp服务并且生成授权码&#xff0c;操作界面如下图&#xff1a; 2、在腾讯云新建一个云函数代码如下&#xff1a; const nodemailer require("nodemailer");// 云函数入口函数 export…...

Kafka如何控制消费的位置?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka如何控制消费的位置?】面试题&#xff1f;希望对大家有帮助&#xff1b; Kafka如何控制消费的位置? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Kafka 中&#xff0c;控制消费位置主要通过以下几个机制来实…...

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…...

【Linux】【xmake】安装 + C/C++常用项目配置

文章目录 0. 环境准备1. 子命令create - 快速创建项目build - 构建程序config - 配置编译需要的参数show - 查看当前工程基本信息update - 程序自更新 2. C/C 项目常用配置2.1 项目目标类型2.2 添加宏定义2.3 头文件路径和链接库配置2.4 设置语言标准2.5 设置编译优化2.6 添加源…...

Android 添加菜单开关控制Camera相机和第三方相机

本文主要通过SystemProperties系统属性和Settings.System存储数据库的状态进行判断,从而实现控制相机 /vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values-zh-rCN/strings.xml <!--camera--> <string name="manager_camera_switch"&…...

【Java知识】使用jacoco实现代码覆盖率测试

文章目录 1. 添加JaCoCo插件到项目2. 配置Maven Surefire Plugin3. 执行测试并生成报告4. 查看覆盖率报告注意事项 要使用JaCoCo实现代码覆盖率测试&#xff0c;你需要遵循以下步骤&#xff1a; 1. 添加JaCoCo插件到项目 在Maven项目的pom.xml文件中添加JaCoCo插件。这允许你执…...

道路车辆功能安全 ISO 26262标准(9-2)—面向汽车安全完整性等级 (ASIL) 和安全的分析

写在前面 本系列文章主要讲解道路车辆功能安全ISO26262标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解功能安全标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 1. 道路车辆功能安全ISO 26262标准 9. ISO 26262-9 面向汽车安全完整…...

hutool常用方法

1、树结构工具-TreeUtil 构建Tree示例 package com.sl.transport.common.util;import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.TreeNode; import cn.hutool.core…...

网站建设郑州/百度seo优化分析

https://blog.csdn.net/u013032340/article/details/53608790 sign一下以备用 第一种方法&#xff1a; 一般的XP安装光盘里都带破解管理员密码 找张安装盘进入修改一下管理员密码就可以了 第二种方法&#xff1a; 1.xp启动按F8 出现选项后选择“带命令的安全模式” 2.1分钟左右…...

北碚区建设银行网站/网站建设深圳公司

暂时只读了区块链基本然后串读了IOTA的部分功能和构架 DAG确实比较nb的样子&#xff0c;但是毕竟自己代码没上手&#xff0c;就不多说了&#xff0c;这里导师好像也和我这种靠写代码学习的套路不一样&#xff0c;一直ban我写代码&#xff08;或者说大部分时间都是看各种乱七八糟…...

网站速度慢的原因/上海网络seo优化公司

有一段时间&#xff0c;我一直在思考什么是团队文化&#xff0c;包括几年前曾经被反复提及的工程师文化等等。 但我始终觉得文化和角色之间并没有那么强的关联关系&#xff0c;我觉得文化和人的性格的关联度更高一些。 如果从这个角度看的话&#xff0c;我觉得搞技术的大致可以…...

找网站有中文字目的/互联网推广好做吗

阿文菌爱捡垃圾 篇二十一&#xff1a;组装一台小巧的8盘位万兆NAS&#xff0c;参考翼王使用永擎C236主板&#xff0c;E3是否还值得下手&#xff1f;2020-09-09 14:13:09283点赞1221收藏196评论创作立场声明&#xff1a;参考UP主&#xff1a;翼王&#xff0c;组装了一台8盘位高性…...

wordpress代码编辑/南宁seo排名收费

当你搜索到pagehelper多表分页实现的时候&#xff0c;我想你对mybatis pagehelper插件的整合与使用已经没有问题了&#xff0c;你遇到的问题应该是List分页数据来源于多张表的时候&#xff0c;pagehelper分页失效了&#xff0c;所以本文只讲述pagehelper多表分页与普通分页细节…...

西安建设科技专修学院网站/中国重大新闻

官网上有一个发送时间的服务类作为入门的例子 http://mina.apache.org/mina-project/quick-start-guide.html 我们需要的两个jar都可以从下载的压缩包中找到 mina-core-2.0.7.jar slf4j-api-1.6.6.jar 服务器代码分为两个类&#xff0c;一个启动服务的类MinaTimeServer.java&am…...