图书管理系统 数据结构先导课暨C语言大作业复习 | JorbanS
问题描述
读取给定的图书文件book.txt中的信息(book.txt中部分图书信息如下图所示),完成一个图书信息管理系统,该系统的各个功能模块要求利用菜单选项进行选择。
系统功能要求
图书浏览
读取book.txt中的文件信息并依次输出所有图书信息(书号、书名、价格),包括文件前两行的标题说明信息。
图书统计
统计book.txt中的图书总数n并输出。
图书插入
根据指定的位置i(1≤i≤n+1)和给定的一本图书信息,将该图书插入到位置i,并将变化后的图书信息回写到book.txt。
图书删除
根据指定的位置i(1≤i≤n),删除该位置上的图书信息,并将变化后的图书信息回写到book.txt。
图书查找
① 按位置进行查找:根据输入的位置i(1≤i≤n),查找位置i上的图书信息并输出;
② 按书名进行查找:根据输入的书名,查找该图书的信息并输出(如果有多本,则全部输出)。
价格更新
将价格小于45元的图书价格提高20%,价格大于等于45元的图书价格提高10%,将修改后的图书信息重新写入新文件book-newprice.txt中。
价格排序
按图书价格升序排序,将排序后的图书信息重新写入新文件book-newsort.txt中。
逆序存储
将book.txt中的全部图书逆序存储(即最后一本置于原第一本位置)写入新文件book-newinverse.txt中。
【数据结构要求】
图书数据类型的定义需要采用数据结构教材(参考文献[1])24页中的顺序表类型定义方式,如下所示。
算法实现要求
正确性
在合理的数据输入下,能够在有限的运行时间内得到正确的结果。
可读性
程序结构清晰,易于理解,程序要求具有规范的缩进格式,关键语句添加适当的注释,变量或函数名等标识符按照见名知义的原则命名。
健壮性
当输入的数据非法时,能适当地做出正确反应或进行相应处理,而不会产生一些莫名其妙的输出结果。例如,查找不到时给出“图书不存在,查找失败”的提示,插入或删除位置非法时给出“指定位置非法”的提示等。
高效性
分析每个算法的时间复杂度和空间复杂度,并确保时间高效和空间高效。
任务选做要求
基于链式存储结构实现上述所有功能,即将图书数据类型的定义改为数据结构教材(参考文献[1])29页中的链表类型定义方式,如下所示。
具体实现时需要将上述定义中的ElemType改为如下定义的Book类型取可,即每一本图书作为链表的一个结点。
typedef struct //图书信息定义
{ char no[20]; //图书ISBNchar name[50]; //图书名字float price; //图书价格
} Book;
参考文献
[1] 严蔚敏, 李冬梅, 吴伟民.数据结构(C语言版)(第2版)双色版.人民邮电出版社, 2021.
[2] 李冬梅, 田紫微.数据结构习题解析与实验指导(第2版).人民邮电出版社, 2022.
[3] C语言教程. https://www.runoob.com/cprogramming/c-tutorial.html.
以下是笔者在同目录下文件 book.txt 生成的随机数据,便于调试
9781334512350 程序设计艺术 89.90
9781344656791 数据库原理 95.80
9781355712402 网络安全入门 99.70
9781366856813 C++高级编程 105.60
9781377912454 深度学习研究 110.50
9781388056865 大数据分析 104.40
9781399112466 游戏开发秘籍 89.30
9781400256917 移动应用设计 97.20
9781411312478 云服务架构 108.10
9781422456929 人工智能未来 115.00
9781433512480 系统集成方法 98.90
9781444656931 前端开发进阶 88.80
9781455712492 3D图形编程 119.70
9781466856943 VR技术实践 129.60
9781477912504 物联网技术 104.50
9781488056955 编译原理简介 95.40
9781499112516 数字设计基础 86.30
9781500256967 软件工程方法 107.20
9781511312528 IT项目管理 96.10
9781522456979 企业网络解决方案 112.00
9781533512530 运算放大器设计 93.90
9781544657011 深度学习框架 92.80
9781555712562 微处理器原理 101.70
9781566857063 数据挖掘技术 109.60
9781577912594 网络编程入门 106.50
9781588057105 机器人技术 105.40
9781599112656 嵌入式系统设计 104.30
9781600257157 量子计算概论 102.20
9781611312678 分布式系统原理 103.10
9781622457109 电路设计基础 101.00
9781633512670 软件测试方法 100.90
9781644657151 无线通信技术 99.80
9781655712712 系统分析与设计 98.70
9781666857253 开源软件应用 97.60
9781677912754 高性能计算 96.50
9781688057305 网站开发实践 95.40
9781699112856 编程语言概览 94.30
9781700257357 安全编程技巧 93.20
9781711312858 计算机图形学 92.10
9781722457409 操作系统原理 91.00
9781733512950 软件架构设计 89.90
9781744657491 互联网金融 88.80
9781755712952 区块链技术 87.70
9781766857493 人工智能伦理 86.60
9781777913054 量子机器学习 85.50
9781788057505 虚拟现实技术 84.40
9781799113156 云计算安全 83.30
9781800257557 网络协议分析 82.20
9781811313058 数据中心设计 81.10
9781822457609 大数据存储 80.00
完整 c o d e code code
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>
#define cls system("cls")
#define endl puts("")
#define title(x) printf("========%s========\n", x)
#define DIR "./book.txt"
#define DIR_NewPrice "./book-newprice.txt"
#define DIR_Inverse "./book-newinverse.txt"
#define DIR_Sort "./book-newsort.txt"typedef struct {char no[20], name[50];float price;
} Book;typedef struct LNode {Book data;struct LNode* next;
} *LinkList;LinkList InitList();
int Read(LinkList L, int Type); // Type = 0 头插法, Type = 1 尾插法
void Write(LinkList L, int Type); // 写入文件
// Type = 0 代表源文件
// Type = 1 代表逆序存储的文件
// Type = 2 代表存储更新的价格
// Type = 3 代表存储按价格顺序的文件
void StoreInverse(LinkList L); // 逆序存储
void Output(LinkList L, int count); // 所有图书输出到屏幕
int Add(LinkList L, int count); // 新增图书
int Erase(LinkList L, int count); // 移除图书
int SearchByID(LinkList L, int count); // 按索引搜索
int SearchByName(LinkList L, int count); // 按书名搜索
void Search(LinkList L, int count); // 搜索
void Update(LinkList L); // 更新书的价格
void Edit(LinkList L, int count); // 图书管理
void Sort(LinkList L, int count); // 按价格排序
void CannotOpenFile(); // 报错:无法打开文件
void CannotCloseFile(); // 报错:无法关闭文件
void CannotAllocateMemory(); // 报错:无法分配内存int main(void) {while (true) {LinkList L = InitList();int count = Read(L, 1);if (count == -1) return 0;int op;do {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t0 > 退出系统");puts("\t\t1 > 图书列表");puts("\t\t2 > 图书管理");puts("\t\t3 > 查找图书");puts("\t\t4 > 逆序存储");puts("\t\t5 > 价格升序");endl;title("==========================================");scanf("%d", &op);} while (op < 0 || op > 6);switch (op) {case 0: // 退出系统cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t\t已退出系统");endl;title("==========================================");return 0;break;case 1: // 图书列表Output(L, count);puts("输入任意并回车返回主界面");int op;scanf("%d", &op);break;case 2: // 图书管理Edit(L, count);break;case 3: // 查找图书Search(L, count);break;case 4: // 逆序存储StoreInverse(L);break;case 5: // 按价格升序Sort(L, count);break;}}return 0;
}void CannotOpenFile() {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t无法打开文件!");endl;title("==========================================");Sleep(1000);}void CannotCloseFile() {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t无法关闭文件!");endl;title("==========================================");Sleep(1000);}void CannotAllocateMemory() {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t无法分配内存!");endl;title("==========================================");Sleep(1000);}LinkList InitList() {LinkList L = (LinkList)malloc(sizeof(LNode));if (L == NULL) {CannotAllocateMemory();exit(-1);}L->next = NULL;return L;}int Read(LinkList L, int Type) {FILE* fpRead;if ((fpRead = fopen(DIR, "r")) == NULL) {CannotOpenFile();fclose(fpRead);exit(-1);}LinkList last;if (Type == 1) last = L; // 尾插法记录末节点int count = 0;while (!feof(fpRead)) {count ++;LinkList elem = (LinkList)malloc(sizeof(LNode));fscanf(fpRead, "%s%s%f\n", elem->data.no, elem->data.name, &elem->data.price);if (!Type) { // 头插法elem->next = L->next;L->next = elem;} else { // 尾插法last->next = elem;elem->next = NULL;last = elem;}}if (fclose(fpRead)) {CannotCloseFile();exit(-1);}return count;}void Write(LinkList L, int Type) {FILE* fpWrite;if (Type == 0) fpWrite = fopen(DIR, "w");else if (Type == 1) fpWrite = fopen(DIR_Inverse, "w");else if (Type == 2) fpWrite = fopen(DIR_NewPrice, "w");else fpWrite = fopen(DIR_Sort, "w");if (fpWrite == NULL) {CannotOpenFile();exit(-1);}for (LinkList elem = L->next; elem != NULL; elem = elem->next) {float Now = elem->data.price;if (Type == 2) {if (Now < 45) Now *= 1.2;else Now *= 1.1;}fprintf(fpWrite, "%s %s %.2f\n", elem->data.no, elem->data.name, Now);}if (fclose(fpWrite)) {CannotCloseFile();exit(-1);}}void StoreInverse(LinkList L) {LinkList L2 = (LinkList)malloc(sizeof(LNode));L2->next = NULL;Read(L2, 0);Write(L2, 1);cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t已完成逆序存储");endl;title("==========================================");Sleep(1000);}void Output(LinkList L, int count) {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;printf("一共索引到 %d 条图书记录\n", count);endl;puts("索引 \tISBN\t\t书名\t\t定价");int cnt = 1;for (LinkList elem = L->next; elem != NULL; elem = elem->next, cnt ++) {printf("%2d %s %-18s %5.2lf\n", cnt, elem->data.no, elem->data.name, elem->data.price);}endl;printf("一共索引到 %d 条图书记录\n", count);endl;title("==========================================");}int Add(LinkList L, int count) {int pos;do {Output(L, count);printf("请输入数字 1 ~ %d,作为插入的位置:", count + 1);scanf("%d", &pos);} while (pos < 1 || pos > count + 1);LinkList tmp = (LinkList)malloc(sizeof(LNode));printf("ISBN:");scanf("%s", tmp->data.no);printf("书名:");scanf("%s", tmp->data.name);printf("定价:");scanf("%f", &tmp->data.price);int cnt = 1;for (LinkList elem = L; elem != NULL; elem = elem->next, cnt ++) {if (cnt == pos) {tmp->next = elem->next;elem->next = tmp;break;}}Write(L, 0);return count + 1;
}int Erase(LinkList L, int count) {int pos;do {cls;Output(L, count);endl;printf("请输入数字 1 ~ %d,作为删除的位置:", count);scanf("%d", &pos);} while (pos < 1 || pos > count);int cnt = 1;for (LinkList elem = L->next; elem != NULL; elem = elem->next, cnt ++) {if (cnt == pos) {char c[20];do {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("索引 \tISBN\t\t书名\t\t定价");printf("%2d %s %-18s %5.2lf\n", cnt, elem->data.no, elem->data.name, elem->data.price);title("==========================================");endl;printf("是否确定删除索引第 %d 本书?(Y/N):", pos);scanf("%s", c);} while (c[0] != 'Y' && c[0] != 'N');if (c[0] == 'N') return count;elem->next = elem->next->next;break;}}Write(L, 0);return count - 1;
}int SearchByID(LinkList L, int count) {int pos;do {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;printf("请输入数字 1 ~ %d,作为查找的位置:", count);scanf("%d", &pos);} while (pos < 1 || pos > count);return pos;
}int SearchByName(LinkList L, int count) {char Name[60];int cnt;while (true) {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;printf("请输入书名以查找:");scanf("%s", Name);cnt = 1;for (LinkList elem = L->next; elem != NULL; elem = elem->next, cnt ++) {if (!strcmp(elem->data.name, Name)) return cnt;}if (Name[0] == 'q') return -1;if (cnt == count + 1) {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t未查找到相关书名");endl;title("==========================================");Sleep(1000);break;}}return -1;
}void Search(LinkList L, int count) {int op;do {cls;title(" 查找图书 ");endl;puts("\t0 > 返回");puts("\t1 > 按索引查找");puts("\t2 > 按书名查找");endl;title("==========");scanf("%d", &op);} while (op < 0 || op > 2);int pos;switch (op) {case 0:return;break;case 1:pos = SearchByID(L, count);break;case 2:pos = SearchByName(L, count);break;}if (pos == -1) return;int cnt = 1;for (LinkList elem = L->next; elem != NULL; elem = elem->next, cnt ++) {if (cnt == pos) {cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("找到了以下书满足搜索条件:");endl;puts("索引 \tISBN\t\t书名\t\t定价");printf("%2d %s %-18s %5.2lf\n", cnt, elem->data.no, elem->data.name, elem->data.price);endl;title("==========================================");endl;puts("输入任意并回车返回主界面");int op;scanf("%d", &op);return;}}
}void Update(LinkList L) {Write(L, 2);cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t已完成价格更新");endl;title("==========================================");Sleep(1000);}void Edit(LinkList L, int count) {int op;do {cls;title(" 图书管理 ");endl;puts("\t0 > 返回");puts("\t1 > 新增图书");puts("\t2 > 删除图书");puts("\t3 > 更新价格");endl;title("==========");scanf("%d", &op);} while (op < 0 || op > 3);switch (op) {case 0:return;break;case 1:count = Add(L, count);break;case 2:count = Erase(L, count);break;case 3:Update(L);break;}
}void Swap(LinkList A, LinkList B) { // 交换数据Book C;C = B->data;B->data = A->data;A->data = C;}void Sort(LinkList L, int count) {LinkList L3 = (LinkList)malloc(sizeof(LNode));L3->next = NULL;LinkList last = L3;for (LinkList elem = L->next; elem != NULL; elem = elem->next) {LinkList New = (LinkList)malloc(sizeof(LNode));New->data = elem->data;last->next = New;New->next = NULL;last = New;}for (LinkList i = L3->next; i->next != NULL; i = i->next) // 冒泡排序for (LinkList j = i->next; j != NULL; j = j->next)if (i->data.price > j->data.price) Swap(i, j);Write(L3, 3);cls;title(" 安徽工业大学图书馆计算机图书采购管理系统 ");endl;puts("\t\t已完成按价格升序");endl;title("==========================================");Sleep(1000);}
相关文章:
图书管理系统 数据结构先导课暨C语言大作业复习 | JorbanS
问题描述 读取给定的图书文件book.txt中的信息(book.txt中部分图书信息如下图所示),完成一个图书信息管理系统,该系统的各个功能模块要求利用菜单选项进行选择。 系统功能要求 图书浏览 读取book.txt中的文件信息并依次输出所…...

python 爬虫的开发环境配置
1、新建一个python项目 2、在控制台中分别安装下面三个包 pip install requests pip install beautifulsoup4 pip install selenium/ 如果安装时报以下错误: raise ReadTimeoutError(self._pool, None, "Read timed out.") pip._vendor.urllib3.exceptio…...

技术架构图是什么?和业务架构图的区别是什么?
技术架构图是什么? 技术架构图是一种图形化工具,用于呈现软件、系统或应用程序的技术层面设计和结构。它展示了系统的各种技术组件、模块、服务以及它们之间的关系和交互方式。技术架构图关注系统内部的技术实现细节,以及各个技术组件之…...

数据增强
一、数据增强 当你训练一个机器学习模型时,你实际做工作的是调参,以便将特定的输入(一副图像)映像到输出(标签)。我们优化的目标是使模型的损失最小化, 以正确的方式调节优化参数即可实现这一目…...

【Unity】2D 对话模块的实现
对话模块主要参考 【Unity教程】剧情对话系统 实现。 在这次模块的构建将基于 unity ui 组件 和 C#代码实现一个从excel 文件中按照相应规则读取数据并展示的逻辑。这套代码不仅能实现正常的对话,也实现了对话中可以通过选择不同选项达到不同效果的分支对话功能。 …...

laravel安装初步使用学习 composer安装
一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…...

【VS插件】VS code上的Remote - SSH
【VS插件】VS code上的Remote - SSH 目录 【VS插件】VS code上的Remote - SSH获得Linux服务器或者Linux系统的IP地址下载插件远程登录注意如果Linux虚拟机系统无法连接成功可能是没有开启ssh服务优势 作者:爱写代码的刚子 时间:2023.9.12 前言࿱…...

TensorFlow 02(张量)
一、张量 张量Tensor 张量是一个多维数组。与NumPy ndarray对象类似,tf.Tensor对象也具有数据类型和形状。如下图所示: 此外,tf.Tensors可以保留在GPU中。TensorFlow提供了丰富的操作库 (tf.add,tf.matmul,tf.linalg.inv等),它们…...
513. 找树左下角的值
代码链接: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路: 万金油层次遍历,保存每一层的第一个元素返回就行了 我的代码: /*** Definition for a binary tree node.* struct TreeNode {* …...

量化:基于支持向量机的择时策略
文章目录 参考机器学习简介策略简介SVM简介整体流程收集数据准备数据建立模型训练模型测试模型调节参数 参考 Python机器学习算法与量化交易 利用机器学习模型,构建量化择时策略 机器学习简介 机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。…...

成功解决Selenium 中116版本的chromedriver找不到问题
Selenium 中的Google(谷歌浏览器)最新版本chromedriver 文章目录 Selenium 中的Google(谷歌浏览器)最新版本chromedriver1.当前作者的谷歌浏览器版本2.当前驱动官网的最新版本3.当不想降低浏览器版本继续使用谷歌浏览器的办法 1.当…...
PYQT常用组件--方法汇总
QTimeEdit timeEdit是Qt框架中的一个时间编辑器控件,它提供了以下常用方法: setTime(QTime time): 设置时间编辑器的时间为指定的QTime对象。time(): 返回时间编辑器的当前时间,返回一个QTime对象。setDateTime(QDateTime dateTime): 设置时…...

Linux系统编程(一):文件 I/O
参考引用 UNIX 环境高级编程 (第3版)黑马程序员-Linux 系统编程 1. UNIX 基础知识 1.1 UNIX 体系结构(下图所示) 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境,通常…...
OSM+three.js打造3D城市
对于我在 Howest 的研究项目,我决定构建一个 3D 版本的 Lucas Bebber 的“交互式讲故事的动画地图路径”项目。我将使用 OSM 中的矢量轮廓来挤出建筑物的形状并将它们添加到 3js 场景中,随后我将对其进行动画处理。 一、开发环境 为了使用 Node 和 npm 包,我选择使用 Vite…...

02JVM_垃圾回收GC
二、垃圾回收GC 在堆里面存放着java的所有对象实例,当对象为“死去”,也就是不再使用的对象,就会进行垃圾回收GC 1.如何判断对象可以回收 1.1引用计数器 介绍 在对象中添加一个引用计数器,当一个对象被其他变量引用时这个对象…...

ARM Linux DIY(八)USB 调试
前言 V3s 带有一个 USB 接口,将其设置为 HOST 或 OTG 模式,这样可以用来接入键盘、鼠标等 USB 外设。 USB 简介 USB 有两种设备:HOST 和 USB 功能设备。 在 USB2.0 中又引入了一个新的概念 OTG,即设备角色可以动态切换。 切换方…...

编程小白的自学笔记十四(python办公自动化创建、复制、移动文件和文件夹)
系列文章目录 编程小白的自学笔记十三(python办公自动化读写文件) 编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二) 编程小白的自学笔记十一(python爬虫入门三Selenium的使用实例详解) …...

MySQL使用Xtrabackup备份到AWS存储桶
1.安装Xtrabackup cd /tmp wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86…...
(高阶)Redis 7 第11讲 BIGKEY 优化篇
面试题 问题答案如何在海量数据中查询某一固定前缀的Keyscan生产环境如何限制 keys */FLUSHDB/FLUSHALL 等危险命令,防止误删误用# 修改配置文件 rename-command keys "" rename-command flushdb "" rename-command flushall ""如何使用MEMORY U…...
一阶差分和二阶差分概念及其举例
一阶差分和二阶差分概念及其举例 目录 一阶差分和二阶差分概念及其举例1、一阶差分1.1 概念1.2 举例 2、二阶差分2.1 概念2.2 举例 1、一阶差分 1.1 概念 一阶差分是指对一个数列中的每个元素,计算其与其前一个元素之差的操作。 1.2 举例 举例来说,对…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...

CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...