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

通讯录程序

假设通讯录可以存放100个人的信息(人的信息:姓名、年龄、性别、地址、电话)

功能:1>增加联系人   2>删除指定联系人   3>查找指定联系人信息  4>修改指定联系人信息

           5>显示所有联系人信息  6>排序(姓名、年龄)

---------------------------------------------------------------------------------------------------------------------------------

根据前面三子棋等游戏,我们知道需要创建三个文件,test.c - 测试通讯录

  contact.c - 通讯录的实现     contact.h - 函数的声明

我们首先写出整体的代码(test.c):

#include "contact.h"void menu()
{printf("******************************************\n");printf("******      1. add       2. del     ******\n");printf("******      3. search    4. modify  ******\n");printf("******      5. show      0. exit    ******\n");printf("******    6.sortbyname   7.sortbyage******\n");printf("******************************************\n");
}
int main()
{int input = 0;do{menu();printf("请选择:>");scanf("%d",&input);switch(input){case 1:break;case 2:break;case 3:break;case 4:break;case 5:break;case 6:break;case 0:printf("退出通讯录\n");break;default:printf("选择错误\n");break;}}while(input);return 0;
}

第二步我们使用结构体类型来存放人的信息并声明所创建的通讯录(contact.h ):

#include <stdio.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12//人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放人的信息int sz;//当前已经放的信息的个数
}Contact;

接下来创建通讯录及初始化通讯录(test.c):

//创建通讯录
Contact con;
//初始化通讯录
InitContact(&con);

初始化通讯录(contact.c):

void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data,0,sizeof(pc->data));
}

一、增加联系人函数

在Contact结构体内,PeoInfo类型的变量data存放人的信息(0,1,……),整型sz是当前已经存放的信息个数(0,1,……),那我们可以将sz作为data数组的下标来进行增加联系人操作及判断是否通讯录已满

void AddContact(Contact* pc)
{assert(pc);if(pc->sz == MAX){printf("通讯录已满,无法添加\n");return;}//增加一个人信息printf("请输入名字:>");scanf("%s",pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d",&(pc->data[pc->sz].age));printf("请输入性别:>");scanf("%s",pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s",pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s",pc->data[pc->sz].tele);pc->sz++;
}

二、显示所有联系人信息函数

当我们添加完联系人后,显示一下所有联系人的信息

void ShowContact(const Contact* pc)
{assert(pc);printf("-------------------------------显示结果-----------------------------------\n");int i = 0;for(i = 0;i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);}printf("--------------------------------------------------------------------------\n");
}

三、删除指定联系人函数

想要找到指定删除的联系人,必须先知道他的名字,因此,我们在写该函数前,再写一个函数来确定姓名,能够找到该联系人姓名返回其下标,如果找不到该联系人就返回-1

int FindByName(Contact* pc,char name[])
{assert(pc);int i = 0;for(i = 0;i < pc->sz; i++){if(strcmp(pc->data[i].name,name) == 0){return i;}}return -1;
}
void DelContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };if(pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s",name);int ret = FindByName(pc,name);if(ret == -1){printf("要删除的人不存在\n");return;}int i = 0;//删除for(i = 0;i < pc->sz-1; i++)//这里-1是因为当i=99时,i+1就是100,即当要将下标为100的第101个元素搬到下标为99的第100个元素,越界访问,所以要减去1{pc->data[i] = pc->data[i+1]}pc->sz--;//已经删除掉一个人的信息,那么总的个数就要减掉一个printf("删除成功\n");
}

四、查找指定联系人信息函数

想要查找指定联系人信息,一样需要先找到联系人的名字,一样用到FindByName函数

void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找的人的名字:>");scanf("%s",name);int ret = FindByName(pc,name);if(ret == -1){printf("要查找的人不存在\n");return;}//打印信息printf("-------------------------------查找结果-----------------------------------\n");printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].tele);printf("--------------------------------------------------------------------------\n");}

五、修改指定联系人信息函数

一样需要借助FindByName函数

void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要修改的人的名字:>");scanf("%s",name);int ret = FindByName(pc,name);if(ret == -1){printf("要修改的人不存在\n");return;}//修改printf("请输入修改的名字:>");scanf("%s", pc->data[ret].name);printf("请输入修改的年龄:>");scanf("%d", &pc->data[ret].age);printf("请输入修改的性别:>");scanf("%s", pc->data[ret].sex);printf("请输入修改的地址:>");scanf("%s", pc->data[ret].addr);printf("请输入修改的电话:>");scanf("%s", pc->data[ret].tele);printf("修改成功\n");
}

六、排序函数

我们需要用到之前学到的qsort排序函数

6.1 根据姓名排序

int cmpbyname(const void* p1,const void* p2)
{assert(p1 && p2);return strcmp((PeoInfo*)p1)->name,((PeoInfo*)p2)->name);
}
void SortContactByName(Contact* pc)
{assert(pc);if(pc->data == 0){printf("通讯录为空,无需排序\n");return;}qsort(pc->data,pc->sz,sizeof(PeoInfo),cmpbyname);printf("排序成功\n");
}

6.2 根据年龄排序

int cmpbyage(const void* p1,const void* p2)
{assert(p1 && p2);return ((PeoInfo*)p1)->age - ((PeoInfo*)p2)->age;
}
void SortContactByAge(Contact* pc)
{assert(pc);if(pc->data == 0){printf("通讯录为空,无需排序\n");return;}qsort(pc->data,pc->sz,sizeof(PeoInfo),cmpbyage);printf("排序成功\n");
}

七、完整代码

contact.h#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>
#include <stdlib.h>#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12#define DEFAUT_ST 3
#define INC_SZ 2//人的信息
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char addr[ADDR_MAX];char tele[TELE_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放人的信息int sz;//当前已经放的信息的个数
}Contact;//初始化通讯录
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//显示通讯录中的信息
void ShowContact(const Contact* pc);//删除指定联系人
void DelContact(Contact* pc);//查找指定联系人
void SearchContact(const Contact* pc);//修改指定联系人
void ModifyContact(Contact* pc);//通过姓名排序
void SortContactByName(Contact* pc);//通过年龄排序
void SortContactByAge(Contact* pc);
test.c#include "contact.h"void menu()
{printf("******************************************\n");printf("******      1. add       2. del     ******\n");printf("******      3. search    4. modify  ******\n");printf("******      5. show      0. exit    ******\n");printf("******    6.sortbyname   7.sortbyage******\n");printf("******************************************\n");}
int main()
{int input = 0;int num = 0;//ͨ创建通讯录Contact con;//初始化通讯录InitContact(&con);do{menu();printf("ѡ:>");scanf("%d", &input);switch (input){case 1:AddContact(&con);break;case 2:DelContact(&con);break;case 3:SearchContact(&con);break;case 4:ModifyContact(&con);break;case 5:ShowContact(&con);break;case 6:SortContactByName(&con);break;case 7:SortContactByAge(&con);break;case 0:printf("˳ͨѶ¼\n");break;default:printf("ѡ\n");break;}} while (input);return 0;
}
contact.c#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}void AddContact(Contact* pc)
{assert(pc);if (pc->sz == MAX){printf("通讯录已满,无法添加\n");return;}//增加一个人的信息printf("请输入名字:>");scanf("%s", pc->data[pc->sz].name);printf("请输入年龄:>");scanf("%d", &pc->data[pc->sz].age);printf("请输入性别:>");scanf("%s", pc->data[pc->sz].sex);printf("请输入地址:>");scanf("%s", pc->data[pc->sz].addr);printf("请输入电话:>");scanf("%s", pc->data[pc->sz].tele);pc->sz++;
}void ShowContact(const Contact* pc)
{assert(pc);printf("-------------------------------显示结果-----------------------------------\n");int i = 0;printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字","年龄","性别","地址","电话");for (i = 0; i < pc->sz; i++){printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].addr, pc->data[i].tele);}printf("--------------------------------------------------------------------------\n");}int FindByName(const Contact* pc, char name[])
{assert(pc);int i = 0;for (i = 0; i < pc->sz; i++){if (strcmp(pc->data[i].name, name) == 0){return i;}}return -1;
}void DelContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}//删除//找到要删除的人printf("请输入要删除的人的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (-1 == ret){printf("要删除的人不存在\n");return;}int i = 0;//删除for (i = ret; i < pc->sz - 1; i++)//这里-1是因为当i=99时,i+1就是100,即当要将下标为100的第101个元素搬到下标为99的第100个元素,越界访问{pc->data[i] = pc->data[i + 1];}pc->sz--;//已经删除掉一个人的信息,那么总的个数就要减掉一个printf("删除成功\n");
}void SearchContact(const Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要查找人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要查找的人不存在\n");return;}//打印信息printf("-------------------------------查找结果-----------------------------------\n");printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\n", "名字", "年龄", "性别", "地址", "电话");printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex, pc->data[pos].addr, pc->data[pos].tele);printf("--------------------------------------------------------------------------\n");
}void ModifyContact(Contact* pc)
{assert(pc);char name[NAME_MAX] = { 0 };printf("请输入要修改的人的名字:>");scanf("%s", name);int pos = FindByName(pc, name);if (-1 == pos){printf("要修改的人不存在\n");return;}printf("请输入修改的名字:>");scanf("%s", pc->data[pos].name);printf("请输入修改的年龄:>");scanf("%d", &pc->data[pos].age);printf("请输入修改的性别:>");scanf("%s", pc->data[pos].sex);printf("请输入修改的地址:>");scanf("%s", pc->data[pos].addr);printf("请输入修改的电话:>");scanf("%s", pc->data[pos].tele);printf("修改成功\n");
}int cmpbyname(const void* p1,const void* p2)
{assert(p1 && p2);return strcmp((PeoInfo*)p1)->name,((PeoInfo*)p2)->name);
}
void SortContactByName(Contact* pc)
{assert(pc);if(pc->data == 0){printf("通讯录为空,无需排序\n");return;}qsort(pc->data,pc->sz,sizeof(PeoInfo),cmpbyname);printf("排序成功\n");
}int cmpbyage(const void* p1,const void* p2)
{assert(p1 && p2);return ((PeoInfo*)p1)->age - ((PeoInfo*)p2)->age;
}
void SortContactByAge(Contact* pc)
{assert(pc);if(pc->data == 0){printf("通讯录为空,无需排序\n");return;}qsort(pc->data,pc->sz,sizeof(PeoInfo),cmpbyage);printf("排序成功\n");
}

八、添加枚举类型

test.c 文件中,switch 函数内部,根据菜单选项,写为case 1,2……,这样有点难以看懂,例如,当 case 1 内的 AddContact 函数没有写时,如果忘记选项1是什么功能时,又得到回去看菜单,而添加一个枚举类型就可以避免这一操作,且枚举常量不赋值默认从0开始,依次增加1

test.c#include "contact.h"void menu()
{printf("******************************************\n");printf("******      1. add       2. del     ******\n");printf("******      3. search    4. modify  ******\n");printf("******      5. show      0. exit    ******\n");printf("******    6.sortbyname   7.sortbyage******\n");printf("******************************************\n");}enum Option
{EXIT, //0ADD,  //1DEL,  //2SEARCH,MODIFY,SHOW,sortbyname,sortbyage
};int main()
{int input = 0;int num = 0;//ͨ创建通讯录Contact con;//初始化通讯录InitContact(&con);do{menu();printf("ѡ:>");scanf("%d", &input);switch (input){case ADD:AddContact(&con);break;case DEL:DelContact(&con);break;case SEARCH:SearchContact(&con);break;case MODIFY:ModifyContact(&con);break;case SHOW:ShowContact(&con);break;case sortbyname:SortContactByName(&con);break;case sortbyage:SortContactByAge(&con);break;case EXIT:printf("˳ͨѶ¼\n");break;default:printf("ѡ\n");break;}} while (input);return 0;
}

相关文章:

通讯录程序

假设通讯录可以存放100个人的信息&#xff08;人的信息&#xff1a;姓名、年龄、性别、地址、电话&#xff09; 功能&#xff1a;1>增加联系人 2>删除指定联系人 3>查找指定联系人信息 4>修改指定联系人信息 5>显示所有联系人信息 6>排序&#xff08;…...

无需翻墙!3D 优质前端模板分享

开发网站时&#xff0c;无需撰写 HTML、CSS 和 JavaScript 代码&#xff0c;直接调用模板内现成的组件&#xff0c;通过拖拽组合、修改参数&#xff0c;几天内即可完成核心页面开发&#xff0c;开发速度提升高达 70% 以上。让开发者更专注于业务逻辑优化与功能创新&#xff0c;…...

Shinkai开源程序 是一个双击安装 AI 管理器(本地和远程),它允许您使用简单的 UI 在 5 分钟或更短的时间内创建 AI 代理

​一、软件介绍 文末提供程序和源码下载 Shinkai 开源应用程序在 Web 浏览器中解锁了一流 LLM &#xff08;AI&#xff09; 支持的全部功能/自动化。它允许创建多个代理&#xff0c;每个代理都连接到本地或第三方LLMs&#xff08;例如 OpenAI GPT&#xff09;&#xff0c;这些…...

vscode不能跳转到同一个工作区的其他文件夹

明白了&#xff0c;你说的“第二种情况”是指&#xff1a; 你先打开的是项目文件夹&#xff08;比如 MyProject&#xff09;&#xff0c;然后通过 VS Code 的“添加文件夹到工作区”功能&#xff0c;把 ThirdPartyLib 文件夹添加进来。 结果&#xff0c;项目代码里 #include “…...

containerd 之使用 ctr 和 runc 进行底层容器操作与管理

containerd 是目前业界标准的容器运行时&#xff0c;它负责容器生命周期的方方面面&#xff0c;如镜像管理、容器执行、存储和网络等。而 ctr 是 containerd 自带的命令行工具&#xff0c;虽然不如 Docker CLI 用户友好&#xff0c;但它提供了直接与 containerd API 交互的能力…...

IMU 技术概述

IMU&#xff08;惯性测量单元&#xff0c;Inertial Measurement Unit&#xff09;是一种通过传感器组合测量物体运动状态和姿态的核心设备&#xff0c;广泛应用于导航、控制、智能设备等领域。以下从原理、组成、应用和发展趋势展开说明&#xff1a; 一、核心定义与本质 IMU …...

talk-centos6之间实现

在 CentOS 6.4 上配置和使用 talk 工具&#xff0c;需要注意系统版本较老&#xff0c;很多配置可能不同于现代系统。我会提供 详细步骤 自动化脚本&#xff0c;帮你在两台 CentOS 6.4 机器上实现局域网聊天。 ⸻ &#x1f9f1; 一、系统准备 假设你有两台主机&#xff1a; …...

hivesql是什么数据库?

HiveSQL并非指一种独立的数据库&#xff0c;而是指基于Apache Hive的SQL查询语言接口&#xff0c;Hive本身是一个构建在Hadoop生态系统之上的数据仓库基础设施。 以下是对HiveSQL及其相关概念的详细解释&#xff1a; 一、Hive概述 定义&#xff1a; Hive是由Facebook开发&…...

(1)python开发经验

文章目录 1 安装包格式说明2 PySide支持Windows7 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt开发 &#x1f448;&#x1f449;python开发 &#x1f448; 1 安装包格式说明 PySide下载地址 进入下载地址后有多种安装包&#xff0c;怎么选择&#xff1a; …...

[论文翻译]PPA: Preference Profiling Attack Against Federated Learning

文章目录 摘要一、介绍1、最先进的攻击方式2、PPA3、贡献 二、背景和相关工作1、联邦学习2、成员推理攻击3、属性推理攻击4、GAN攻击5、联邦学习中的隐私推理攻击 三、PPA1、威胁模型与攻击目标&#xff08;1&#xff09;威胁模型&#xff08;2&#xff09;攻击目标 2、PPA 概述…...

北三短报文数传终端:筑牢水利防汛“智慧防线”,守护江河安澜

3月15日我国正式入汛&#xff0c;较以往偏早17天。据水利部预警显示&#xff0c;今年我国极端暴雨洪涝事件趋多趋频趋强&#xff0c;叠加台风北上影响内陆的可能性&#xff0c;灾害风险偏高&#xff0c;防汛形势严峻复杂。面对加快推进“三道防线”建设&#xff0c;提升“四预”…...

函数加密(Functional Encryption)简介

1. 引言 函数加密&#xff08;FE&#xff09;可以被看作是公钥加密&#xff08;PKE&#xff09;的一种推广&#xff0c;它允许对第三方的解密能力进行更细粒度的控制。 在公钥加密中&#xff0c;公钥 p k \mathit{pk} pk 用于将某个值 x x x 加密为密文 c t \mathit{ct} c…...

思维链实现 方式解析

思维链的实现方式 思维链的实现方式除了提示词先后顺序外,还有以下几种: 增加详细的中间步骤提示:通过提供问题解决过程中的详细中间步骤提示,引导模型逐步推导和思考。例如,在解决数学证明题时,提示词可以具体到每一步需要运用的定理、公式以及推理的方向,帮助模型构建…...

深入学习Zookeeper的知识体系

目录 1、介绍 1.1、CAP 理论 1.2、BASE 理论 1.3、一致性协议ZAB 1、介绍 2、角色 3、ZXID和myid 4、 历史队列 5、协议模式 6、崩溃恢复模式 7、脑裂问题 2、zookeeper 2.1、开源项目 2.2、功能 2.3、选举机制 3、数据模型 3.1、介绍 3.2、znode分类 4、监听…...

电商平台一站式安全防护架构设计与落地实践

引言&#xff1a;安全即业务&#xff0c;防御即增长 国际权威机构 Forrester 最新报告指出&#xff0c;2024 年全球电商平台因安全防护不足导致的直接营收损失高达 $180 亿&#xff0c;而采用一体化防护方案的头部企业客户留存率提升 32%。本文基于 10 万 节点防护实战数据&a…...

【Pandas】pandas DataFrame cummin

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…...

奇妙小博客

import matplotlib.pyplot as plt# 定义顶点坐标 A [0, 0] B [6, 1] C [4, 6] P [4, 3]# 绘制三角形 ABC plt.plot([A[0], B[0], C[0], A[0]], [A[1], B[1], C[1], A[1]], b-, labelTriangle ABC) # 绘制点 P plt.scatter(P[0], P[1], colorr, labelPoint P(4,3))# 标注顶点…...

嵌入式学习笔记 - HAL_ADC_ConfigChannel函数解析

贴函数原型&#xff1a; 一 首先配置规则通道序列 其实所有的配置函数都是在对寄存器进行操作&#xff0c;要想看懂Hal库底层函数驱动就先把寄存器如何配置看懂&#xff0c;以下是配置规则通道寄存器的介绍&#xff0c;以ADC_SQR3为例&#xff0c;也就是通道序列1到序列6&…...

Java反射详细介绍

的反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时动态获取类的信息、操作类的成员&#xff08;属性、方法、构造器&#xff09;&#xff0c;甚至修改类的行为。它是框架开发&#xff08;如 Spring、MyBatis&#xff09;、单元测试工具&a…...

2025年土木建筑与水利工程国际会议(ICCHE 2025)

2025 International Conference on Civil and Hydraulic Engineering (ICCHE 2025) &#xff08;一&#xff09;会议信息 会议简称&#xff1a;ICCHE 2025 大会地点&#xff1a;中国银川 投稿邮箱&#xff1a;icchesub-paper.com 收录检索&#xff1a;提交Ei Compendex,CPCI,C…...

适应性神经树:当深度学习遇上决策树的“生长法则”

1st author: Ryutaro Tanno video: Video from London ML meetup paper: Adaptive Neural Trees ICML 2019 code: rtanno21609/AdaptiveNeuralTrees: Adaptive Neural Trees 背景 在机器学习领域&#xff0c;神经网络&#xff08;NNs&#xff09;凭借其强大的表示学习能力&…...

IBM BAW(原BPM升级版)使用教程第十四讲

续前篇&#xff01; 一、流程设计中的编程 在 IBM Business Automation Workflow (BAW) 中&#xff0c;编程部分涵盖了多种技术、工具和策略&#xff0c;帮助用户定制和扩展流程。BAW 主要通过脚本、集成、服务和自定义代码来实现流程的灵活性和定制化。下面将详细讲解 BAW …...

【计算机网络 第8版】谢希仁编著 第四章网络层 题型总结3 SDN OpenFlow

SDN OpenFlow题型 这题其实&#xff0c;认真看书P196-197的例子也不难理解。我个人认为所谓防自学设计主要就是你没看懂这张图的时候就是天书&#xff0c;你知道怎么读这张图的时候就很简单。不过我相信这个用心一点应该也都是能懂的。 题目 4.66-4.69 4-66 我最大的一个问题…...

【React中函数组件和类组件区别】

在 React 中,函数组件和类组件是两种构建组件的方式,它们在多个方面存在区别,以下详细介绍: 1. 语法和定义 类组件:使用 ES6 的类(class)语法定义,继承自 React.Component。需要通过 this.props 来访问传递给组件的属性(props),并且通常要实现 render 方法返回 JSX…...

多线程代码案例-1 单例模式

单例模式 单例模式是开发中常见的设计模式。 设计模式&#xff0c;是我们在编写代码时候的一种软性的规定&#xff0c;也就是说&#xff0c;我们遵守了设计模式&#xff0c;代码的下限就有了一定的保证。设计模式有很多种&#xff0c;在不同的语言中&#xff0c;也有不同的设计…...

langChain存储文档片段,并进行相似性检索

https://python.langchain.ac.cn/docs/how_to/document_loader_pdf/#vector-search-over-pdfs 这段代码展示了如何使用LangChain框架中的InMemoryVectorStore和OpenAIEmbeddings来存储文档片段&#xff0c;并基于提供的查询进行相似性搜索。下面是对每一行代码的详细解释&…...

MQTT协议技术详解:深入理解物联网通信基础

MQTT协议技术详解&#xff1a;深入理解物联网通信基础 1. MQTT协议概述 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的发布/订阅消息传输协议&#xff0c;专为资源受限设备和低带宽、高延迟或不可靠网络环境设计。作为物联网通信的核心协议之一&#xff0c;MQTT…...

python中的进程锁与线程锁

在Python中&#xff0c;线程和进程使用锁的机制有所不同&#xff0c;需分别通过threading和multiprocessing模块实现。以下是具体用法及注意事项&#xff1a; 一、线程锁&#xff08;Thread Lock&#xff09; 基本用法 线程锁用于多线程环境下保护共享资源&#xff0c;防止数据…...

导出导入Excel文件(详解-基于EasyExcel)

前言&#xff1a; 近期由于工作的需要&#xff0c;根据需求需要导出导入Excel模板。于是自学了一下下&#xff0c;在此记录并分享&#xff01;&#xff01; EasyExcel&#xff1a; 首先我要在这里非常感谢阿里的大佬们&#xff01;封装这么好用的Excel相关的API&#xff0c;真…...

仿正点原子驱动BMP280气压传感器实例

文章目录 前言 一、寄存器头文件定义 二、设备树文件中添加节点 三、驱动文件编写 四、编写驱动测试文件并编译测试 总结 前言 本文驱动开发仿照正点原子的iic驱动实现&#xff0c;同时附上bmp280的数据手册&#xff0c;可访问下面的链接&#xff1a; BMP280_Bosch(博世…...

Java 反射机制(Reflection)

一、理论说明 1. 反射的定义 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Jav…...

每日Prompt:发光线条解剖图

提示词 一幅数字插画&#xff0c;描绘了一个 [SUBJECT]&#xff0c;其结构由一组发光、干净且纯净的蓝色线条勾勒而成。画面设定在深色背景之上&#xff0c;以突出 [SUBJECT] 的形态与特征。某个特定部位&#xff0c;如 [PART]&#xff0c;通过红色光晕加以强调&#xff0c;以…...

从新手到高手:全面解析 AI 时代的「魔法咒语」——Prompt

引言&#xff1a;AI 时代的「语言炼金术」 在人工智能技术突飞猛进的今天&#xff0c;我们正在经历一场堪比工业革命的生产力变革。从聊天机器人到图像生成&#xff0c;从数据分析到自动化写作&#xff0c;AI 模型正在重塑人类与信息交互的方式。而在这一切背后&#xff0c;隐…...

【SpringBoot】集成kafka之生产者、消费者、幂等性处理和消息积压

目录 配置文件 application.properties启动类 ApplicationKafka 配置Message 消息实体类MessageRepository 消息处理消息积压监控服务Kafka消息消费者服务Kafka消息生产者服务API控制器提供测试接口关键特性说明生产环境建议 配置文件 application.properties # 应用配置 serv…...

[SAP] 通过事务码Tcode获取程序名

如何通过事务码查找对应的程序名&#xff1f; 方法一&#xff1a;直接运行事务码&#xff0c;跳转至功能详情页面&#xff0c;点击【系统】|【状态】即可获取对应事务码的程序名 从上面可以了解到自定义的事务码"ZMM01"对应的程序名为"ZYT36_ZMM001_01"&a…...

蓝桥杯12届国B 纯质数

题目描述 如果一个正整数只有 1 和它本身两个约数&#xff0c;则称为一个质数&#xff08;又称素数&#xff09;。 前几个质数是&#xff1a;2,3,5,7,11,13,17,19,23,29,31,37,⋅⋅⋅ 。 如果一个质数的所有十进制数位都是质数&#xff0c;我们称它为纯质数。例如&#xff1…...

国产大模型「五强争霸」,决战AGI!

来源 | 新智元 DeepSeek的横空出世&#xff0c;已经彻底改变了全球的AI局势。 从此&#xff0c;不仅中美大模型竞争格局改变&#xff0c;国产大模型的产业版图&#xff0c;也被一举打破&#xff01; 纵观中国基础大模型的市场&#xff0c;可以看到&#xff0c;如今的基础大模…...

C++修炼:继承

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…...

Mysql新增

插入一个记录需要的时间由下列因素组成&#xff0c;其中的数字表示大约比例&#xff1a; 连接&#xff1a;(3)发送查询给服务器&#xff1a;(2)分析查询&#xff1a;(2)插入记录&#xff1a;&#xff08;1x记录大小&#xff09;插入索引&#xff1a;&#xff08;1x索引&#x…...

华秋2025电子设计与制造技术研讨会(华东站)成功举办!

“探索科技前沿&#xff0c;共筑创新未来”——华秋“2025电子设计与制造技术研讨会第一站&#xff1a;华东站”在江苏苏州圆满落幕。 随着电子信息产业的持续增长和数字化经济的加速转型&#xff0c;数字化电子供应链的作用愈发显著。本届研讨聚焦EDA设计、DFM软件分析、多层…...

[学习] RTKLib详解:qzslex.c、rcvraw.c与solution.c

RTKLib详解&#xff1a;qzslex.c、rcvraw.c与solution.c 本文是 RTKLlib详解 系列文章的一篇&#xff0c;目前该系列文章还在持续总结写作中&#xff0c;以发表的如下&#xff0c;有兴趣的可以翻阅。 [学习] RTKlib详解&#xff1a;功能、工具与源码结构解析 [学习]RTKLib详解…...

【Ubuntu】neovim Lazyvim安装与卸载

安装neovim # 下载 AppImage wget https://github.com/neovim/neovim/releases/latest/download/nvim-linux-x86_64.appimage# 添加执行权限 chmod ux nvim-linux-x86_64.appimage# 移动到系统路径&#xff0c;重命名为 nvim sudo mv nvim-linux-x86_64.appimage /usr/local/b…...

数据结构(一) 绪论

一. 时间复杂度: (1)定义: 时间复杂度是衡量算法执行时间随输入规模(通常用n表示)增长的变化趋势的指标,时间复杂度用O符号表示 用于描述算法在最坏情况下或平均情况下的时间需求 时间复杂度关注的是操作次数的增长率&#xff0c;而非具体执行时间 常见的时间复杂度由小到大依次…...

数据库事务并发问题

目录 脏读 幻读 不可重复读 三者的区别 脏读、幻读和不可重复读是在数据库并发操作中可能出现的问题&#xff0c;以下是对它们的详细介绍&#xff1a; 脏读 定义&#xff1a;指一个事务读取了另一个未提交事务修改的数据。示例&#xff1a;事务 A 修改了一条数据&#xf…...

Android之横向滑动列表

文章目录 前言一、效果图二、使用步骤1.xml布局2.代码3.HomeHxBean3.adapter4.item布局5.两个drawable 总结 前言 横向滑动列表有多种实现方式&#xff0c;也可以用tablayout&#xff0c;也可以用recyclerview&#xff0c;今天主要介绍recyclerview。 一、效果图 二、使用步骤…...

系统稳定性之上线三板斧

&#x1f4d5;我是廖志伟&#xff0c;一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》&#xff08;基础篇&#xff09;、&#xff08;进阶篇&#xff09;、&#xff08;架构篇&#xff09;清华大学出版社签约作家、Java领域优质创作者、CSDN博客专家、…...

aardio - godking.vlistEx.listbar + win.ui.tabs 实现多标签多页面切换

方法一&#xff1a; import win.ui; import godking.vlistEx.listbar; import fonts.fontAwesome; /*DSG{{*/ mainForm win.form(text"vlistEx - table adapter";right895;bottom503) mainForm.add({ custom{cls"custom";text"自定义控件";lef…...

鸿蒙 核心与非核心装饰器

HarmonyOS NEXT 版本中完整的 ArkTS 装饰器分类整理&#xff08;含核心与非核心装饰器&#xff0c;已剔除废弃特性&#xff09; 一、核心装饰器&#xff08;Essential Decorators&#xff09; 1. 组件基础 装饰器功能Entry应用入口组件&#xff0c;每个模块必须且仅有一个&am…...

TypeScript 知识框架

一、TypeScript 基础 1. 类型系统 基本类型: number, string, boolean, null, undefined, symbol, bigint 引用类型: object, array, function, class 特殊类型: any, unknown, void, never 类型推断与类型注解 类型断言 (as 语法和 <Type> 语法) 2. 接口与类型别名 接口…...

web-ui开源程序是建立在浏览器使用的基础上,旨在使 AI 代理可以访问网站

​一、软件介绍 文末提供程序和源码下载 web-ui开源程序是建立在浏览器使用的基础上&#xff0c;旨在使 AI 代理可以访问网站。WebUI&#xff1a;基于 Gradio 构建&#xff0c;支持大部分 browser-use 功能。此 UI 设计为用户友好型&#xff0c;并支持与浏览器代理轻松交互。扩…...