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

Java SE - 图书管理系统模拟实现

目录

  • 1.设计框架
  • 2. 实现用户类
  • 3.实现书和书架类
  • 4.登录界面的实现
  • 5.实现menu方法
  • 6.测试菜单选择
  • 7.实现一个IFun接口
    • 7.1 查找功能的实现
    • 7.2 展示功能的实现
    • 7.3 增加功能的实现
    • 7.4 删除功能的实现
    • 7.5 退出功能的实现
    • 7.6 借阅功能的实现
    • 7.7 归还功能的实现
  • 8.实现IFuntion类型的数组
  • 9. 在main方法中使用IFuntion类型的数组
  • 10.测试当前的功能是否能实现
  • 11.程序代码
    • 11.1 Demo1包
    • 11.2 Demo2包
    • 11.3 Demo3包
    • 11.4 Main类

1.设计框架

在这里插入图片描述

图书管理系统的对象有普通用户和管理员,可以通过登录系统进行选择,对于普通用户可以操作的对象是书架上的图书,可以查询,展示,借阅,归还,退出等操作,而管理员操作对象也是书架上的图书,可以对图书进行查找,展示,增加,删除,退出图书系统的操作,以上就是简单设计框架。

2. 实现用户类

管理员和普通用户都是Person,可以将共性部分进行归纳,然后继承给子类普通用户和管理员,将这几个类存放于Demo1的包中。

1.Person类:成员属性包括名字和年龄,并实现构造方法。

package Demo1;public abstract class Person {//成员属性public String name;//名字public int age;//构造方法public Person(String name, int age) {this.name = name;this.age = age;}
}

2.实现AdminUser类继承于Person类,完成构造方法。

package Demo1;public class AdminUser extends Person{//构造方法public AdminUser(String name, int age) {super(name, age);}
}

3.实现NormalUser类继承于Person类,完成构造方法。

package Demo1;public class NormalUser extends Person{//构造方法public NormalUser(String name, int age) {super(name, age);}
}

3.实现书和书架类

将这两个类存放于Demo2的包中,并实现类的定义。

1.实现一个书籍类,成员变量有书名,作者,类型,价格,书籍的情况(是否借出),这一些成员变量除了书籍的情况,其它都用private修饰,完成封装,使用set或get方法完成初始化或获取,重写toString方法,可根据需求修改。

package Demo2;public class Book {//成员变量private String name;//书名private String auther;//作者private String type;//类型private double cost;//价格public boolean borrowed;//是否借出//四个参数的构造方法public Book(String name, String auther, String type, double cost) {this.name = name;this.auther = auther;this.type = type;this.cost = cost;}//set方法public void setName(String name) {this.name = name;}//设置书名public void setAuther(String auther) {this.auther = auther;}//编辑作者名public void setType(String type) {this.type = type;}//设置类型public void setCost(double cost) {this.cost = cost;}//价格//get方法public String getName() {return name;}//获取书名public String getAuther() {return auther;}//获取作者名字public String getType() {return type;}//获取书籍类型public double getCost() {return cost;}//获取书籍价格//重写toString方法:系统默认生成后根据需要修改,以下修改了borrowed的表达//使用三目操作符,表达式结果是:“已借出”和“未借出”两种结果@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", auther='" + auther + '\'' +", type='" + type + '\'' +", cost=" + cost +", borrowed=" + ((this.borrowed == true) ? "已借出" : "未借出")  +'}';}
}

2.实现一个书架可以存放书籍,书架的容量为10,定义一个变量记录当前存放的书籍数目,存放一些书籍,例如四大名著,完成set和get方法。

package Demo2;
//书架
public class Booklist {//实例化Book类型的数组Book[] book = new Book[10];//书架容量,10//创建一个记录当前书籍数的变量private int count;//在构造方法中先存放一些书籍,例如四大名著public Booklist(){book[0] = new Book("西游记","吴承恩","长篇小说",832.50);book[1] = new Book("红楼梦","曹雪芹","长篇小说",51.90);book[2] = new Book("三国演义","罗贯中","长篇小说",43.80);book[3] = new Book("水浒传","施耐庵","长篇小说",496.00);this.count = 4;}//set方法//将新的引用赋给当前下标的引用public void setBook(int pos,Book book) {this.book[pos] = book;}//设置count的值public void setCount(int count) {this.count = count;};//将后面的引用赋给前面的引用,在删除功能中使用public void setBook(Book[] book,int pos) {this.book[pos] = book[pos+1];}//get方法
//得到当前书籍的引用public Book[] getBook() {return book;}
//获取当前书架上的书籍数public int getCount() {return count;}
}

4.登录界面的实现

实现一个login方法实现用户的选择功能,返回类型为Person。

import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;import java.util.Scanner;public class Main{public static Person login(){//选择身份System.out.println("请选择你的身份:> 1.管理员  2.普通用户");System.out.print("请输入:> ");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();//返回类型if(choice == 1) return new AdminUser("zansang",22);else return new NormalUser("lisi",33);}public static void main(String[] args) {//1.加载用户选择,通过返回值确定用户类型Person person =  login();//接收返回值}
}

5.实现menu方法

在Person类中定义一个抽象的menu方法,在子类AdminUser和NormalUser中重写。

package Demo1;public abstract class Person {//成员属性public String name;//名字public int age;//构造方法public Person(String name, int age) {this.name = name;this.age = age;}//菜单menupublic abstract void menu();
}
//管理员选择的菜单@Overridepublic int  menu(){//打印菜单System.out.println(this.name + "欢迎你来到图书管理系统!");System.out.println("****************************");System.out.println("*****     0.Exit       *****");System.out.println("*****     1.AddBook    *****");System.out.println("*****     2.DelBook    *****");System.out.println("*****     3.Search     *****");System.out.println("*****     4.ShowBook   *****");System.out.println("****************************");//选择功能Scanner scanner = new Scanner(System.in);System.out.print("请选择:>");int choice = scanner.nextInt();//返回选择选项return choice;
}
//普通用户选择的菜单
@Overridepublic int  menu(){//打印菜单System.out.println(this.name + "欢迎你来到图书管理系统!");System.out.println("****************************");System.out.println("*****     0.Exit       *****");System.out.println("*****     1.Borrow    *****");System.out.println("*****     2.Return    *****");System.out.println("*****     3.Search     *****");System.out.println("*****     4.ShowBook   *****");System.out.println("****************************");//选择功能Scanner scanner = new Scanner(System.in);System.out.print("请选择:>");int choice = scanner.nextInt();//返回选择选项return choice;}

6.测试菜单选择

import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;
import java.util.Scanner;public class Main{public static Person login(){//选择身份System.out.println("请选择你的身份:> 1.管理员  2.普通用户");System.out.print("请输入:> ");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();//返回类型if(choice == 1) return new AdminUser("zansang",22);else return new NormalUser("lisi",33);}public static void main(String[] args) {//1. //加载书架:有书架和书籍才可以操作,先实例一个书架Booklist booklist = new Booklist();while(true) {//2.加载用户选择,通过返回值确定用户类型Person person =  login();//接收返回值//3.实现选择功能,不同用户有不同的选择,根据login返回类型确定int choice = person.menu();if(choice == 0) break;}}
}

在这里插入图片描述
通过测试程序当前可以根据选择的身份调用不同的菜单,下一步可以具体实现功能的使用。

7.实现一个IFun接口

创建一个新的Demo3包实现一个IFuntion接口,接口中定义一个抽象的work方法。

package Demo3;public interface IFuntion {//抽象方法:功能public abstract void work(Booklist booklist);
}

7.1 查找功能的实现

查找功能可以遍历数组,通过书名匹配,使用IFuntion接口,重写抽象方法。

package Demo3;
import Demo2.Booklist;
import java.util.Scanner;public class Search implements IFuntion{@Overridepublic void work(Booklist booklist) {//输入查找的书名Scanner scanner = new Scanner(System.in);System.out.print("请输入书名:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0;for (; i < sz; i++) {if(booklist.getBook(i).getName().equals(bookName)){break;//找到了}}//找不到if(i == sz) System.out.println(bookName + "此书不存在!");//找到了,输出展示else{System.out.print("找到了,书籍信息: ");System.out.println(booklist.getBook(i));}}
}

7.2 展示功能的实现

展示的功能是通过数组遍历将书籍信息输出打印,使用IFuntion这个接口,重写work方法。

package Demo3;
import Demo2.Booklist;public class ShowBook implements IFuntion{@Overridepublic void work(Booklist booklist) {System.out.println("************************************");int sz = booklist.getCount();//获取当前书籍数//遍历数组输出for (int i = 0; i < sz; i++) {System.out.println(booklist.getBook(i));}System.out.println("************************************");}
}

7.3 增加功能的实现

增加可能使用IFuntion这个接口,重写work方法,需要先判断容量是否已满,如果已满就不能增加,如果未满就可以添加在count下标的位置,添加后调用setCount方法使count++。

package Demo3;
import Demo2.Book;
import Demo2.Booklist;
import java.util.Scanner;public class AddBook implements IFuntion{@Overridepublic void work(Booklist booklist) {//获取当前容量int sz = booklist.getCount();//获取总的容量int capacity = booklist.getBook().length;//判断if(sz == capacity){//说明已满,不可添加System.out.println("书架存放位置已满,不可添加!");return;}//未满,可以添加Scanner scanner = new Scanner(System.in);System.out.print("请输入书名:>");String bookName = scanner.nextLine();System.out.print("请输入作者名称: >");String auther = scanner.nextLine();System.out.print("请输入书籍类型: >");String type  = scanner.nextLine();System.out.print("请输入书籍价格: >");double cost = scanner.nextDouble();//将输入好的数据存放于一个临时的引用中Book tem = new Book(bookName,auther,type,cost);//通过set方法方法booklist.setBook(sz,tem);//将count+1booklist.setCount(sz + 1);//sz表示当前的count//提示一下System.out.println("增加成功!");}
}

7.4 删除功能的实现

删除功能使用IFuntion这个接口,重写work方法,先遍历数组查寻是否存在需要删除的书籍,如果存在在找到的下标位置从后往前替换,最后一个引用设置为null。

在这里插入图片描述

package Demo3;
import Demo2.Booklist;
import java.util.Scanner;public class DelBook implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入删除的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0 ;for (; i < sz; i++) {if(booklist.getBook(i).getName().equals(bookName)){break;//找到了}} //找不到if(sz == i) System.out.println("输入的书籍名称不存在!");//找到了else{ for (; i < sz - 1; i++) {//使用set方法:将i+1下标的引用赋值给下标为i的引用booklist.setBook(booklist.getBook(),i);}//将数组count - 1booklist.setCount(sz - 1);//提示一下System.out.println("输入的书籍已经删除!");}}
}

7.5 退出功能的实现

退出功能使用IFuntion这个接口,重写抽象方法work,使用System类的Exit方法。

package Demo3;import Demo2.Booklist;public class Exit implements IFuntion{@Overridepublic void work(Booklist booklist) {//提示一下System.out.println("程序正在退出中......");System.exit(0);//参数一般默认为0}
}

7.6 借阅功能的实现

借阅可能使用IFuntion这个接口,重写抽象方法work,遍历数组抽象对应的书籍是否存在,如果存在查询是否借阅,如果未借出,可以借阅后修改状态。

package Demo3;import Demo2.Booklist;import java.util.Scanner;public class Borrow implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入需要借阅的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0 ;for (; i < sz; i++) {if(booklist.getBook(i).equals(bookName)){break;//找到了}}if(sz == i) System.out.println("需要借阅的书籍不存在!");//已经借阅else {if (booklist.getBook(i).borrowed == true) {System.out.println("此书籍已经借阅!");} else {System.out.println("此书籍可以借阅!");}booklist.getBook(i).borrowed = true;System.out.println("已登记,可以借出!");}}
}

7.7 归还功能的实现

归还功能使用IFtunion这个接口,重写work方法,首先遍历数组匹配归还的书籍名称,如果匹配上,将书籍状态设置未借出后提示归还成功,如果未匹配上,就提示归还的书籍不存在。

package Demo3;import Demo2.Booklist;import java.util.Scanner;public class Return implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入需要归还的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0;for (; i < sz; i++) {if (booklist.getBook(i).getName().equals(bookName)) {break;//找到了}}//找不到if(sz == i) System.out.println("输入的归还书籍不存在");//找到了,将书籍状态设置为未借出后提示归还else{booklist.getBook(i).borrowed = false;System.out.println("书籍归还成功!");}}
}

8.实现IFuntion类型的数组

在Person类中定义一个IFuntion类型的数组引用,具体实现方式子类完成。

//使用接口数组public IFuntion[] iFuntions;

AdminUser类中,数组的内容与管理员菜单匹配,在构造方法中完成赋值。

   //构造方法public AdminUser(String name, int age) {super(name, age);this.iFuntions = new IFuntion[]{new Exit(),new AddBook(),new DelBook(),new Search(),new ShowBook()};}

NormalUser类中,数组的内容与普通用户菜单匹配,在构造方法中完成赋值。

  //构造方法public NormalUser(String name, int age) {super(name, age);this.iFuntions = new IFuntion[]{new Exit(),new Borrow(),new Return(),new Search(),new ShowBook()};}

9. 在main方法中使用IFuntion类型的数组

public static void main(String[] args) {//1. //加载书架:有书架和书籍才可以操作,先实例一个书架Booklist booklist = new Booklist();//2.加载用户选择,通过返回值确定用户类型Person person =  login();//接收返回值while(true) {//3.实现选择功能,不同用户有不同的选择,根据login返回类型确定int choice = person.menu();if(choice < 0 || choice >= booklist.getBook().length){System.out.println("非法输入,请重新输入!!!");}else {//通过person引用使用iFuntions这个引用数组下标为choice的类//调用其中的work方法person.iFuntions[choice].work(booklist);}}

10.测试当前的功能是否能实现

1.测试管理员功能,展示,搜索,增加,删除,退出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.测试普通用户的功能:展示,搜索,借阅,归还,退出。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

11.程序代码

11.1 Demo1包

在这里插入图片描述

package Demo1;
import Demo2.Booklist;
import Demo3.IFuntion;public abstract class Person {//成员属性public String name;//名字public int age;//构造方法public Person(String name, int age) {this.name = name;this.age = age;}//菜单menupublic abstract int menu();//使用接口数组public IFuntion[] iFuntions;
}
package Demo1;import Demo2.Booklist;
import Demo3.*;import java.util.Scanner;public class AdminUser extends Person{//构造方法public AdminUser(String name, int age) {super(name, age);this.iFuntions = new IFuntion[]{new Exit(),new AddBook(),new DelBook(),new Search(),new ShowBook()};}@Overridepublic int  menu(){//打印菜单System.out.println(this.name + "欢迎你来到图书管理系统!");System.out.println("****************************");System.out.println("*****     0.Exit       *****");System.out.println("*****     1.AddBook    *****");System.out.println("*****     2.DelBook    *****");System.out.println("*****     3.Search     *****");System.out.println("*****     4.ShowBook   *****");System.out.println("****************************");//选择功能Scanner scanner = new Scanner(System.in);System.out.print("请选择:>");int choice = scanner.nextInt();//返回选择选项return choice;}
}
package Demo1;import Demo3.*;import java.util.Scanner;public class NormalUser extends Person{//构造方法public NormalUser(String name, int age) {super(name, age);this.iFuntions = new IFuntion[]{new Exit(),new Borrow(),new Return(),new Search(),new ShowBook()};}@Overridepublic int  menu(){//打印菜单System.out.println(this.name + "欢迎你来到图书管理系统!");System.out.println("****************************");System.out.println("*****     0.Exit       *****");System.out.println("*****     1.Borrow    *****");System.out.println("*****     2.Return    *****");System.out.println("*****     3.Search     *****");System.out.println("*****     4.ShowBook   *****");System.out.println("****************************");//选择功能Scanner scanner = new Scanner(System.in);System.out.print("请选择:>");int choice = scanner.nextInt();//返回选择选项return choice;}
}

11.2 Demo2包

在这里插入图片描述

package Demo2;public class Book {//成员变量private String name;//书名private String auther;//作者private String type;//类型private double cost;//价格public boolean borrowed;//是否借出//四个参数的构造方法public Book(String name, String auther, String type, double cost) {this.name = name;this.auther = auther;this.type = type;this.cost = cost;}//set方法public void setName(String name) {this.name = name;}//设置书名public void setAuther(String auther) {this.auther = auther;}//编辑作者名public void setType(String type) {this.type = type;}//设置类型public void setCost(int cost) {this.cost = cost;}//价格//get方法public String getName() {return name;}public String getAuther() {return auther;}public String getType() {return type;}public double getCost() {return cost;}//重写toString方法:系统默认生成后根据需要修改,以下修改了borrowed的表达//使用三目操作符,表达式结果是:“已借出”和“未借出”两种结果@Overridepublic String toString() {return "Book{" +"name='" + name + '\'' +", auther='" + auther + '\'' +", type='" + type + '\'' +", cost=" + cost +", borrowed=" + ((this.borrowed == true) ? "已借出" : "未借出")  +'}';}
}
package Demo2;public class Booklist {//实例化Book类型的数组Book[] book = new Book[10];//书架容量,10//创建一个记录当前书籍数的变量private int count;//在构造方法中先存放一些书籍,例如四大名著public Booklist(){book[0] = new Book("西游记","吴承恩","长篇小说",832.50);book[1] = new Book("红楼梦","曹雪芹","长篇小说",51.90);book[2] = new Book("三国演义","罗贯中","长篇小说",43.80);book[3] = new Book("水浒传","施耐庵","长篇小说",496.00);this.count = 4;}//set方法//将新的引用赋给当前下标的引用public void setBook(int pos,Book book) {this.book[pos] = book;}public void setCount(int count) {this.count = count;};//将后面的引用赋给前面的引用,在删除功能中使用public void setBook(Book[] book,int pos) {this.book[pos] = book[pos+1];}//get方法
//得到当前书籍的引用public Book[] getBook() {return book;}
//获取当前下标数的引用
public Book getBook(int pos){return book[pos];
}
//获取当前书架上的书籍数public int getCount() {return count;}
}

11.3 Demo3包

在这里插入图片描述

package Demo3;
import Demo2.Book;
import Demo2.Booklist;
import java.util.Scanner;public class AddBook implements IFuntion{@Overridepublic void work(Booklist booklist) {//获取当前容量int sz = booklist.getCount();//获取总的容量int capacity = booklist.getBook().length;//判断if(sz == capacity){//说明已满,不可添加System.out.println("书架存放位置已满,不可添加!");return;}//未满,可以添加Scanner scanner = new Scanner(System.in);System.out.print("请输入书名:>");String bookName = scanner.nextLine();System.out.print("请输入作者名称: >");String auther = scanner.nextLine();System.out.print("请输入书籍类型: >");String type  = scanner.nextLine();System.out.print("请输入书籍价格: >");double cost = scanner.nextDouble();//将输入好的数据存放于一个临时的引用中Book tem = new Book(bookName,auther,type,cost);//通过set方法方法booklist.setBook(sz,tem);//将count+1booklist.setCount(sz + 1);//sz表示当前的count//提示一下System.out.println("增加成功!");}
}
package Demo3;import Demo2.Booklist;import java.util.Scanner;public class Borrow implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入需要借阅的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0 ;for (; i < sz; i++) {if(booklist.getBook(i).getName().equals(bookName)){break;//找到了}}if(sz == i) System.out.println("需要借阅的书籍不存在!");//已经借阅else {if (booklist.getBook(i).borrowed == true) {System.out.println("此书籍已经借阅!");} else {System.out.println("此书籍可以借阅!");}booklist.getBook(i).borrowed = true;System.out.println("已登记,可以借出!");}}
}
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;public class DelBook implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入删除的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0 ;for (; i < sz; i++) {if(booklist.getBook(i).getName().equals(bookName)){break;//找到了}}//找不到if(sz == i) System.out.println("输入的书籍名称不存在!");//找到了else{for (; i < sz - 1; i++) {//使用set方法:将i+1下标的引用赋值给下标为i的引用booklist.setBook(booklist.getBook(),i);}//将数组count - 1booklist.setCount(sz - 1);//提示一下System.out.println("输入的书籍已经删除!");}}
}
package Demo3;import Demo2.Booklist;public class Exit implements IFuntion{@Overridepublic void work(Booklist booklist) {//提示一下System.out.println("程序正在退出中......");System.exit(0);//参数一般默认为0}
}
package Demo3;import Demo2.Booklist;public interface IFuntion {//抽象方法:功能public abstract void work(Booklist booklist);
}
package Demo3;import Demo2.Booklist;import java.util.Scanner;public class Return implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入需要归还的书籍名称:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0;for (; i < sz; i++) {if (booklist.getBook(i).getName().equals(bookName)) {break;//找到了}}//找不到if(sz == i) System.out.println("输入的归还书籍不存在");//找到了,将书籍状态设置为未借出后提示归还else {booklist.getBook(i).borrowed = false;System.out.println("书籍归还成功!");}}
}
package Demo3;
import Demo2.Booklist;
import java.util.Scanner;public class Search implements IFuntion{@Overridepublic void work(Booklist booklist) {Scanner scanner = new Scanner(System.in);System.out.print("请输入书名:>");String bookName = scanner.nextLine();//遍历数组int sz = booklist.getCount();int i = 0;for (; i < sz; i++) {if(booklist.getBook(i).getName().equals(bookName)){break;//找到了}}//找不到if(i == sz) System.out.println(bookName + "此书不存在!");//找到了,输出展示else {System.out.print("找到了,书籍信息: ");System.out.println(booklist.getBook(i));}}
}
package Demo3;
import Demo2.Booklist;public class ShowBook implements IFuntion{@Overridepublic void work(Booklist booklist) {System.out.println("*******************************************************************************");int sz = booklist.getCount();//获取当前书籍数//遍历数组输出for (int i = 0; i < sz; i++) {System.out.println(booklist.getBook(i));}System.out.println("*******************************************************************************");}
}

11.4 Main类

在这里插入图片描述

import Demo1.AdminUser;
import Demo1.NormalUser;
import Demo1.Person;
import Demo2.Booklist;
import java.util.Scanner;public class Main{public static Person login(){//选择身份System.out.println("请选择你的身份:> 1.管理员  2.普通用户");System.out.print("请输入:> ");Scanner scanner = new Scanner(System.in);int choice = scanner.nextInt();//返回类型if(choice == 1) return new AdminUser("zansang",22);else return new NormalUser("lisi",33);}public static void main(String[] args) {//1. //加载书架:有书架和书籍才可以操作,先实例一个书架Booklist booklist = new Booklist();//2.加载用户选择,通过返回值确定用户类型Person person =  login();//接收返回值while(true) {//3.实现选择功能,不同用户有不同的选择,根据login返回类型确定int choice = person.menu();if(choice < 0 || choice > booklist.getBook().length){System.out.println("非法输入,请重新输入!!!");}else {//通过person引用使用iFuntions这个引用数组下标为choice的类//调用其中的work方法person.iFuntions[choice].work(booklist);}}}
}

相关文章:

Java SE - 图书管理系统模拟实现

目录 1.设计框架2. 实现用户类3.实现书和书架类4.登录界面的实现5.实现menu方法6.测试菜单选择7.实现一个IFun接口7.1 查找功能的实现7.2 展示功能的实现7.3 增加功能的实现7.4 删除功能的实现7.5 退出功能的实现7.6 借阅功能的实现7.7 归还功能的实现 8.实现IFuntion类型的数组…...

华为HN8145V光猫改华为蓝色公版界面,三网通用,xgpon公版光猫

咸鱼只卖20多元一个&#xff0c;还是xgpon的万兆猫&#xff0c;性价比不错哦 除了没有2.5G网口&#xff0c;其他还行。 改成公版光猫后&#xff0c;运营商是无法纳管光猫&#xff0c;无法后台修改光猫数据及超密。 华为 HN8145V 光猫具有以下特点&#xff1a; 性能方面 高速接…...

【ARM 嵌入式 编译系列 7.5 -- GCC 打印链接脚本各段使用信息】

文章目录 Overview1 在 linker script 中定义符号2 编译并生成 ELF 文件3 使用 nm awk 输出各段地址及大小&#xff08;含单位&#xff09;4 实际输出示例5 进阶建议 Overview 在 GCC 编译生成 elf 后 打印出出数据段的开始地址及结束地址&#xff0c;bss 段的开始地址和结束…...

在大数据求职面试中如何回答分布式协调与数据挖掘问题

在大数据求职面试中如何回答分布式协调与数据挖掘问题 场景&#xff1a;小白的大数据求职面试 小白是一名初出茅庐的程序员&#xff0c;今天他来到一家知名互联网公司的面试现场&#xff0c;面试官是经验丰富的老黑。以下是他们之间的对话&#xff1a; 第一轮提问&#xff1…...

小白成长之路--nginx基础配置(一)

文章目录 一、概述1.1 Nginx 特点1.2 Nginx 作用1.3Nginx工作原理 二、Nginx服务搭建2.1安装2.2 目录结构2.3 配置文件作用2.4 nginx,conf配置文件详解2.5 核心命令2.6 Nginx信号三.Nginx3.1启动 总结 一、概述 Nginx 是开源、高性能、高可靠的 Web服务器 和反向代理服务器&am…...

基于 SpringBoot+JSP 的医疗预约与诊断系统设计与实现

摘要 本研究针对传统医疗预约与诊断流程中存在的效率低下、信息不透明、患者等待时间长等问题&#xff0c;设计并实现了一个基于 SpringBootJSP 的医疗预约与诊断系统。系统采用 B/S 架构&#xff0c;整合了用户管理、科室管理、医生排班、预约挂号、在线问诊、检查检验、诊断…...

C++语言发展历程-2025

C语言发展历程-2025 前言 C是一种高级编程语言&#xff0c;由Bjarne Stroustrup于1979年在贝尔实验室创建&#xff0c;是C语言的扩展和改进版。 C从最初的C with class&#xff0c;经历了C98、C03、C11、C 14、C17、C20、C23多次标准化改造&#xff0c;成为一门多范式、高性…...

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系统架构设计 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…...

Python基础之函数

代码仓库地址&#xff1a;gitgithub.com:Liucc-123/python_learn.git 函数介绍 函数是组织好的、可重复使用的&#xff0c;用来实现单一、或相关功能的代码段。 函数可以提高应用的模块性和代码的可重复性。python 有许多内置的函数比如 print 打印函数&#xff0c;python 也…...

Python异步爬虫编程技巧:从入门到高级实战指南

Python异步爬虫编程技巧&#xff1a;从入门到高级实战指南 &#x1f680; &#x1f4da; 目录 前言&#xff1a;为什么要学异步爬虫异步编程基础概念异步爬虫核心技术栈入门实战&#xff1a;第一个异步爬虫进阶技巧&#xff1a;并发控制与资源管理高级实战&#xff1a;分布式…...

Redis哨兵模式深度解析与实战部署

Redis哨兵模式深度解析与实战部署 文章目录 Redis哨兵模式深度解析与实战部署一、Redis哨兵模式理论架构详解1.1 哨兵模式的核心架构组成基础架构拓扑图 1.2 哨兵节点的核心功能模块1.2.1 监控模块&#xff08;Monitoring&#xff09;1.2.2 决策模块&#xff08;Decision Makin…...

【软考高级系统架构论文】论边缘计算及其应用

论文真题 边缘计算是在靠近物或数据源头的网络边缘侧,融合网络、计算、存储、应用核心能力的分布式开放平台(架构),就近提供边缘智能服务。边缘计算与云计算各有所长,云计算擅长全局性、非实时、长周期的大数据处理与分析,能够在长周期维护、业务决策支撑等领域发挥优势;…...

触摸屏(典型 I2C + Input 子系统设备)从设备树解析到触摸事件上报

触摸屏&#xff08;典型 I2C Input 子系统设备&#xff09;从设备树解析到触摸事件上报 以下是架构图&#xff0c;对触摸屏&#xff08;典型I2C Input子系统设备&#xff09;从设备树解析到触摸事件上报的全流程详细拆解&#xff0c;包含文字讲解和配套流程图&#xff1a; 注…...

Java中==与equals()方法的深度解析

作为Java后端开发者&#xff0c;我们经常会遇到需要比较两个对象是否相等的情况。在Java中&#xff0c;运算符和equals()方法都可以用于比较&#xff0c;但它们之间存在着本质的区别。 1. 运算符 是一个比较运算符&#xff0c;它的行为取决于比较的类型&#xff1a; 1.1 比较…...

qt常用控件--02

文章目录 qt常用控件--02toolTip属性focusPolicy属性styleSheet属性补充知识点按钮类控件QPushButton 结语 很高兴和大家见面&#xff0c;给生活加点impetus&#xff01;&#xff01;开启今天的编程之路&#xff01;&#xff01; 今天我们进一步c11中常见的新增表达 作者&…...

AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法(一)

环境&#xff1a; AI-Sphere-Butler VBCABLE2.1.58 Win10专业版 豆包桌面版1.47.4 ubuntu22.04 英伟达4070ti 12G python3.10 问题描述&#xff1a; AI-Sphere-Butler之如何将豆包桌面版对接到AI全能管家~新玩法&#xff08;一&#xff09; 聊天视频&#xff1a; AI真…...

为什么android要使用Binder机制

1.linux中大多数标准 IPC 场景&#xff08;如管道、消息队列、ioctl 等&#xff09;的进程间通信机制 ------------------ ------------------ ------------------ | 用户进程 A | | 内核空间 | | 用户进程 B | | (User Spa…...

Apache SeaTunnel Flink引擎执行流程源码分析

目录 1. 任务启动入口 2. 任务执行命令类:FlinkTaskExecuteCommand 3. FlinkExecution的创建与初始化 3.1 核心组件初始化 3.2 关键对象说明 4. 任务执行:FlinkExecution.execute() 5. Source处理流程 5.1 插件初始化 5.2 数据流生成 6. Transform处理流程 6.1 插…...

XML读取和设置例子

在Qt C中&#xff0c;可以使用Qt的 QDomDocument类来读取、更新和保存XML文件。这个类提供了对XML文档的强大操作能力&#xff0c;支持通过DOM&#xff08;文档对象模型&#xff09;对XML进行读取、修改、添加和删除节点等操作。 下面是一个详细的例子&#xff0c;演示如何在Qt…...

数据标注师学习内容

目录 文本标注词性标注实体标注 图像标注语音标注 文本标注 词性标注 第一篇 第二篇 实体标注 点击这里 关系标注 事件标注 意图标注 关键词标注 分类标注 问答标注 对话标注 图像标注 拉框标注 关键点标注 2D标注 3D标注 线标注 目标跟踪标注 OCR标注 图像分类标注 语音…...

如何实现财务自由

如果有人告诉你&#xff0c;普通人也可以在5到10年内&#xff0c;而不是40到50年后实现财务自由、彻底退休&#xff0c;你会不会觉得对方在开玩笑&#xff1f;但这并非天方夜谭&#xff0c;《百万富翁快车道》的作者MJ德马科就是成功案例。他曾和多数人一样做底层工作&#xff…...

一些想法。。。

1.for里面的局部变量这种还是在for里面定义比较好 比如 for(int i 0;i<n;i){ int num; cin>>num; } 实不相瞒&#xff0c;有一次直接cin了i怎么都没看出来哪里错了。。。 2.关于long long 如果发现中间结果大约是10^9&#xff0c;就要考虑int 溢出 即用 long …...

基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架

基于分布式部分可观测马尔可夫决策过程与联邦强化学习的低空经济智能协同决策框架 摘要: 低空经济作为新兴战略产业,其核心场景(如无人机物流、城市空中交通、低空监测)普遍面临环境动态性强、个体观测受限、数据隐私敏感及多智能体协同复杂等挑战。本文创新性地提出一种深…...

github常用插件

一&#xff0c;文档辅助阅读系列&#xff1a;自动化wiki处理 1&#xff0c;deepwiki https://deepwiki.com/ 将我们看不懂的官方code文档转换为wiki&#xff0c;更加便于理解。 其实能够翻阅的仓库很有限&#xff0c;比如说&#xff1a; 但是有很多仓库并没有index&#xff…...

python3字典

1 字典简介 字典是一种可变容器模型&#xff0c;且可存储任意类型对象。字典每个基本元素都包括两个部分&#xff1a; 键&#xff08;key&#xff09;和键对应的值&#xff08;value&#xff09; 每个键值 key>value 对用冒号: 分割&#xff0c;每个对之间用逗号(,)分割&am…...

华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践

华为云 FlexusDeepSeek 征文&#xff5c;增值税发票智能提取小工具&#xff1a;基于大模型的自动化信息解析实践 前言背景 企业财务处理中&#xff0c;增值税发票信息手动提取存在效率低、易出错等痛点&#xff0c;华为云 Flexus 弹性算力联合 DeepSeek 大模型&#xff0c;通过…...

[特殊字符] OpenCV opencv_world 模块作用及编译实践完整指南

&#x1f4cc; 什么是 opencv_world 模块&#xff1f; opencv_world 是 OpenCV 官方提供的一个 大型集成动态库。它将 OpenCV 所有启用的模块&#xff08;例如 core, imgproc, highgui, videoio, dnn, photo 等&#xff09;打包到一个单一的动态库文件&#xff08;如 Linux 的…...

目标检测之YOLOv5到YOLOv11——从架构设计和损失函数的变化分析

YOLO&#xff08;You Only Look Once&#xff09;系列作为实时目标检测领域的标杆性框架&#xff0c;自2016年YOLOv1问世以来&#xff0c;已历经十余年迭代。本文将聚焦YOLOv5&#xff08;2020年发布&#xff09;到YOLOv11&#xff08;2024年前后&#xff09;的核心技术演进&am…...

Java的SpringAI+Deepseek大模型实战【二】

文章目录 背景交互方式1、等待式问答2、流式问答 设置角色环绕增强1&#xff09;修改controller2&#xff09;修改配置日志级别 处理跨域 背景 上篇【Java的SpringAIDeepseek大模型实战【一】】搭建起浏览器交互的环境&#xff0c;如何进行流式问答&#xff0c;控制台打印日志…...

OpenCV——霍夫变换

霍夫变换 一、霍夫变换原理二、霍夫线检测2.1、标准霍夫变换2.2、概率霍夫变换 三、霍夫圆检测3.1、霍夫圆检测的原理3.2、霍夫梯度法 一、霍夫变换原理 霍夫变换&#xff08;Hough TRansform&#xff09;是从图像中识别几何图形的基本方法&#xff0c;由Paul Hough于1962年提…...

线程池 JMM 内存模型

线程池 & JMM 内存模型 文章目录 线程池 & JMM 内存模型线程池线程池的创建ThreadPoolExecutor 七大参数饱和策略ExecutorService 提交线程任务对象执行的方法&#xff1a;ExecutorService 关闭线程池的方法&#xff1a;线程池最大线程数如何确定&#xff1f; volatile…...

PillarNet: Real-Time and High-PerformancePillar-based 3D Object Detection

​ECCV 2022 paper&#xff1a;[2205.07403] PillarNet: Real-Time and High-Performance Pillar-based 3D Object Detection&#xfeff; code&#xff1a;https://github.com/VISION-SJTU/PillarNet-LTS&#xfeff; 纯点云基于pillar3D检测模型 网络比较 SECOND 基于vo…...

配电抢修场景案例

以配电抢修场景为例来展示关键业务活动。配电抢修愿景分成业务逻辑、业务活动、业务特征、技术支撑、KPI五个层次&#xff0c;分别从策略、执行、评价、资源、协同5个方面描述配电抢修愿景的关键业务活动。...

H5新增属性

✅ 一、表单相关新增属性&#xff08;Form Attributes&#xff09; 这些属性增强了表单功能&#xff0c;提升用户体验和前端验证能力。 1. placeholder 描述&#xff1a;在输入框为空时显示提示文本。示例&#xff1a; <input type"text" placeholder"请输…...

C# Task 模式实现 Demo(含运行、暂停、结束状态)

下面是一个完整的 C# Task 实现示例&#xff0c;包含运行(Running)、暂停(Paused)和结束(Completed)状态控制&#xff1a; 1. 基本实现&#xff08;使用 CancellationToken 控制&#xff09; using System; using System.Threading; using System.Threading.Tasks;public cla…...

Docker健康检查

目录 1.命令 2.验证 1.命令 docker run -itd --name nginx -v data:/etc/nginx/ -v log:/var/log/ -p 8080:80 \ --health-cmd"curl http://127.0.0.1:80" \ --health-interval30s \ --health-timeout5s \ --health-retries3 \ --health-start-period18s \ nginx:…...

Linux笔记---线程控制

1. 线程创建&#xff1a;pthread_create() pthread_create() 是 POSIX 线程库&#xff08;pthread&#xff09;中用于创建新线程的函数。调用该函数后系统就会启动一个与主线程并发的线程&#xff0c;并使其跳转到入口函数处执行。 #include <pthread.h>int pthread_cr…...

【AI论文】扩展大型语言模型(LLM)智能体在测试时的计算量

摘要&#xff1a;扩展测试时的计算量在提升大型语言模型&#xff08;LLMs&#xff09;的推理能力方面已展现出显著成效。在本研究中&#xff0c;我们首次系统地探索了将测试时扩展方法应用于语言智能体&#xff0c;并研究了该方法在多大程度上能提高其有效性。具体而言&#xf…...

Spring--IOC容器的一些扩展属性

一、BeanFactoryPostProcessor和BeanPostProcessor BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性 BeanPostProcessor的作用是在bean完成创建实例、填充属性之后&#xff0c;初始化阶段的前后都会对bean进行操作&#xff0c;使用postProcessBeforeIni…...

WebClient 功能介绍,使用场景,完整使用示例演示

WebClient 功能介绍 WebClient 是 Spring 5 中引入的响应式 HTTP 客户端&#xff0c;用于替代已弃用的 RestTemplate&#xff0c;专为异步非阻塞编程设计&#xff0c;基于 Reactor 框架实现。其核心功能包括&#xff1a; 异步与非阻塞 通过 Mono 和 Flux 处理请求与响应&#…...

[Java 基础]ArrayList

ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制。 ArrayList 的示意可以看 VCR&#xff1a;https://visualgo.net/en/array 创建 ArrayList 对象 final ArrayList<String> strings new ArrayList<>();这里创建 …...

用无人机和AI守护高原净土:高海拔自然保护区的垃圾检测新方法

这篇题为《Automatic Detection of Scattered Garbage Regions Using Small Unmanned Aerial Vehicle Low-Altitude Remote Sensing Images for High-Altitude Natural Reserve Environmental Protection》的论文&#xff0c;发表于 Environmental Science & Technology&am…...

《Redis高并发优化策略与规范清单:从开发到运维的全流程指南》

Redis高并发优化策略与规范清单&#xff1a;从开发到运维的全流程指南 在互联网应用的后端架构中&#xff0c;Redis凭借其高性能、高并发的特性&#xff0c;成为缓存和数据存储的首选方案。无论是电商抢购、社交平台的点赞计数&#xff0c;还是在线旅游平台的实时数据查询&…...

Linux基本指令篇 —— man指令

man命令是Linux系统中最重要的命令之一&#xff0c;它是"manual"&#xff08;手册&#xff09;的缩写&#xff0c;用于查看Linux系统中命令、函数、配置文件等的详细说明文档。man命令是Linux系统管理员和开发者的必备工具&#xff0c;熟练掌握man命令可以大大提高工…...

Spring Boot使用MCP服务器

1、JDK版本17 2、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apac…...

学习Linux进程冻结技术

原文&#xff1a;蜗窝科技Linux进程冻结技术 功耗中经常需要用到&#xff0c;但是linux这块了解甚少&#xff0c;看到这个文章还蛮适合我阅读的 1 什么是进程冻结 进程冻结技术&#xff08;freezing of tasks&#xff09;是指在系统hibernate或者suspend的时候&#xff0c;将…...

Docker基本概念——AI教你学Docker

1.1 Docker 概念详解 1. Docker 是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;它让开发者可以将应用及其依赖打包到一个可移植的容器&#xff08;Container&#xff09;中&#xff0c;并在任何支持 Docker 的 Linux、Windows 或 macOS 系统上运行。这样做…...

第十六届蓝桥杯C/C++程序设计研究生组国赛 国二

应该是最后一次参加蓝桥杯比赛了&#xff0c;很遗憾&#xff0c;还是没有拿到国一。 大二第一次参加蓝桥杯&#xff0c;印象最深刻的是居然不知道1s是1000ms&#xff0c;花了很多时间在这题&#xff0c;后面节奏都乱了&#xff0c;抗压能力也不行&#xff0c;身体也不适。最后…...

Python 数据分析与可视化 Day 5 - 数据可视化入门(Matplotlib Seaborn)

&#x1f3af; 今日目标 掌握 Matplotlib 的基本绘图方法&#xff08;折线图、柱状图、饼图&#xff09;掌握 Seaborn 的高级绘图方法&#xff08;分类图、分布图、箱线图&#xff09;熟悉图像美化&#xff08;标题、标签、颜色、风格&#xff09;完成一组学生成绩数据的可视化…...

WebRTC(八):SDP

SDP 概念 SDP 是一种描述多媒体通信会话的文本格式&#xff08;基于 MIME&#xff0c;RFC 4566&#xff09;。本身 不传输数据&#xff0c;仅用于在会话建立阶段传递信息。常与 SIP&#xff08;VoIP&#xff09;、RTSP、WebRTC 等协议配合使用。 用途 描述媒体类型&#xf…...