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

[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]

目录

1.想法

2.框架的搭构

2.1图书

2.1.1Book类

2.1.2BookList类

2.2用户

2.2.1User抽象类

2.2.2AdminUser类(管理者)

2.2.3NormalUser

2.3操作

操作接口

借阅操作

删除操作

查询操作

归还图书

展示图书

退出系统

2.4小结

3.主函数的编写

4.操作类的实现

增加图书的实现

借阅图书的实现

删除图书的实现

退出系统的实现

查找图书的实现

归还图书的实现

展示图书的实现

5.代码总览


整体代码在本文最底部

1.想法

首先,关于系统的开发,我们第一步的是搭构整体的框架,再分步实现各个具体的功能。

对于这个图书管理系统的开发,我想达到的目的大致为:

用户分为:1.普通用户

                 2.管理者

根据用户分类的不同,我们会有相不同的菜单展示。菜单上展示有编号的操作供选择,根据选择的编号调用相应的操作。

每一本书的属性分为:书名,作者,价格,类型,借阅状态。

创建一个数组作为书架,存放书。

2.框架的搭构

创建三个包,分类好。因为我们从上面的导图中可以看出,此系统分为三个大类再相互调用链接。

2.1图书

2.1.1Book类

对于图书,我们要先创建一个类,定义其属性。

package book;public class Book {private String name;//书名private String author;//作者private int price;//价格,此处定义为整数,可以自行决定private String type;//类型private boolean isBorrow;//借阅状态//写出相应的构造方法,因为后续我们要添加书,需要有传参的操作//借阅状态在创建书的时候就不用放进去了,boolean默认值为false我们可以将其认定为‘未借阅’public Book(String name, String author, int price, String type){   this.name = name;this.author = author;this.price = price;this.type = type;}//因为成员属性都用private修饰符进行了封装,相应的创建出setter与getterpublic 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 isBorrow() {return isBorrow;}public void setBorrow(boolean borrow) {isBorrow = borrow;}public String toString() {return "Book{" +"name='" + name + '\'' +", author='" + author + '\'' +", price=" + price +", type='" + type + '\'' +(isBorrow ? ", 已借阅" : ", 未借阅") + isBorrow +'}';}
}

2.1.2BookList类

package book;public class BookList {//我们之前创建了一个Book类型,代表一本书//此处我们就可以创建Book[]类型的数组,代表数组中每一个元素都为Book类型,//即每一个元素都能代表一本书private Book[] books = new Book[10];//引用名为books,暂定能存放为10本private int useSize;//创建一个引用存放书架上存放的图书数量//我们可以提前将图书放进去public BookList() {//BookList的构造方法,到时候创建BookList对象的时候会调用,生成三本书。books[0] = new Book("三国演义","罗贯中",19,"小说");books[1] = new Book("西游记","吴承恩",29,"小说");books[2] = new Book("水浒传","施耐庵",8,"小说");this.useSize = 3;}//Book[]和useSize的setter与getter//public Book[] getBooks() {//    return books;//}public Book getBooks(int pos) {return books[pos];}//public void setBooks(Book[] books) {//    this.books = books;//}public void setBooks(int pos,Book books) {this.books[pos] = books;}public int getUseSize() {return useSize;}public void setUseSize(int useSize) {this.useSize = useSize;}
}

2.2用户

对于用户,在屏幕前的人选择之前,我们是无法得知下一步要选择的类型是哪一个。这时候我们就可以运用上我们的抽象类。抽象类规定了每个用户下一定具有的成员,此外子类还可以根据作为不同的用户类型来构建新的专属的成员/成员方法。

所以第一步

2.2.1User抽象类

package user;public abstract class User {protected String name;//用户名//构造方法public User(String name) {this.name = name;}//打印菜单public abstract int menu();
}

2.2.2AdminUser类(管理者)

package user;import java.util.Scanner;public class AdminUser extends User{//构造方法,要先构造父类的public AdminUser(String name) {super(name);}//每一个用户类型都要有不同的菜单//管理者菜单为:public int menu() {System.out.println("管理员菜单!");System.out.println("****************************");System.out.println("hello " + this.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;//返回功能编号}
}

2.2.3NormalUser

package user;import java.util.Scanner;public class NormalUser extends User{//构造方法public NormalUser(String name) {super(name);}//普通用户的菜单public int menu() {System.out.println("普通用户的菜单!");System.out.println("****************************");System.out.println("hello " + this.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;}
}

2.3操作

对于操作,我们可以创建一个接口来规范方法。因为我们不知道具体调用的是哪一个方法,通过接口来达到类似于继承的状态。

因为所有操作都是对书架上的书进行操作,所以参数上均为书架

此环节只是搭构框架,所以方法均没有实现,再后文中会逐一实现。

操作接口

package operation;import book.BookList;public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {//重写接口的方法System.out.println("新增图书");}
}

借阅操作

package operation;import book.BookList;public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");}
}

删除操作

package operation;import book.BookList;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");}
}

查询操作

package operation;import book.BookList;public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查询图书");}
}

归还图书

package operation;import book.BookList;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");}
}

展示图书

package operation;import book.BookList;public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示图书");}
}

退出系统

package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");}
}

2.4小结

到了此处,我们已经把框架搭构完毕了,剩下的就是靠方法将他们联系起来构成一个整体

3.主函数的编写

因为我们还不知道要怎么将这一堆类链接起来,所以我们可以先试着写主函数。从头开始走一遍,查缺补漏。

第一步,我们创建的用户的登录方法,根据选择的不同可以创建不同的用户类型对象并接收。

import user.AdminUser;
import user.NormalUser;
import user.User;import java.util.Scanner;public class Test {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(choice == 1){//如果选择1,创建管理者对象return new AdminUser(name);}else{//如果选择0,创建普通用户对象return new NormalUser(name);}//在类中创建了一个对象,请问我们怎么得知创建的是普通用户还是管理者呢??//这时候我们就需要把这个方法的返回值设为‘User’,再将新建出的对象返回接收就好了}public static void main(String[] args) {//第一步,要做的是用户登录,输入信息,选择用户类型//我们可以创建一个类名为login来实现User user = login();//创建一个引用来接收新创建的对象,并发生了向上转型,子类对象给父类引用}
}

第二步,人有了,书还没呢。所以我们在主函数中new一个书架对象

在主函数中加上此语句即可。

BookList bookList = new BookList();//新建书架对象,并已经存放了三本书

第三步,我们选择好了用户类型,就该打印不同类型的菜单了。

//第三步,创建菜单while(true){int choice = user.menu();//向上转型,发生动态绑定,产生多态。//虽是通过父类调用方法,得到的是相应子类对象的方法//获取用户选择的操作编号}

第四步,根据所选编号调用相应的操作

我们该怎么根据标号选择相应的方法呢??我们可以创建一个IOperation[]类型的数组,数组中存放的下标对应菜单中的操作编号。

因为我们的操作方法都为IOperation接口的实现方法,所以使用IOperation类型来存放没有问题(其之间的关系可以看成”类继承“)。

既然用户和菜单之间区分了类型,我们存放操作的数组肯定也要根据菜单的不同来区分一二。通过这种想法我们可以在AdminUser类和NormalUser类所继承的抽象类User中,定义一个IOperation[]类型的成员属性。

再分别在两个子类中的构造方法中,创建存放不同操作的数组。

User抽象类,变更为:

package user;import operation.IOperation;public abstract class User {protected String name;//用户名//变更:增加protected IOperation[] iOperations;//定义一个IOperation[]类型,但还没有分配空间//构造方法public User(String name) {this.name = name;}//打印菜单public abstract int menu();}

抽象类多了一个成员属性,相应的在子类的构造方法也要改变

AdminUser的构造方法变更为:

public AdminUser(String name) {super(name);this.iOperations = new IOperation[]{//实例化不同的对象,有了对象才能调用相应的方法new ExitOperation(),new FindOperation(),new AddOperation(),new DelOperation(),new ShowOperation()};}

NormalUser的构造方法变更为:

public NormalUser(String name) {super(name);this.iOperations = new IOperation[]{//分别实例化不同的操作方法new ExitOperation(),new FindOperation(),new BorrowOperation(),new ReturnOperation()};}

此时,我们已经创建了对应的对象,但还没使用方法来调用他。但我们并不知道用户的类型以及要使用的方法是什么,所以我们可以在抽象类User中创建doOperation方法来调用。

User抽象类新增:

public void doOperation(int choice ,BookList bookList){this.iOperations[choice].work(bookList);//调用iOperation[]下标为choice的方法,//每一个元素为IOperation类型,都有接口重写的work方法//这就是接口规范的意义了}
}

在主函数调用方法

    public static void main(String[] args) {BookList bookList = new BookList();//新建书架对象,并已经存放了三本书//第一步,要做的是用户登录,输入信息,选择用户类型//我们可以创建一个类名为login来实现User user = login();//创建一个引用来接收新创建的对象,并发生了向上转型,子类对象给父类引用//第三步,创建菜单while(true){int choice = user.menu();//向上转型,发生动态绑定,产生多态。虽是通过父类调用方法,得到的是相应子类对象的方法//获取用户选择的操作编号user.doOperation(choice,bookList);//根据choice调用对应操作方法}}

目前大致的框架以及构建起来了,剩下的操作逐一实现就可以了。

4.操作类的实现

bookList的getter和setter有所改变,记得回到上面看看噢。

增加图书的实现

思路:创建一个新的Book对象,再存放到bookList中

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class AddOperation implements IOperation {@Overridepublic void work(BookList bookList) {//重写接口的方法System.out.println("新增图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入图书的名字:");String name = scanner.nextLine();System.out.println("请输入图书的作者:");String author = scanner.nextLine();System.out.println("请输入图书的类型:");String type = scanner.nextLine();System.out.println("请输入图书的价格:");int price = scanner.nextInt();//创建新图书对象Book book = new Book(name,author,price,type);//查看图书馆目前的存放数量,再放到末尾int curSize = bookList.getUseSize();bookList.setBooks(curSize,book);//存放到末尾bookList.setUseSize(curSize+1);//数量+1System.out.println("新增完毕");}
}

借阅图书的实现

思路:先获取所要借阅的图书的书名,再根据书名遍历bookList,查看借阅状态,如果为false将相应书的借阅状态改为true。如果没有图书或状态为true(即已被借阅)则返回相应语句提醒且对数组不进行操作。

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class BorrowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("借阅图书");System.out.println("请输入要借阅的图书书名");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int curSize = bookList.getUseSize();for(int i = 0;i < curSize; i++){Book book = bookList.getBooks(i);//创建一个暂时的Book类型引用存放在数组中的元素if(book.getName().equals(name)){//比较书名if(book.getBorrow()){//如果进入则证明已经被借阅System.out.println("此书已被借阅");return;}else{book.setBorrow(true);System.out.println("借阅成功");return;}}}System.out.println("馆内无此书");//循环结束了 则证明没有此书return;}
}

删除图书的实现

思路:我们一般在数组中达成删除,就是将后面的元素移位到要删除的数组的下标位置上进行覆盖,达到删除的效果。所以我们先获取要删除的书名,遍历,找到相应的下标位置,将下标往后的元素全部向前移动一位,再将原本的数组最后一位置空,且图书数量-1。找不到则返回相应语句

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class DelOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("删除图书");System.out.println("请输入要删除的书名");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();//遍历找书int curSize = bookList.getUseSize();int index = 0;int i = 0;for(i = 0; i < curSize; i++){Book book = bookList.getBooks(i);if(book.getName().equals(name)){System.out.println("已找到相应图书,正在进行删除");index = i;//获取下标break;}}//判断循环结束的原因if(i == curSize){//如果已经将图书全部遍历一遍System.out.println("没有要删除的图书");return;}for(int j = index; i < curSize - 1; j++){//最后一位不用移动,后面之间置空Book book = bookList.getBooks(i+1);//得到下标i+1的图书bookList.setBooks(i,book);//把i+1放到i进行覆盖}bookList.setBooks(curSize,null);//最后一位置空,因为我们已经整体往前移动了一位bookList.setUseSize(curSize-1);//总数-1return;}
}

退出系统的实现

直接退出就行,也可以在主函数进行break跳出while循环再retur结束

package operation;import book.BookList;public class ExitOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("退出系统");System.exit(0);}
}

查找图书的实现

思路:根据书名,遍历

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class FindOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("查询图书");System.out.println("请输入书名");Scanner scanner = new Scanner(System.in);String name = scanner.nextLine();int curSize = bookList.getUseSize();//获取长度for(int i = 0; i < curSize; i++){Book book = bookList.getBooks(i);if(book.getName().equals(name)){//找到了,打印,使用book的toStringSystem.out.println("已找到,如下:");System.out.println(book.toString());return;}}System.out.println("没有此书");}
}

归还图书的实现

思路:和借阅的想法差不多,只要查看其状态再更改就好了。

package operation;import book.Book;
import book.BookList;import java.util.Scanner;public class ReturnOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("归还图书");Scanner scanner = new Scanner(System.in);System.out.println("请输入书名");String name = scanner.nextLine();int curSize = bookList.getUseSize();for(int i = 0; i < curSize; i++){Book book = bookList.getBooks(i);if(book.getName().equals(name)){if(book.getBorrow()){//进入if证明为true,即已被借阅book.setBorrow(false);System.out.println("归还成功");}else{System.out.println("此书不用归还");}}}System.out.println("没有要归还的书");return;}
}

展示图书的实现

思路:遍历再打印即可

package operation;import book.Book;
import book.BookList;public class ShowOperation implements IOperation{@Overridepublic void work(BookList bookList) {System.out.println("展示图书");int curSize = bookList.getUseSize();for(int i = 0; i < curSize; i++){Book book = bookList.getBooks(i);System.out.println(book);}return;}
}

5.代码总览

图书管理系统 · 28b2ad4 · Pigee1228/JAVA记录 - Gitee.com

相关文章:

[JAVA]一步接一步的一起开发-图书管理系统(非常仔细,你一定能看懂)[1W字+]

目录 1.想法 2.框架的搭构 2.1图书 2.1.1Book类 2.1.2BookList类 2.2用户 2.2.1User抽象类 2.2.2AdminUser类&#xff08;管理者&#xff09; 2.2.3NormalUser 2.3操作 操作接口 借阅操作 删除操作 查询操作 归还图书 展示图书 退出系统 2.4小结 3.主函数的编…...

大数据周会-本周学习内容总结07

目录 01【hadoop】 1.1【编写集群分发脚本xsync】 1.2【集群部署规划】 1.3【Hadoop集群启停脚本】 02【HDFS】 2.1【HDFS的API操作】 03【MapReduce】 3.1【P077- WordCount案例】 3.2【P097-自定义分区案例】 历史总结 01【hadoop】 1.1【编写集群分发脚本xsync】…...

搭建一个双系统个人服务器

搭建一个双系统个人服务器0.前言一、双系统安装1.磁盘划分2.windows安装3.ubuntu安装二、系统启动项美化&#xff1a;1. refind引导2. 美化 grub 界面三、系统代理0.前言 年后找了份工作&#xff0c;忙于适应新环境所以更新也减缓了&#xff0c;最近闲暇时间给个人电脑进行了整…...

电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇

说到“按住电源键强制关机”的操作&#xff0c;想必大家都不会陌生&#xff0c;毕竟在电脑蓝屏或者电脑死机的时候&#xff0c;我们总是束手无策。而且&#xff0c;身边的人在遇到同样的情况时&#xff0c;往往都是选择长按电源键强制关机&#xff0c;所以当我们遇到同样的情况…...

Linux:centos内核优化详解

一、系统内核部分设置在以下文件 vim /etc/sysctl.conf 1.禁用IPV6 net.ipv6.conf.all.disable_ipv6 1 # 禁用整个系统所有接口的IPv6 net.ipv6.conf.default.disable_ipv6 1 net.ipv6.conf.lo.disable_ipv6 1 # 禁用某一个指定接口的IPv6(此处为:lo) 理想情况下&#xff0c…...

链表经典OJ题合集(包含带环问题,相交问题,随机指针复制等,附动画讲解)

目录 一&#xff1a;前言 二&#xff1a;简单题目 (1)移除链表元素 (2)反转链表 (3)找链表的中间结点 (4)输入一个链表&#xff0c;输出该链表中倒数第k个结点 (5)合并两个有序链表 (6)相交链表 (7)判断链表是否带环 三&#xff1a;较难题目 (1)链表分割 (2)判断链表是否为回…...

CSS新增

系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录什么是 CSS3渐进增强和优雅降级CSS3 中的选择器CSS3 中的背景CSS3 中的边框CSS3 中的文本效果CSS3 中的字体 font-face什么是 CSS3 CSS3是CSS&#xff08;层叠样式表&#xff09;技术的升级版…...

奇安信_防火墙部署_透明桥模式

奇安信_防火墙部署_透明桥模式一、预备知识二、项目场景三、拓扑图四、基本部署配置1. 登录web控制台2.连通性配置3.可信主机配置4.授权导入5.特征库升级6.安全配置文件五、透明桥配置1. 创建桥2. 端口绑定桥3. 创建桥端口六、结语一、预备知识 安全设备接入网络部署方式 二、…...

C语言——字符串函数(2)和内存函数

(一)strtok函数dilimiters参数是个字符串&#xff0c;定义了用作分隔符的字符集合第一个参数指定一个字符串&#xff0c;它包含了0个或者多个由dilimiters字符串中一个或者多个分隔符分割的标记。strtok函数找到str中的下一个标记&#xff0c;并将其用 \0 结尾&#xff0c;返回…...

第1节 线性回归模型

1. 模型概述 对于收集到的数据(xi,yi)(x_i,y_i)(xi​,yi​)&#xff0c;建立线性回归模型yiθTxiεi(1)y_i\theta^{^T} x_i \varepsilon_i (1)yi​θTxi​εi​(1) 需要估计的参数为θT\theta^{^T}θT&#xff0c;我们的目的是让估计的参数θT\theta^{^T}θT和xix_ixi​…...

CodeGeeX 130亿参数大模型的调优笔记:比FasterTransformer更快的解决方案

0x0 背景 相信大家都使用或者听说过github copilot这个高效的代码生成工具。CodeGeeX类似于github copilot&#xff0c;是由清华大学&#xff0c;北京智源研究院&#xff0c;智谱AI等机构共同开发的一个拥有130亿参数的多编程语言代码生成预训练模型。它在vscode上也提供了插件…...

Linux驱动之并发与竞争

文章目录并发与竞争的概念原子操作原子整形操作 API 函数原子位操作 API 函数自旋锁自旋锁简介自旋锁结构体自旋锁 API 函数自旋锁的注意事项读写自旋锁读写自旋锁的API顺序锁顺序锁的APIRCU(Read-Copy-Update)RCU的API信号量信号量API互斥体互斥体的API完成量(Completion)完成…...

【密码学复习】第四讲分组密码(三)

AES算法的整体结构 AES算法的轮函数 1&#xff09;字节代换&#xff08;SubByte&#xff09; 2&#xff09;行移位&#xff08;ShiftRow&#xff09; 3&#xff09;列混合&#xff08;MixColumn&#xff09; 4&#xff09;密钥加&#xff08;AddRoundKey&#xff09;1-字节代换…...

JVM(内存划分,类加载,垃圾回收)

JVMJava程序&#xff0c;是一个名字为Java 的进程&#xff0c;这个进程就是所说的“JVM”1.内存区域划分JVM会先从操作系统这里申请一块内存空间&#xff0c;在这个基础上再把这个内存空间划分为几个小的区域在一个JVM进程中&#xff0c;堆和方法区只有一份&#xff1b;栈和程序…...

工作中遇到的问题 -- 你见过哪些写的特别好的代码

strPtr : uintptr((*(*stringStruct)(unsafe.Pointer(&str))).str)代码解析&#xff1a; 这是一段 Go 代码&#xff0c;它的作用是获取一个字符串变量 str 的底层指针&#xff0c;即字符串数据的起始地址。 这段代码涉及到了 Go 语言中的指针、类型转换和内存布局等概念&…...

基于chatGPT设计卷积神经网络

1. 简介 本文主要介绍基于chatGPT&#xff0c;设计一个针对骁龙855芯片设计的友好型神经网络。 提问->跑通总共花了5min左右&#xff0c;最终得到的网络在Cifar100数据集上与ResNet18的精度对比如下。 模型flopsparamstrain acc1/5test acc1/5ResNet18(timm)1.8211.18~98…...

java.sql.Date和java.util.Date的区别

参考答案 java.sql.Date 是 java.util.Date 的子类java.util.Date 是 JDK 中的日期类&#xff0c;精确到时、分、秒、毫秒java.sql.Date 与数据库 Date 相对应的一个类型&#xff0c;只有日期部分&#xff0c;时分秒都会设置为 0&#xff0c;如&#xff1a;2019-10-23 00:00:0…...

动态规划---线性dp和区间dp

动态规划(三) 目录动态规划(三)一&#xff1a;线性DP1.数字三角形1.1数字三角形题目1.2代码思路1.3代码实现(正序and倒序)2.最长上升子序列2.1最长上升子序列题目2.2代码思路2.3代码实现3.最长公共子序列3.1最长公共子序列题目3.2代码思路3.3代码实现4.石子合并4.1题目如下4.2代…...

常见的2D与3D碰撞检测算法

分离轴分离轴定理&#xff08;Separating Axis Theorem&#xff09;是用于解决2D或3D物体碰撞检测问题的一种方法。其基本思想是&#xff0c;如果两个物体未发生碰撞&#xff0c;那么可以找到一条分离轴&#xff08;即一条直线或平面&#xff09;&#xff0c;两个物体在该轴上的…...

STM32 10个工程篇:1.IAP远程升级(二)

一直提醒自己要更新CSDN博客&#xff0c;但是确实这段时间到了一个项目的关键节点&#xff0c;杂七杂八的事情突然就一涌而至。STM32、FPGA下位机代码和对应Labview的IAP升级助手、波形设置助手上位机代码笔者已经调试通过&#xff0c;因为不想去水博客、凑数量&#xff0c;复制…...

Unity+ChatGpt的联动 AICommand

果然爱是会消失的&#xff0c;对吗 chatGpt没出现之前起码还看人家的文章&#xff0c;现在都是随便你。 本着师夷长技以制夷的思路&#xff0c;既然打不过&#xff0c;那么我就加入 github地址&#xff1a;https://github.com/keijiro/AICommand 文档用chatGpt翻译如下&#…...

STM-32:按键控制LED灯 程序详解

目录一、基本原理二、接线图三、程序思路3.1库函数3.2程序代码注&#xff1a;一、基本原理 左边是STM322里电路每一个端口均可以配置的电路部分&#xff0c;右边部分是外接设备 电路图。 配置为 上拉输入模式的意思就是&#xff0c;VDD开关闭合&#xff0c;VSS开关断开。 浮空…...

北邮22信通:(8)实验1 题目五:大整数加减法(搬运官方代码)

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 上一篇文章&#xff1a; 北邮22信通&#xff1a;&#xff08;7&#xff09;实验1 题目四&#xff1a;一元多项式&#xff08;节省内存版&#xff09;_青山如…...

Fiddler抓取https史上最强教程

有任何疑问建议观看下面视频 2023最新Fiddler抓包工具实战&#xff0c;2小时精通十年技术&#xff01;&#xff01;&#xff01;对于想抓取HTTPS的测试初学者来说&#xff0c;常用的工具就是fiddler。 但是初学时&#xff0c;大家对于fiddler如何抓取HTTPS难免走歪路&#xff…...

STM32开发基础知识入门

C语言基础 位操作 对基本类型变量可以在位级别进行操作。 1) 不改变其他位的值的状况下&#xff0c;对某几个位进行设值。 先对需要设置的位用&操作符进行清零操作&#xff0c;然后用|操作符设值。 2) 移位操作提高代码的可读性。 3) ~取反操作使用技巧 可用于对某…...

学习操作系统的必备教科书《操作系统:原理与实现》| 文末赠书4本

使用了6年的实时操作系统&#xff0c;是时候梳理一下它的知识点了 摘要&#xff1a; 本文简单介绍了博主学习操作系统的心路历程&#xff0c;同时还给大家总结了一下当下流行的几种实时操作系统&#xff0c;以及在工程中OSAL应该如何设计。希望对大家有所启发和帮助。 文章目录…...

大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)

在大数据时代&#xff0c;数据挖掘是最关键的工作。大数据的挖掘是从海量、不完全的、有噪声的、模糊的、随机的大型数据库中发现隐含在其中有价值的、潜在有用的信息和知识的过程&#xff0c;也是一种决策支持过程。其主要基于人工智能&#xff0c;机器学习&#xff0c;模式学…...

【数据结构】详解二叉树与堆与堆排序的关系

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;别人可以拷贝我的模式&#xff0c;但不能拷贝我不断往前的激情 &#x1f6f8;C语言专栏&#xff1a;https://blog.csdn.net/vhhhbb/category_12174730.html &#x1f680;数据结构专栏&#xff…...

【Pandas】数据分析入门

文章目录前言一、Pandas简介1.1 什么是Pandas1.2 Pandas应用二、Series结构2.1 Series简介2.2 基本使用三、DataFrame结构3.1 DataFrame简介3.2 基本使用四、Pandas-CSV4.1 CSV简介4.2 读取CSV文件4.3 数据处理五、数据清洗5.1 数据清洗的方法5.2 清洗案例总结前言 大家好&…...

【c++】:list模拟实现“任意位置插入删除我最强ƪ(˘⌣˘)ʃ“

文章目录 前言一.list的基本功能的使用二.list的模拟实现总结前言 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0…...

游戏网站开发目的/潍坊在线制作网站

/************************************************************************ busybox reboot 无效* 说明&#xff1a;* 最近调传感器&#xff0c;使用的ssh连接设备&#xff0c;调完程序发现reboot命令无效&#xff0c;后来* 经过使用uart口看启动过程…...

linux wordpress 中文/优化疫情防控措施

研究了四天linux内核移植和文件系统制作&#xff0c;总算移植成功&#xff0c;在这里和大家分享一下&#xff0c;我是一个初学者&#xff0c;有不对的地方&#xff0c;请大家指点。参考网友的资料&#xff1a;http://blog.chinaunix.net/u3/104564/sho ... 91186.htmlhttp://ww…...

工信部网站登陆/市场seo是什么

自定义一个ViewGroup的首要任务就是要定义测量逻辑&#xff0c;让ViewGroup知道自己的大小&#xff0c;才能在屏幕上展示出来。 根据上面的分析得出&#xff1a; 当图片只有一张的时候&#xff0c;整个ViewGroup的大小和负责显示图片的ImageView是一样大的。这个大小可以根据图…...

南京营销型网站建设/bt种子磁力搜索

我发现了这个程序http://baiyunmanor.com/blog/work/get-current-date-time-in-dos-batch-file/但是我不知道那行是什么:: datetime.bat到底是什么意思&#xff1f;在实践中&#xff0c;::是一个标签(也有可能不准确地用注释标签广为人知)&#xff0c;就像REM一样&#xff0c;它…...

wordpress文章导入插件/百度风云榜小说排行榜历届榜单

在文章的开头&#xff0c;先说下NPE问题&#xff0c;NPE问题就是&#xff0c;我们在开发中经常碰到的NullPointerException.假设我们有两个类&#xff0c;他们的UML类图如下图所示 在这种情况下&#xff0c;有如下代码 user.getAddress().getProvince();这种写法&#xff0c;在…...

ftp服务器搭建设置网站信息/企业网站模板图片

收集一些有用的博客&#xff0c;造福全人类&#xff1a; http://fullstack.info/ 不知道是谁&#xff0c;好像很吊的样子http://substack.net/ substack nodejs大神&#xff0c;贡献了几百个nodejs模块http://blog.izs.me/ nodejs巨屌http://lucumr.pocoo.org/ Flask作者http:…...