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

第 2 章 线性表(学生健康登记表实现)

1. 示例代码

1) status.h

/* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H
#define STATUS_H/* 函数结果状态码 */
#define TRUE 					1			/* 返回值为真 */
#define FALSE 					0			/* 返回值为假 */
#define RET_OK 					0			/* 返回值正确 */
#define INFEASIABLE    		   	2			/* 返回值未知 */
#define ERR_MEMORY     		   	3			/* 访问内存错 */
#define ERR_NULL_PTR   			4			/* 空指针错误 */
#define ERR_MEMORY_ALLOCATE		5			/* 内存分配错 */
#define ERR_NULL_STACK			6			/* 栈元素为空 */
#define ERR_PARA				7			/* 函数参数错 */
#define ERR_OPEN_FILE			8			/* 打开文件错 */
#define ERR_NULL_QUEUE			9			/* 队列为空错 */
#define ERR_FULL_QUEUE			10			/* 队列为满错 */
typedef int Status;							/* Status 是函数的类型,其值是函数结果状态代码,如 RET_OK 等 */
typedef int Bollean;						/* Boolean 是布尔类型,其值是 TRUE 或 FALSE */#endif // !STATUS_H

2) singleLinkList.h

/* 线性表的单链表存储结构头文件 */#ifndef SINGLELINKLIST_H
#define SINGLELINKLIST_H#include "status.h"#define NAMELEN 20		/* 姓名最大长度 */
#define CLASSLEN 10		/* 班级名最大长度 */
#define HEALTHLEN 10	/* 健康状态字符长度 */
#define N 4		 		/* 学生个数 */typedef struct {char name[NAMELEN];long studentId;char sex;int age;char className[CLASSLEN];int healthState;
} StudentInfo;typedef StudentInfo ElemType;typedef struct LNode {ElemType data;struct LNode *next;
} *LinkList;/* 辅助函数,创建一个新的节点 */
LinkList MakeNewLNode(ElemType e);/* 操作结果:构造一个空的线性表 L */
Status InitList(LinkList *L);/* 初始条件:线性表 L 已存在。操作结果:销毁线性表 L */
Status DestroyList(LinkList *L);/* 初始条件:线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(LinkList L);/* 初始条件:线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE */
Status ListEmpty(LinkList L);/* 初始条件:线性表 L 已存在。操作结果:返回 L 中数据元素个数 */
int ListLength(LinkList L);/* 算法 2.8,L 为带头结点的单链表的头指针。当第 i 个元素存在时, 其值赋给 e 并返回 OK,否则返回 ERROR */
Status GetElem(LinkList L, int i, ElemType *e);/* 初始条件: 线性表 L 已存在, compare() 是数据元素判定函数(满足为 1,否则为 0)操作结果: 返回 L 中第 1 个与 e 满足关系 compare() 的数据元素的位序。若这样的数据元素不存在,则返回值为 0 */
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType));/* 算法 2.9,在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e */
Status ListInsert(LinkList L, int i, ElemType e);/* 算法 2.10,在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值 */
Status ListDelete(LinkList L, int i, ElemType* e);/* 按学号非降序插入 */
void InsertAscend(LinkList L, ElemType e);#endif

3) singleLinkList.c

/* 线性表的单链表存储结构源文件实现 */#include "singleLinkList.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>/* 辅助函数,创建一个新的节点 */
LinkList MakeNewLNode(ElemType e)
{LinkList newLNode = (LinkList)malloc(sizeof(struct LNode));if (!newLNode) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return NULL;}newLNode->data = e;newLNode->next = NULL;return newLNode;
}/* 操作结果:构造一个空的线性表 L */
Status InitList(LinkList *L)
{*L = (LinkList)malloc(sizeof(struct LNode));if (!(*L)) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return ERR_MEMORY_ALLOCATE;}(*L)->next = NULL;return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:销毁线性表 L */
Status DestroyList(LinkList *L)
{LinkList q;while (*L) {q = (*L)->next;free(*L);*L = q;}return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:将 L 重置为空表 */
Status ClearList(LinkList L)
{LinkList p, q;p = L->next;while (p) {q = p->next;free(p);p = q;}L->next = NULL;return RET_OK;
}/* 初始条件:线性表 L 已存在。操作结果:若 L 为空表,则返回 TRUE,否则返回 FALSE */
Status ListEmpty(LinkList L)
{if (L->next) {return FALSE;}return TRUE;
}/* 初始条件:线性表 L 已存在。操作结果:返回 L 中数据元素个数 */
int ListLength(LinkList L)
{int count = 0;LinkList p = L->next;while (p) {++count;p = p->next;}return count;
}/* 算法 2.8,L 为带头结点的单链表的头指针。当第 i 个元素存在时, 其值赋给 e 并返回 RET_OK,否则返回 ERROR */
Status GetElem(LinkList L, int i, ElemType *e)
{int j = 1;LinkList p = L->next;while (p && j < i) {p = p->next;++j;}if (!p || j > i) {			/* j > i 适用于 i < 1 时,如 i = 0 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}*e = p->data;return RET_OK;
}/* 初始条件: 线性表 L 已存在, compare() 是数据元素判定函数(满足为 1,否则为 0)操作结果: 返回 L 中第 1 个与 e 满足关系 compare() 的数据元素的位序。若这样的数据元素不存在,则返回值为 0 */
int LocateElem(LinkList L, ElemType e, Status(*compare)(ElemType, ElemType))
{int i = 0;LinkList p = L->next;while (p) {++i;if (compare(p->data, e)) {return i;}p = p->next;}return 0;
}/* 算法 2.9,在带头结点的单链线性表 L 中第 i 个位置之前插入元素 e */
Status ListInsert(LinkList L, int i, ElemType e)
{int j = 0;LinkList p = L;while (p && j < i - 1) {++j;p = p->next;}if (!p || j > i - 1) {				/* 超出表长或者 i < 1 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}LinkList newLNode = MakeNewLNode(e);if (!newLNode) {printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_MEMORY_ALLOCATE);return ERR_MEMORY_ALLOCATE;}newLNode->next = p->next;p->next = newLNode;return RET_OK;
}/* 算法 2.10,在带头结点的单链线性表 L 中,删除第 i 个元素,并由 e 返回其值 */
Status ListDelete(LinkList L, int i, ElemType *e)
{int j = 0;LinkList p = L;while (p->next && j < i - 1) {++j;p = p->next;}if (!p->next || j > i - 1) {	/* 理论上 j 最多只能等于 i - 1, 但此处当参数不合法时可用, 建议单独判断参数合法性 */printf("FuncName: %-15s Line: %-5d ErrorCode: %-3d\n", __func__, __LINE__, ERR_PARA);return ERR_PARA;}LinkList q = p->next;p->next = q->next;*e = q->data;free(q);return RET_OK;
}/* 初始条件:线性表 L 已存在操作结果:依次对 L 的每个数据元素调用函数 vi()。一旦 vi() 失败,则操作失败 */
Status ListTraverse(LinkList L, void(*vi)(ElemType))
{LinkList p = L->next;while (p) {vi(p->data);p = p->next;}return RET_OK;
}/* 按学号非降序插入 */
void InsertAscend(LinkList L, ElemType e)
{LinkList q = L, p = L->next;while (p && e.studentId > p->data.studentId) {q = p;p = p->next;}q->next = MakeNewLNode(e);q->next->next = p;
}

4) studentHealthRecord.h

/* 学生健康登记表定义头文件 */#ifndef STUDENTSHEALTHRECORD_H
#define STUDENTSHEALTHRECORD_H#include "status.h"
#include "singleLinkList.h"
#include <stdio.h>/* 打印学生信息 */
void PrintStuentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType e);/* 读入学生信息 */
void ReadIn(char healthState[][HEALTHLEN], int arrayLen, ElemType *e);/* 将学生信息写入指定文件 */
void WriteToFile(ElemType e, FILE *fp);/* 由 fp 指定文件读取学生信息到 e */
Status ReadFromFile(ElemType *e, FILE *fp);/* 查找表中学号为 studentId 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByStudentId(LinkList L, long studentId, LinkList *p, LinkList *q);/* 查找表中姓名为 name 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByName(LinkList L, char name[], LinkList *p, LinkList *q);/* 删除表中学号为 studentId 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByStudentId(LinkList L, long studentId);/* 删除表中姓名为 name 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByName(LinkList L, char name[]);/* 修改学生信息 */
void ModifyStudentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType *e);/* 显示操作选项 */
void ShowMenu(void);#endif // !STUDENTSHEALTHRECORD_H

5) studentHealthRecord.c

/* 学生健康登记表实现源文件 */#include "studentHealthRecord.h"
#include <string.h>
#include <stdlib.h>/* 打印学生信息 */
void PrintStuentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType e)
{if (e.healthState > arrayLen - 1) {printf("Error: Parameter out of bounds!\n");return;}printf("%-10s%-10ld", e.name, e.studentId);if (e.sex == 'm') {printf(" Man");}else {printf(" Female");}printf("%10d%10s%10s\n", e.age, e.className, healthState[e.healthState]);
}/* 读入学生信息 */
void ReadIn(char healthState[][HEALTHLEN], int arrayLen, ElemType *e)
{printf("Please input name(No more than %d characters): ", NAMELEN);scanf_s("%s", e->name, (unsigned int)sizeof(e->name));getchar();printf("Please input the student ID: ");scanf_s("%ld", &e->studentId);getchar();printf("Please input the gender: ");scanf_s("%c", &e->sex, 1);getchar();printf("Please input the age: ");scanf_s("%d", &e->age);getchar();printf("Please input the class name: ");scanf_s("%s", e->className, (unsigned int)sizeof(e->className));getchar();printf("Please input the health state(");for (int i = 0; i < arrayLen; ++i) {printf("%d: %s ", i, healthState[i]);}printf("): ");scanf_s("%d", &e->healthState);getchar();
}/* 将学生信息写入指定文件 */
void WriteToFile(ElemType e, FILE *fp)
{fwrite(&e, sizeof(StudentInfo), 1, fp);
}/* 由 fp 指定文件读取学生信息到 e */
Status ReadFromFile(ElemType *e, FILE *fp)
{size_t ret = fread(e, sizeof(StudentInfo), 1, fp);return (ret == 1) ? 1 : 0;
}/* 查找表中学号为 studentId 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByStudentId(LinkList L, long studentId, LinkList *p, LinkList *q)
{*p = L;while (*p) {*q = (*p)->next;if (*q && (*q)->data.studentId > studentId) {break;}if (*q && (*q)->data.studentId == studentId) {return TRUE;}*p = *q;}return FALSE;
}/* 查找表中姓名为 name 的结点,如找到,q 指向此结点, p 指向 q 的前驱并返回 TRUE; 如无此元素,则返回 FALSE */
Status FindByName(LinkList L, char name[], LinkList *p, LinkList *q)
{*p = L;while (*p) {*q = (*p)->next;if (*q && !strcmp((*q)->data.name, name)) {return TRUE;}*p = *q;}return FALSE;
}/* 删除表中学号为 studentId 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByStudentId(LinkList L, long studentId)
{LinkList p, q;if (FindByStudentId(L, studentId, &p, &q)) {p->next = q->next;free(q);return TRUE;}return FALSE;
}/* 删除表中姓名为 name 的元素,并返回 TRUE;如无此元素,则返回 FALSE */
Status DeleteByName(LinkList L, char name[])
{LinkList p, q;if (FindByName(L, name, &p, &q)) {p->next = q->next;free(q);return TRUE;}return FALSE;
}/* 修改学生信息 */
void ModifyStudentInfo(char healthState[][HEALTHLEN], int arrayLen, ElemType *e)
{PrintStuentInfo(healthState, arrayLen, *e);printf("Please input the content you want to modify, or click Enter to cancel\n");char str[100];printf("Please input name(No more than %d characters): ", NAMELEN);if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {strcpy_s(e->name, sizeof(e->name), str);	/* 第二个参数为目标缓冲区大小 */}printf("Please input student ID: ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->studentId = atol(str);}printf("Please input gender(m: Man f: Female): ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->sex = str[0];}printf("Please input age: ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->age = atoi(str);}printf("Please input class name(No more than %d characters): ", CLASSLEN);if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {strcpy_s(e->className, sizeof(e->className), str);}printf("Please input the health state(");for (int i = 0; i < arrayLen; ++i) {printf("%d: %s ", i, healthState[i]);}printf("): ");if (gets_s(str, sizeof(str)) == NULL) {printf("%s, line: %d: Error: Get string failed!\n", __func__, __LINE__);}if (strlen(str)) {e->healthState = atoi(str);}
}void ShowMenu(void)
{printf("1:  将结构体数组 student 中的记录按学号非降序插入链表\n");printf("2:  将文件中的记录按学号非降序插入链表\n");printf("3:  键盘输入新记录,并将其按学号非降序插入链表\n");printf("4:  删除链表中第一个有给定学号的记录\n");printf("5:  删除链表中第一个有给定姓名的记录\n");printf("6:  修改链表中第一个有给定学号的记录\n");printf("7:  修改链表中第一个有给定姓名的记录\n");printf("8:  查找链表中第一个有给定学号的记录\n");printf("9:  查找链表中第一个有给定姓名的记录\n");printf("10: 显示所有记录\n");printf("11: 将链表中的所有记录存入文件\n");printf("12: 结束\n");printf("    请选择操作命令: ");
}

6) main.c

/* 入口程序源文件 */#include "studentHealthRecord.h"
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>int main(void)
{char healthState[3][10] = { "Health", "Normal", "Unhealth" };StudentInfo student[N] = {{ "王小林", 790631, 'm', 18, "计91", 0 },{ "陈红", 790632, 'f', 20, "计91", 1 },{ "刘建平", 790633, 'm', 21, "计91", 0 },{ "张立立", 790634, 'm', 17, "计91", 2 }};bool flag = true;int choose;LinkList studentList;InitList(&studentList);ElemType e;char fileName[30];long studentId;char name[30];LinkList p, q;while (flag) {ShowMenu();scanf_s("%d", &choose);switch (choose) {case 1:for (int i = 0; i < N; ++i) {InsertAscend(studentList, student[i]);}break;case 2: printf("Please input file name: ");scanf_s("%s", fileName, (unsigned int)sizeof(fileName));FILE* fp;errno_t err_ret = fopen_s(&fp, fileName, "rb");if ( err_ret != 0) {printf("Open file failed!\n");}else {while (ReadFromFile(&e, fp)) {InsertAscend(studentList, e);}fclose(fp);}break;case 3: ReadIn(healthState, 3, &e);InsertAscend(studentList, e);break;case 4: printf("Please input the student ID to delete: ");scanf_s("%ld", &studentId);if (!DeleteByStudentId(studentList, studentId)) {printf("Error: No record of student ID of %ld.\n", studentId);}break;case 5:printf("Please input the name of the student of record to be deleted: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!DeleteByName(studentList, name)) {printf("Error: No record of student name of %s.", name);}break;case 6:printf("Please input the student ID of the record to be modified: ");scanf_s("%ld", &studentId);getchar();if (!FindByStudentId(studentList, studentId, &p, &q)) {printf("No record of the student Id of %ld\n", studentId);}else {ModifyStudentInfo(healthState, 3, &q->data);if (q->data.studentId != studentId) {p->next = q->next;InsertAscend(studentList, q->data);free(q);}}break;case 7:printf("Please input the name of the student of record to be deleted: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!FindByName(studentList, name, &p, &q)) {printf("No record of name of student %s.\n", name);}else {studentId = q->data.studentId;ModifyStudentInfo(healthState, 3, &q->data);if (q->data.studentId != studentId) {p->next = q->next;InsertAscend(studentList, q->data);free(q);}}break;case 8:printf("Please input the student ID of the record to be found: ");scanf_s("%ld", &studentId);if (!FindByStudentId(studentList, studentId, &p, &q)) {printf("No record of the student ID of %ld\n", studentId);}else {PrintStuentInfo(healthState, 3, q->data);}break;case 9:printf("Please input the name of the student of the record to be found: ");scanf_s("%s", name, (unsigned int)sizeof(name));if (!FindByName(studentList, name, &p, &q)) {printf("No record of the student name of %s.\n", name);}else {PrintStuentInfo(healthState, 3, q->data);}break;case 10:p = studentList->next;while (p) {PrintStuentInfo(healthState, 3, p->data);p = p->next;}break;case 11:printf("Please input the file name: ");scanf_s("%s", fileName, (unsigned int)sizeof(fileName));err_ret = fopen_s(&fp, fileName, "wb+");if (err_ret != 0) {printf("Open file failed!\n");}else {LinkList p = studentList->next;while (p) {WriteToFile(p->data, fp);p = p->next;}}fclose(fp);break;case 12:flag = false;}}int ret = DestroyList(&studentList);if (ret != RET_OK) {printf("Error: Destroy list failed!\n");}return 0;
}

 

2. 输出示例

相关文章:

第 2 章 线性表(学生健康登记表实现)

1. 示例代码 1) status.h /* DataStructure 预定义常量和类型头文件 */#ifndef STATUS_H #define STATUS_H/* 函数结果状态码 */ #define TRUE 1 /* 返回值为真 */ #define FALSE 0 /* 返回值为假 */ #define RET_OK 0 /* 返回值正确 */ #define INFEASI…...

第三周晨考自测(3.0)

1.获取元素的偏移量 offsetLeft和offsetTop 分别获取的是元素元素左边的偏移量和上边的偏移量 语法&#xff1a;元素对象.offsetLeft /元素对象.offsetTop 返回值&#xff1a;就是该元素对应的偏移量&#xff0c;是一个具体的数字 offsetLeft&#xff1a;该元素相对于参考…...

C++ 结构体

前文 C中的结构体是一种非常有用的数据类型&#xff0c;它允许我们将不同的变量组合在一起&#xff0c;形成一个自定义的数据结构。 结构体在C中的应用非常广泛&#xff0c;它可以用来表示和管理各种实体、对象或数据的属性。比如&#xff0c;在一个学生管理系统中&#xff0c…...

如何使用聊天GPT自定义说明

推荐&#xff1a;使用 NSDT场景编辑器 快速搭建3D应用场景 OpenAI ChatGPT正在席卷全球。一周又一周&#xff0c;更新不断提高您可以使用这种最先进的语言模型做什么的标准。 在这里&#xff0c;我们深入研究了OpenAI最近在ChatGPT自定义指令上发布的公告。此功能最初以测试版…...

mac pyenv无法切换python版本问题

看是zsh还是bash echo $SHELLzsh 配置到&#xff5e;/.zshrc 文件 vim ~/.zshrcexport PYENV_ROOT"$HOME/.pyenv" command -v pyenv >/dev/null || export PATH"$PYENV_ROOT/bin:$PATH" 执行 source ~/.zshrc bash vim ~/.bashrc export PYENV_R…...

API接口接入电商平台案例,采集淘宝天猫拼多多1688京东LAZADA数据按关键字搜索商品示例

按关键字搜索商品数据API接口可以让用户轻松地在海量商品中找到自己需要的商品。这个接口包括多种搜索方式&#xff0c;例如利用关键字搜索商品名称、商品描述、商品分类、商家信息等。同时&#xff0c;还可以通过不同的排序方式进行筛选&#xff0c;例如销量排行、价格排行、评…...

持安-大连万达集团零信任项目入选中国信通院2023零信任优秀案例

2023年8月25日&#xff0c;以“链接云端&#xff0c;可信而安”为主题的“2023首届SecGo云和软件安全大会”在京隆重召开。会上&#xff0c;中国信息通信研究院重磅揭晓了“安全守卫者计划”优秀案例评选结果。 零信任办公安全技术创新企业持安科技&#xff0c;与用户大连万达…...

python28种极坐标绘图函数总结

文章目录 基础图误差线等高线polar场图polar统计图非结构坐标图 &#x1f4ca;python35种绘图函数总结&#xff0c;3D、统计、流场&#xff0c;实用性拉满 matplotlib中的画图函数&#xff0c;大部分情况下只要声明坐标映射是polar&#xff0c;就都可以画出对应的极坐标图。但…...

C#编程基础(万字详解,这一篇就够了)

C#及其开发环境简介 C#概述 C#的编程功能 C#与.Net的关系 .Net C# C#的集成开发环境 Windows上编写C#程序 Linux/Mac OS上编写C#程序 运行第一个HelloWorld程序 C#基本语法 程序实例 C#基本语法 using关键字 class关键字 注释 成员变量 成员函数 实例化一个类…...

SpringBoot中自定义注解

目录 SpringBoot中自定义注解 关于注解的解释 元注解 Documented Target Retention Inherited Native 自定义注解 自定义注解与SpringBoot全局异常处理完成参数校验 约束验证器 自定义全局异常处理器 自定义注解完成数据脱敏 定义脱敏策略枚举 自定义注解 实行脱…...

《TCP/IP网络编程》阅读笔记--地址族和数据序列

目录 1--IP地址和端口号 2--地址信息的表示 3--网络字节序与地址变换 4--网络地址的初始化与分配 5--Windows部分代码案例 1--IP地址和端口号 IP 地址分为两类&#xff1a; ① IPv4 表示 4 字节地址族&#xff1b; ② IPv6 表示 16 字节地址族&#xff1b; IPv4 标准的 4 …...

【C++】可变参数模板

2023年9月9日&#xff0c;周六下午 这个还是挺难学的&#xff0c;我学了好几天... 在这里我会举大量的示例程序&#xff0c;这样可以有一个更好的理解&#xff0c; 不定期更新。 目录 推荐文章&#xff1a; 示例程序一&#xff1a;拼接字符串 示例程序二&#xff1a;求整…...

WPF Flyout风格动画消息弹出消息提示框

WPF Flyout风格动画消息弹出消息提示框 效果如图&#xff1a; XAML: <Window x:Class"你的名称控件.FlyoutNotication"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xam…...

Spring Boot 集成 Redis

Spring-data-redis 在 Spring 中整合 Redis jedis : 采用的直连&#xff0c;多个线程操作的话&#xff0c;是不安全的&#xff0c;如果想要避免不安全的&#xff0c;使用 jedis pool 连接池 lettuce : 采用netty&#xff0c;实例可以再多个线程中进行共享&#xff0c;不存在…...

Java线程之间通信方式

目录 1 线程之间的通信方式主要有以下几种2 共享变量3 锁机制4 条件变量5 信号量6 管道 1 线程之间的通信方式主要有以下几种 在实际开发时&#xff0c;一个进程中往往有很多个线程&#xff0c;大多数线程之间往往不是绝对独立的&#xff0c;比如说我们需要将A和B 两个线程的执…...

【LeetCode-中等题】367. 有效的完全平方数

文章目录 题目方法一&#xff1a;二分查找 题目 方法一&#xff1a;二分查找 找 1 - num 之间的 mid&#xff0c; 开方是整数 就找得到 mid&#xff0c; 不是整数自然找不到mid class Solution { // 二分查找 &#xff1b;找 1 - num 之间的mid 开方是整数 就找得到 不是…...

英语单词(二)

1.int:整形 2.char:字符型 3.scanner:接受输入,扫描器 4.integer:整数,整形 5.type:类型 6.string:字符串类型 7.double:双精度浮点型...

Django 用相对路径方式引用自定义模块 或 文件

Django的文件夹结构 projectName/websiteName/appName manage.py 所在路径为&#xff1a;D:/projectA/website1/manage.py views.py 所在路径为&#xff1a;D:/projectA/website1/app1/views.py D:/projectA/website1/app1/module1.py 如果要引用自定义模块&#xff0c;引用…...

企业架构LNMP学习笔记22

防盗链原理和实现。 域名A的资源文件&#xff0c;经常被域名B直接调用访问。 而用户经常访问域名B&#xff0c;看到的资源&#xff08;图片等&#xff09;以为是域名B的&#xff0c;实际则是域名A的。 但是域名A没有获得任何收益&#xff0c;却要给域名B来源的访问消耗服务器…...

uniapp和小程序设置tabBar和显示与隐藏tabBar

&#xff08;1&#xff09;设置tabBar&#xff1a; uni.setTabberItem({ }); wx.setTabberItem({ }); 属性值&#xff1a; indexnumber是tabBar 的哪一项&#xff0c;从左边算起&#xff0c;索引从0开始textstring否tab 上按钮文字iconPathstring否图片路径selectedIc…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

C# SqlSugar:依赖注入与仓储模式实践

C# SqlSugar&#xff1a;依赖注入与仓储模式实践 在 C# 的应用开发中&#xff0c;数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护&#xff0c;许多开发者会选择成熟的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;SqlSugar 就是其中备受…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...