C语言之通讯录的实现篇
目录
test.c
创建通讯录con
初始化通讯录InitContact
增加个人信息AddContact
展示个人信息ShowContact
删除个人信息DelContact
查找个人信息SearchContact
修改个人信息ModifyContact
test.c总代码
contact.h
头文件包含
PeoInfo_个人信息的设置声明
Contact_存放个人信息声明
InitContact_初始化个人信息声明
AddContact_增加个人信息
ShowContact_展示个人信息
DelContact_删除个人信息
SearchContact_查找个人信息
ModifyContact_修改个人信息
contact.h总代码
contact.c
InitContact_初始化个人信息
AddContact_增加个人信息
ShowContact_展示个人信息
DelContact_删除个人信息
FindByName查找函数
SearchContact_查找个人信息
ModifyContact_修改个人信息
contact.c总代码
今天实现同通讯录的功能。在学习了结构体和其他的自定义的类型之后,我们就可以实现一个的通讯录。
实现一个通讯录:
- 可以保存100个人的信息
- 增加人的信息
- 删除指定联系人的信息
- 查找指定联系人的信息
- 修改指定联系人的信息
- 显示所有联系人的信息
- 排序通讯录的信息
- 一个人的信息包括:名字+年龄+性别+电话+住址
那接下来我们将从test.c 测试代码 contact.h 声明 contact.c 实现 去实现
test.c
主菜单menu
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("************************************");printf("********1.add 2.del************");printf("********3.search 4.modify*********");printf("********5.show 6.sort***********");printf("********0.exit ***********");printf("************************************");
}
enum Option
{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5SORT,//6
};
int main()
{int input = 0;Contact con;//创建通讯录condo{menu();printf("请输入你的选择:>\n");scanf("%d", &input);switch (input)//这里为了代码更加清晰用枚举常量{case ADD:break;case DEL:break;case SEARCH:break;case MODIFY:break;case SHOW:break;case SORT:break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择:>\n");break;}} while (input);return 0;
}
- 菜单是根据用户需求而设计
- 使用枚举常量 为了让程序员写代码 更加清晰
创建通讯录con
Contact con;//创建通讯录con
初始化通讯录InitContact
InitContact(&con);
这里需要特别注意的是,结构体传参到底是传值还是传地址??🆗忘了小朋友戳一戳
C语言之结构体篇_唐唐思的博客-CSDN博客
增加个人信息AddContact
AddContact(&con);
展示个人信息ShowContact
ShowContact(&con);//即使这里不需要& 但是出于效率考虑还是需要
删除个人信息DelContact
DelContact(&con);
查找个人信息SearchContact
SearchContact(&con);
修改个人信息ModifyContact
ModifyContact(&con);
test.c总代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{printf("************************************");printf("********1.add 2.del************");printf("********3.search 4.modify*********");printf("********5.show 6.sort***********");printf("********0.exit ***********");printf("************************************");
}
enum Option
{EXIT,//0ADD,//1DEL,//2SEARCH,//3MODIFY,//4SHOW,//5SORT,//6
};
int main()
{int input = 0;//创建通讯录Contact con;//初始化通讯录InitContact(&con);do{menu();printf("请输入你的选择:>\n");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 SORT:break;case EXIT:printf("退出通讯录\n");break;default:printf("选择错误,请重新选择:>\n");break;}} while (input);return 0;
}
contact.h
contact.h文件主要是头文件的包含
头文件包含
在我们写代码的过程中,会调用库函数,需要包含头文件,和声明函数。
所以我们将所有函数声明和头文件放到我们.h 文件中。
当然,在其他.c文件需要使用时,我们只需要包含 我们创造的 头文件"contact.h" 即可。
- 自己创建的头文件用" " 双引号,库函数的头文件用< >
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
PeoInfo_个人信息的设置声明
我们怎样去设置一个人的全部信息呢?姓名+年龄+性别+电话+住址 都是需要不同类型的变量去设置,所以我们把它们都放到【结构体】里面。
#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;
- typedef是定义结构体类型由struct PeoInfo---> PeoInfo (这样后面使用定义变量时类型就直接写PeoInfo就可以了)
- 数组【】里面如果是常量 那就后期想修改是非常不方便的,所以我们自己定义NAME_MAX等,后期修改起来更加方便。
Contact_存放个人信息声明
如果我想存放100个人的信息,那我们怎样去存放100个人的信息呢?用结构体数组(所谓就是存放结构体类型变量的数组)
#define MAX 100
typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录当前通讯录中存放的人的信息个数
}Contact;//通讯录
- typedef是定义结构体类型由struct Contact---> Contact (这样后面使用定义变量时类型就直接写Contact就可以了)
- 数组【】里面如果是常量 那就后期想修改是非常不方便的,所以我们自己定义MAX等,后期修改起来更加方便。
- 可以通俗理解为:一个结构体类型的数组data里面存放一个一个的结构体数据。一个结构体类型的数据就是PeoInfo
InitContact_初始化个人信息声明
初步创建完成我们的通讯录,那我们调试发现通讯录里面全是随机值,所以我们需要封装一个函数去初始化个人信息。
void InitContact(Contact* pc);
AddContact_增加个人信息
void AddContact(Contact* pc);
ShowContact_展示个人信息
void ShowContact(Contact* pc);
DelContact_删除个人信息
void DelContact(Contact *pc);
SearchContact_查找个人信息
void SearchContact(Contact* pc);
ModifyContact_修改个人信息
void ModifyContact(Contact* pc);
contact.h总代码
#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);printf("请输入名字\n");scanf("%s", pc->data[pc->sz].name);//name是数组名,不用&printf("请输入年龄\n");scanf("%s", &(pc->data[pc->sz].age));//printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].addr);//pc->sz++;printf("增加成功\n");
}void ShowContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空,无需打印\n");return 0;}int i = 0;//名字 年龄 性别 电话 地址//-左对齐//20是需要20字符的位置来放名字 printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}void DelContact(Contact* pc)//删除
{char name[NAME_MAX];//assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}printf("输入要删除的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}//存在返回这个人的所在data的下标放入retint i = 0;for (i = ret; i < pc -> sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}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 SearchContact(Contact* pc)
{char name[NAME_MAX];assert(pc);//查找printf("输入要查找的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}//显示printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);//查找printf("输入要修改的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}//修改assert(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->sz].name);//name是数组名,不用&printf("请输入年龄\n");scanf("%s", &(pc->data[pc->sz].age));//printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].addr);//printf("修改成功\n");
}
contact.c
InitContact_初始化个人信息
void InitContact(Contact* pc)
{assert(pc);pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));
}
- 传地址的结构体访问两种方式:-> *( ).
- 关于memset内存函数的复习,戳一戳:C语言之内存函数篇(3)_唐唐思的博客-CSDN博客
- data是数组名 访问数组名即访问数组的第一个元素,单独放在sizeof里面,整个数组的大小
- 不要遗忘assert去断言,这里要修改pc指向的空间修改,所以不需要const修饰。
完成了我们的通讯录的初始化,感觉要长脑子了。 接下来一步一步实现它的功能。
AddContact_增加个人信息
首先,这幅图想说明: data的下标和sz的数值是对应的
void AddContact(Contact* pc)
{assert(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->sz].name);//name是数组名,不用&printf("请输入年龄\n");scanf("%d", &(pc->data[pc->sz].age));//printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].addr);//pc->sz++;printf("增加成功\n");
}
- scanf输入 %d %s
- scanf输入&
- 结构体访问成员
ShowContact_展示个人信息
我们改动了通讯录之后,我们都需要去观察一下通讯录,这个时候需要封装函数去实现这个功能
void ShowContact(const Contact* pc)
{assert(pc);if (pc->sz == 0){printf("通讯录为空,无需打印\n");return 0;}int i = 0;//名字 年龄 性别 电话 地址//-左对齐//20是需要20字符的位置来放名字 printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
- const 和 assert
- 结构体的访问
- 一定要判断一下通讯录里的是否有数据
- 格式美观:%-20s 是左对齐20个字符的空间大小
- %s %d
DelContact_删除个人信息
删除联系人,我们首先需要找到联系人,我们就去封装一个查找的函数【FindByname】:把通讯录遍历一遍,找到了就返回下标,找不到就返回-1。其实我们发现后面 查找 修改 删除的功能都需要用这个函数。
void DelContact(Contact* pc)//删除
{char name[NAME_MAX];//assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}printf("输入要删除的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要删除的人不存在\n");return;}//存在返回这个人的所在data的下标放入retint i = 0;for (i = ret; i < pc -> sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}
FindByName查找函数
static 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;
}
SearchContact_查找个人信息
void SearchContact(Contact* pc)
{char name[NAME_MAX];assert(pc);//查找printf("输入要查找的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要查找的人不存在\n");return;}//显示printf("%-20s%-5s%-5s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");int i = 0;for (i = 0; i < pc->sz; i++){printf("%-20s%-5d%-5s%-12s%-30s\n",pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele, pc->data[i].addr);}
}
ModifyContact_修改个人信息
void ModifyContact(Contact* pc)
{char name[NAME_MAX];assert(pc);//查找printf("输入要修改的名字:>");scanf("%s", name);int ret = FindByName(pc, name);if (ret == -1){printf("要修改的人不存在\n");return;}//修改assert(pc);printf("请输入名字\n");scanf("%s", pc->data[pc->sz].name);//name是数组名,不用&printf("请输入年龄\n");scanf("%s", &(pc->data[pc->sz].age));//printf("请输入性别\n");scanf("%s", pc->data[pc->sz].sex);printf("请输入电话\n");scanf("%s", pc->data[pc->sz].tele);printf("请输入地址\n");scanf("%s", pc->data[pc->sz].addr);//printf("修改成功\n");
}
contact.c总代码
#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 30
#define MAX 100
typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];//存放数据int sz;//记录当前通讯录中存放的人的信息个数
}Contact;//初始化通讯录
void InitContact(Contact* pc);//增加个人信息
void AddContact(Contact* pc);//展示个人信息
void ShowContact(Contact* pc);//删除个人信息
void DelContact(Contact *pc);//查找个人信息
void SearchContact(Contact* pc);//修改个人信息
void ModifyContact(Contact* pc);
✔✔✔✔✔最后,感谢大家的阅读,若有错误和不足,欢迎指正!
希望大家都有好好学习,好好敲代码。好好生活哦
代码------→【gitee:唐棣棣 (TSQXG) - Gitee.com】
联系------→【邮箱:2784139418@qq.com】
相关文章:

C语言之通讯录的实现篇
目录 test.c 主菜单menu 创建通讯录con 初始化通讯录InitContact 增加个人信息AddContact 展示个人信息ShowContact 删除个人信息DelContact 查找个人信息SearchContact 修改个人信息ModifyContact test.c总代码 contact.h 头文件包含 PeoInfo_个人信息的设置声…...

如何降低海康、大华等网络摄像头调用的高延迟问题(二)
目录 1.RTSP介绍 2.解决办法1 3.解决办法2 1.RTSP介绍 RTSP(Real-time Streaming Protocol)是一种用于实时流媒体传输的网络协议。它被设计用于在服务器和客户端之间传输音频、视频以及其他流媒体数据。 RTSP协议允许客户端通过与服务器建立RTSP会话…...
centos清理日志和缓存
今天使用redmine修改密码,修改报错,再去试试创建用户,创建用户的页面直接报错显示不出来。然后看了一下服务器,发现服务器磁盘空间全部占满了。 CentOS系统也会在使用很长一段时间后出现硬盘空间开始不够的情况,而这并…...
排序算法的稳定性
什么是排序算法的稳定性? 排序算法的稳定性: 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i] r[j],且 r[i…...

kafka属性说明
kafka中关于一些字段说明 groupId :标识消费者分组id,如果多个消费者id相同,就表示这几个消费者是一组,当一组多个消费者消费同一个topic时,一组中只会有一个成功消费 代码如下 这时只会有一条消息被消费...
STM32F4使用ucosii时操作浮点数卡死的问题
STM32F4使用ucosii时操作浮点数卡死的问题_stm32 fpu float 程序跑不起来_shou撕代码的博客-CSDN博客...

python练习:赋值运算 => 输入身高,体重,求BMI = 体重(kg)/身高(m)的平方。
赋值运算 > 输入身高,体重,求BMI 体重(kg)/身高(m)的平方。 代码: height float(input(‘请输入您的身高(m):’)) weight float(input(‘请输入您的体重(kg):’))…...
PCL ICP精配准(点到点)
文章目录 一、简介二、实现过程三、实现效果参考资料一、简介 迭代最近点(ICP)算法作为是目前最常用的刚性点集配准方法,它有着简单、计算复杂度低等优点,该算法的具体计算过程如下: (1)在目标点云P中取点集 p i ∈ P p_i∈P p...
Redis数据缓存(Redis的缓存击穿和穿透的区别)
Redis是一个高性能的内存中数据存储系统,可以使用它作为数据缓存。使用Redis作为数据缓存可以提高应用程序的性能和可伸缩性,因为Redis运行在内存中,读写速度非常快。 Redis支持许多数据结构,如字符串、哈希表、列表、集合和有序…...

八大排序算法(含时间复杂度、空间复杂度、算法稳定性)
文章目录 八大排序算法(含时间复杂度、空间复杂度、算法稳定性)1、(直接)插入排序1.1、算法思想1.2、排序过程图解1.3、排序代码 2、希尔排序3、冒泡排序3.1、算法思想3.2、排序过程图解3.3、排序代码 4、(简单)选择排序4.1、算法…...

【C++】:引用的概念/引用的特性/常引用/引用的使用场景/传值与传引用的效率比较/引用和指针的区别/内联函数的概念/内联函数的特性
引用的概念 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间 比如:李逵,在家称为"铁牛",江湖上人称"黑旋风&…...
Python点云处理(十七)点云地面点提取——基于格网算法
目录 0 简述1 算法流程2 优缺点3 实现4 效果5 结语0 简述 提取地面点是点云数据分析和处理中的重要任务,而点云格网法是一种常用的地面点提取方法。点云格网法(Grid-based Method),通过将点云数据划分为网格单元,根据高程值分析来实现地面点的提取。 1 算法流程 步骤1:…...
Flink 中kafka broker缩容导致Task一直重启
背景 Flink版本 1.12.2 Kafka 客户端 2.4.1 在公司的Flink平台运行了一个读Kafka计算DAU的流程序,由于公司Kafka的缩容,直接导致了该程序一直在重启,重启了一个小时都还没恢复(具体的所容操作是下掉了四台kafka broker࿰…...
纯前端js中使用sheetjs导出excel,并且合并标题
先定义变量----用的是Vue2 ,以下在vue的data:{}中定义--------------//空格占位符 headerTopTitle: [患者信息, , , , , , , , , 入出院信息, , , , , , , 病案首页中的出院主要诊断, ,出院其他诊断(病案首页中原始信息), , , , ,…...
猫眼 校园招聘_1面
(1)打包和构建工具 vite 和 webpack 功能 1. 构建原理: Webpack 是一个静态模块打包器,通过对项目中的JavaScript、css、Image 等文件进行分析,生成对应的静态资源,并且通过一些插件和加载器来实现各种功…...

博弈论——博弈信息结构
博弈信息结构 0 引言 在一个博弈构成中,博弈信息结构是不可或缺要素。博弈信息,顾名思义,就是在博弈中,博弈方对于信息的了解。知己知彼,百战不殆。和短兵相接的战争一样,只有充分了解自己的优劣势&#x…...

求二叉树的高度——函数递归的思想
二叉树的高度:左右两个数最高的那个的1 int TreeHight(BTNode* root) {if (root NULL){return 0;}int lefhightTreeHight(root->left);int righthight TreeHight(root->right);return lefhight > righthight ? TreeHight(root->left) 1 : TreeHight…...

ue5蓝图请求接口
安装与使用 1、在虚幻商城搜索 VaRest 插件 2、选择自己项目的对应版本安装 3、查看是否安装成功 4、进入项目后,分别启动VaRest、JSON Blueprint Utilities两个插件(勾选后会提示重启项目) 5、基本用法:打开关卡蓝图使用…...

windows server 2012 查看已打了哪些补丁
打开控制面板 点击卸载程序 点击 查看已安装的更新 下图是已安装的补丁...
参加CSP-J第一轮后的感受
本人现在初二。作为一名学了4年多c的人,我一直都挺想考过CSP。于是,去年我就去考了。 当时初一,感觉自己实力不够,就只报了J组的。果不其然,63分,没过。 经过1年的苦练,今年又去考了。 J组78分&…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...