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

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录

Contact.h说明:

结构体与头文件的包含:  ​编辑

 函数在头文件的声明与定义:

 Contact.c中各个函数的实现:

1.检查链表中的数据是否满了,满了就扩容

 2.链表的尾插

 3.链表的删除

4.查找名字是否匹配

 5.初始化通讯录

6. 通讯录的摧毁

7.添加联系人的信息

8.删除联系人的信息 

9.修改联系人信息

 10.查找联系人

11.通讯录当前的联系人展示

ConTest.c源文件:

测试数据: 

最后完整代码展示: 

Contact.h:

Contact.c:

ConTest.c:


Contact.h说明:

概述:为了实现这个小项目,我开创了一个头文件:Contact.h .和两个源文件:Contact.c,ConTest.c,在Contact.h中进行结构体的声明,函数的声明和头文件的包含。Contact.c文件主要用于各个函数的实现,而ConTest则用于测试函数。

 

结构体与头文件的包含:  

 这里通过结构体数组来进行数据的插入与删除操作,为了后续的书写方便,将各个结构体变量的名字重新定义为其缩写形式(底层原理是顺序表

 函数在头文件的声明与定义:

void SLCheckCapacity(Contact* pocn);//用于顺序表的扩容
void SLPushBack(Contact* ps, ConDataType x);//顺序表的尾插
void SLErase(Contact* ps, int pos);//顺序表的删除
int FindByName(Contact* pocn, char name[]);//查找名字是否匹配void ContactInit(Contact* pocn);//通讯录的初始化
void ContactDestory(Contact* pocn);//通讯录的摧毁void ContactAdd(Contact* pocn);//通讯录的增加联系人
void ContactDel(Contact* pocn);//通讯录的删除联系人
void ContactModify(Contact* pocn);//通讯录的修改联系人信息
void ContactFind(Contact* pocn);//通讯录的查找
void ContactShow(Contact* pocn);//当前通讯录的信息的展示

 

 Contact.c中各个函数的实现:

1.检查链表中的数据是否满了,满了就扩容

代码详解:

//检查链表中的数据是否满了,满了就扩容
void SLCheckCapacity(Contact* pocn) {if (pocn->size == pocn->capacity) {int newCapacity = pocn->capacity == 0 ? 4 : 2 * pocn->capacity;//这里通过realloc来申请空间ConDataType* tmp = (ConDataType*)realloc(pocn->arr, newCapacity * sizeof(ConDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}//扩容成功pocn->arr = tmp;//注意要将当前的指针指向开创好的空间pocn->capacity = newCapacity;//容量也不要遗漏}
}

 由于顺序表是由数组实现的,如果定义一个静态数组,很不利于数据的存储。定义得太大浪费空间,定义得太小空间不够,这里我选择使用动态链表的形式实现这个问题,所以这里定义了一个函数SLCheckCapacity来检查链表的大小(size)是否超过其最大容量(capacity)。如果超过了,就需要进行扩容操作。没有就不需要进行任何操作。同时,为了和里这里扩容两倍。

 2.链表的尾插

代码详解:

//链表的尾插
void SLPushBack(Contact* ps, ConDataType x) {assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}

首先判断这里的结构体指针是否为空,简单粗暴的方法:断言(assert),注意要引用头文件#include<assert.h>。接着要检查顺序表的容量是否满了,如果满了就扩容。 接着将数据插入尾部。

 3.链表的删除

代码解释:

//链表的删除
void SLErase(Contact* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];}ps->size--;
}

4.查找名字是否匹配

代码解释:

//查找名字是否匹配
int FindByName(Contact* pocn, char name[]) {for (int i = 0; i < pocn->size; i++) {if (strcmp(pocn->arr[i].name, name) == 0) {return i;}}return -1;
}

如果有遗忘strcmp的小伙伴记得查收~

strcmp比较两个字符串的大小,一个字符一个字符比较,按ASCLL码比较
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字 

 5.初始化通讯录

 代码解释:

//初始化通讯录
void ContactInit(Contact* pocn) {pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}

6. 通讯录的摧毁

代码解释:

//通讯录的摧毁
void ContactDestory(Contact* pocn) {assert(pocn);if (pocn->arr) {free(pocn->arr);}pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}

7.添加联系人的信息

代码解释:

//添加联系人的信息
void ContactAdd(Contact* pocn) {Info info;//输入各个联系人的信息printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//用尾插法进行数据的增添SLPushBack(pocn, info);
}

输入联系人的各个信息后将其尾插到链表后

8.删除联系人的信息 

代码解释:

//删除联系人的信息
void ContactDel(Contact* pocn) {//删除之前要先查找//找到之后可以删除找不到,就不能进行删除操作printf("请输入要删除的联系人名字:\n");char name[NAME_MAX];scanf("%s", name);//定义findIndex来判断是否存在联系人信息int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要删除的信息不存在!\n");return;}//存在就删除SLErase(pocn, findIndex);printf("联系人删除成功!\n");
}

9.修改联系人信息

代码解释:

//修改联系人信息
void ContactModify(Contact* pocn) {//修改之前先查找//如果没有找到,就无法进行修改操作char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要修改的联系人找不到!\n");return;}//修改后输入新的联系人的信息printf("请输入姓名:\n");scanf("%s", pocn->arr[findIndex].name);printf("请输入年龄:\n");scanf("%d", &pocn->arr[findIndex].age);printf("请输入性别:\n");scanf("%s", pocn->arr[findIndex].gender);printf("请输入电话:\n");scanf("%s", pocn->arr[findIndex].tel);printf("请输入地址:\n");scanf("%s", pocn->arr[findIndex].addr);printf("联系人修改成功!\n");
}

 10.查找联系人

代码解释:

//查找联系人
void ContactFind(Contact* pocn) {printf("请输入要查找的联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("找不到该联系人,联系人不存在!\n");return;}else printf("找到了,输出对应信息:\n");printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%s %d %s %s %s\n",pocn->arr[findIndex].name,pocn->arr[findIndex].age,pocn->arr[findIndex].gender,pocn->arr[findIndex].tel,pocn->arr[findIndex].addr);
}

11.通讯录当前的联系人展示

代码解释:

//通讯录当前的联系人展示
void ContactShow(Contact* pocn) {printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");for (int i = 0; i < pocn->size; i++) {printf("%s %d %s %s %s\n",pocn->arr[i].name,pocn->arr[i].age,pocn->arr[i].gender,pocn->arr[i].tel,pocn->arr[i].addr);}
}

ConTest.c源文件:

代码详解:

//引入头文件
#include"Contact.h"void menu()//菜单的打印
{printf("-------------------------请输入--------------------------------\n");printf("----------------1.增加联系人  2.删除联系人---------------------\n");printf("---------------3.修改联系人   4.查找联系人---------------------\n");printf("---------------5.查看通讯录   0.退出通讯录---------------------\n");printf("---------------------------------------------------------------\n");
}int main()
{int op = -1;Contact con;ContactInit(&con);do {menu();printf("请选择操作:");scanf("%d", &op);//这里按照菜单的指示来选择操作switch (op) {//各个数字对应各个的操作case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("通讯录退出中……\n");break;default :break;}} while (op != 0);ContactDestory(&con);//注意结束时要摧毁通讯录,防止内存泄漏return 0;
}

在ConTest文件中,主要是实现菜单的打印与各个函数操作的选择

测试数据: 

 

 

最后完整代码展示: 

 

Contact.h:

#include<assert.h>
#include<stdlib.h>//为了后续方便,这里将所要用到的数组的数据都重新定义
#define NAME_MAX 100
#define GENDER_MAX 10
#define TEL_MAX 12
#define ADDR_MAX 100
//联系人信息的存储(用结构体实现)
typedef struct PresonInformation
{char name[NAME_MAX];int age;char gender[GENDER_MAX];char tel[TEL_MAX];char addr[ADDR_MAX];
}Info;typedef Info ConDataType;
//对链表的声明与定义(结构体数组),用于对上述结构体信息存储
typedef struct SeqList
{ConDataType* arr;int capacity;int size;
}Contact;void SLCheckCapacity(Contact* pocn);//用于顺序表的扩容
void SLPushBack(Contact* ps, ConDataType x);//顺序表的尾插
void SLErase(Contact* ps, int pos);//顺序表的删除
int FindByName(Contact* pocn, char name[]);//查找名字是否匹配void ContactInit(Contact* pocn);//通讯录的初始化
void ContactDestory(Contact* pocn);//通讯录的摧毁void ContactAdd(Contact* pocn);//通讯录的增加联系人
void ContactDel(Contact* pocn);//通讯录的删除联系人
void ContactModify(Contact* pocn);//通讯录的修改联系人信息
void ContactFind(Contact* pocn);//通讯录的查找
void ContactShow(Contact* pocn);//当前通讯录的信息的展示

Contact.c:

#include"Contact.h"
//检查链表中的数据是否满了,满了就扩容
void SLCheckCapacity(Contact* pocn) {if (pocn->size == pocn->capacity) {int newCapacity = pocn->capacity == 0 ? 4 : 2 * pocn->capacity;//这里通过realloc来申请空间ConDataType* tmp = (ConDataType*)realloc(pocn->arr, newCapacity * sizeof(ConDataType));if (tmp == NULL) {perror("realloc fail!");exit(1);}//扩容成功pocn->arr = tmp;//注意要将当前的指针指向开创好的空间pocn->capacity = newCapacity;//容量也不要遗漏}
}
//链表的尾插
void SLPushBack(Contact* ps, ConDataType x) {assert(ps);SLCheckCapacity(ps);ps->arr[ps->size++] = x;
}
//链表的删除
void SLErase(Contact* ps, int pos) {assert(ps);assert(pos >= 0 && pos < ps->size);//pos以后的数据往前挪动一位for (int i = pos; i < ps->size - 1; i++){ps->arr[i] = ps->arr[i + 1];//ps->arr[i-2] = ps->arr[i-1];}ps->size--;
}
//查找名字是否匹配
int FindByName(Contact* pocn, char name[]) {for (int i = 0; i < pocn->size; i++) {if (strcmp(pocn->arr[i].name, name) == 0) {return i;}}return -1;
}//初始化通讯录
void ContactInit(Contact* pocn) {pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}
//通讯录的摧毁
void ContactDestory(Contact* pocn) {assert(pocn);if (pocn->arr) {free(pocn->arr);}pocn->arr = NULL;pocn->capacity = pocn->size = 0;
}
//添加联系人的信息
void ContactAdd(Contact* pocn) {Info info;//输入各个联系人的信息printf("请输入联系人姓名:\n");scanf("%s", info.name);printf("请输入联系人年龄:\n");scanf("%d", &info.age);printf("请输入联系人性别:\n");scanf("%s", info.gender);printf("请输入联系人电话:\n");scanf("%s", info.tel);printf("请输入联系人地址:\n");scanf("%s", info.addr);//用尾插法进行数据的增添SLPushBack(pocn, info);
}//删除联系人的信息
void ContactDel(Contact* pocn) {//删除之前要先查找//找到之后可以删除找不到,就不能进行删除操作printf("请输入要删除的联系人名字:\n");char name[NAME_MAX];scanf("%s", name);//定义findIndex来判断是否存在联系人信息int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要删除的信息不存在!\n");return;}//存在就删除SLErase(pocn, findIndex);printf("联系人删除成功!\n");
}
//修改联系人信息
void ContactModify(Contact* pocn) {//修改之前先查找//如果没有找到,就无法进行修改操作char name[NAME_MAX];printf("请输入要修改的联系人姓名:\n");scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("要修改的联系人找不到!\n");return;}//修改后输入新的联系人的信息printf("请输入姓名:\n");scanf("%s", pocn->arr[findIndex].name);printf("请输入年龄:\n");scanf("%d", &pocn->arr[findIndex].age);printf("请输入性别:\n");scanf("%s", pocn->arr[findIndex].gender);printf("请输入电话:\n");scanf("%s", pocn->arr[findIndex].tel);printf("请输入地址:\n");scanf("%s", pocn->arr[findIndex].addr);printf("联系人修改成功!\n");
}
//查找联系人
void ContactFind(Contact* pocn) {printf("请输入要查找的联系人姓名:\n");char name[NAME_MAX];scanf("%s", name);int findIndex = FindByName(pocn, name);if (findIndex < 0) {printf("找不到该联系人,联系人不存在!\n");return;}else printf("找到了,输出对应信息:\n");printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");printf("%s %d %s %s %s\n",pocn->arr[findIndex].name,pocn->arr[findIndex].age,pocn->arr[findIndex].gender,pocn->arr[findIndex].tel,pocn->arr[findIndex].addr);
}
//通讯录当前的联系人展示
void ContactShow(Contact* pocn) {printf("%s %s %s %s %s\n", "姓名", "年龄", "性别", "电话", "地址");for (int i = 0; i < pocn->size; i++) {printf("%s %d %s %s %s\n",pocn->arr[i].name,pocn->arr[i].age,pocn->arr[i].gender,pocn->arr[i].tel,pocn->arr[i].addr);}
}

ConTest.c:

//引入头文件
#include"Contact.h"void menu()//菜单的打印
{printf("-------------------------请输入--------------------------------\n");printf("----------------1.增加联系人  2.删除联系人---------------------\n");printf("---------------3.修改联系人   4.查找联系人---------------------\n");printf("---------------5.查看通讯录   0.退出通讯录---------------------\n");printf("---------------------------------------------------------------\n");
}int main()
{int op = -1;Contact con;ContactInit(&con);do {menu();printf("请选择操作:");scanf("%d", &op);//这里按照菜单的指示来选择操作switch (op) {//各个数字对应各个的操作case 1:ContactAdd(&con);break;case 2:ContactDel(&con);break;case 3:ContactModify(&con);break;case 4:ContactFind(&con);break;case 5:ContactShow(&con);break;case 0:printf("通讯录退出中……\n");break;default :break;}} while (op != 0);ContactDestory(&con);//注意结束时要摧毁通讯录,防止内存泄漏return 0;
}

博客到这里也是结束了,制作不易,喜欢的小伙伴可以点赞加关注支持下博主,这对我真的很重要~~

 

相关文章:

数据结构小项目----通讯录的实现(这里用链表实现) 超详细~~~~૮(˶ᵔ ᵕ ᵔ˶)ა

目录 Contact.h说明&#xff1a; 结构体与头文件的包含&#xff1a; ​编辑 函数在头文件的声明与定义&#xff1a; Contact.c中各个函数的实现&#xff1a; 1.检查链表中的数据是否满了&#xff0c;满了就扩容 2.链表的尾插 3.链表的删除 4.查找名字是否匹配 5.初始化通讯…...

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…...

常用中间件漏洞

IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…...

Windows系统使用手册

点击前往查看&#x1f517;我的博客文章目录 Windows系统使用手册 文章目录 Windows系统使用手册Windows10解决大小核调度问题Windows系统安装软件Windows系统Typora快捷键Windows系统压缩包方式安装redisWindows安装dockerWindows系统的docker设置阿里源Windows系统下使用doc…...

mp4文件可以转成mp3音频吗

现在是个非常流行刷短视频一个年代&#xff0c;刷短视似乎成了人们休闲娱乐的一种方式&#xff0c;在日常刷短视频过程中&#xff0c;肯定会有很多同学被短视频 bgm 神曲洗脑&#xff0c;比如很多被网红翻唱带火的歌曲&#xff0c;例如其中"不负人间”&#xff0c;就是其中…...

Java-IO流【登录注册小项目】

♥️作者&#xff1a;白日参商 &#x1f935;‍♂️个人主页&#xff1a;白日参商主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识&#xff0c;和大家一起努力呀&#xff01;&#xff01;&#xff01; &#x1f388;&#x1f388;加油&#xff01; 加油&#xff01…...

数字化金融时代:探讨全球金融科技创新的最新动态

在当今数字化金融时代&#xff0c;金融科技创新如影随形&#xff0c;迅猛发展。本文将深入探讨全球范围内金融科技的最新动态&#xff0c;剖析各地新兴趋势与突破。从区块链技术的应用到人工智能在金融领域的崭露头角&#xff0c;我们将一一解读这个正在不断演变的金融科技画卷…...

LeetCode:206. 反转链表

力扣链接 算法思想&#xff1a;由于单链表是单向的&#xff0c;想要对当前元素进行操作&#xff0c;需找到前一个元素。本题利用双指针&#xff0c;初始pre指针指向NULL&#xff0c;cur指针指向head.再对局部翻转之前&#xff0c;先把下一个结点存到temp指针中。当进行完如下代…...

linux 安装nginx

介绍 官网 https://nginx.org/en/download.html 在安装nginx前首先要确认系统中安装了gcc、pcre-devel、zlib-devel、openssl-devel linux 检查是否安装过某软件包 yum -y install gcc pcre-devel zlib-devel openssl openssl-devel #下载 wget https://nginx.org/downloa…...

1.C语言——基础知识

C语言基础知识 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…...

Redis 存在线程安全问题吗?为什么?

一个工作了 5 年的粉丝私信我。 他说自己准备了半年时间&#xff0c;想如蚂蚁金服&#xff0c;结果第一面就挂了&#xff0c;非常难过。 问题是&#xff1a; “Redis 存在线程安全问题吗&#xff1f;” 一、问题解析 关于这个问题&#xff0c;我从两个方面来回答。 第一个&a…...

无人机测绘助力实现高效、安全的城市规划

随着城市化进程的不断加快&#xff0c;城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具&#xff0c;为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析&#xff0c;为行业提供有力的决策支持&#xff0c;助力城市规划的现代化和可持续发…...

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…...

未来 AI 可能给哪些产业带来哪些进步与帮助?

AI时代如何要让公司在创新领域领先吗&#xff1f;拥抱这5种创新技能&#xff0c;可以帮助你的公司应对不断变化。包括人工智能、云平台应用、数据分析、 网络安全和体验设计。这些技能可以帮助你提高业务效率、保护公司知识资产、明智决策、满足客户需求并提高销售额。 现在就加…...

Java医院信息管理系统

技术框架&#xff1a; springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境&#xff1a; jdk8 mysql IntelliJ IDEA maven项目功能&#xff1a; 本项目是用springbootlayuishiro写的医院管理系统&#xff0c;系统的业务比较复杂&#x…...

QT+OSG/osgEarth编译之八十:ive+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_ive)

文章目录 1、osgdb_ive介绍2、文件分析3、pro文件4、编译实践1、osgdb_ive介绍 通过osgdb_ive,OpenSceneGraph开源库能方便地读取ive格式的三维文件。 ive(Interchangeable Virtual Environment)是一种三维图形数据交换格式,主要用于虚拟现实和增强现实领域的场景数据交…...

Webpack5入门到原理3:基本配置

在开始使用 Webpack 之前&#xff0c;我们需要对 Webpack 的配置有一定的认识。 5 大核心概念 entry&#xff08;入口&#xff09; 指示 Webpack 从哪个文件开始打包 output&#xff08;输出&#xff09; 指示 Webpack 打包完的文件输出到哪里去&#xff0c;如何命名等 l…...

全开源多城市同城信息小程序源码(Laravel 框架),同城分类信息发布便民小程序系统【非DZ】

同城生活分类信息小程序&#xff0c;人才招聘、房产二手 多城市地区同城分类信息发布&#xff0c;商家入驻等功能 小程序前后端代码开源无加密&#xff0c;可进行二次开发 【源码运行要求】 1、需要已认证的微信小程序 2、已备案的域名及服务器空间 推荐使用宝塔面板LinuxPHP…...

PHP学习笔记1

//语法错误&#xff08;syntax error&#xff09;在语法分析阶段&#xff0c;源代码并未被执行&#xff0c;故不会有任何输出。 /* 【命名规则】 */ 常量名 类常量建议全大写&#xff0c;单词间用下划线分隔 // MIN_WIDTH 变量名建议用下划线方式分隔 // $var_na…...

C语言从入门到实战——文件操作

文件操作 前言一、 为什么使用文件二、 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 三、 二进制文件和文本文件四、 文件的打开和关闭4.1 流和标准流4.1.1 流4.1.2 标准流 4.2 文件指针4.3 文件的打开和关闭4.4 文件的路径 五、 文件的顺序读写5.1 顺序读写函数介绍fgetcfp…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...