【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录
目录
C系列文章目录
前言
一,模块化编程
二,系统框架构建
1.成员信息的创建
2.菜单实现
3.系统功能声明
三、系统功能实现
1.初始化通讯录
2.增加联系人
3.显示所有联系人
4.根据姓名查找位置
5.删除指定联系人
6.查找指定联系人
7.修改指定联系人
8.清空所有联系人
9.按照名字排序所有联系人
四,源文件展示
1.test.c
2.game.c
3.game.h
总结
前言
通过使用C语言来创建一个通讯录的管理系统,管理人员可对成员信息进行管理。成员信息包括姓名、年龄、电话、性别以及住址,执行操作有增删改查这四项基本操作以及成员信息全览和信息排序。
一,模块化编程
-
可维护性:模块化编程将代码划分为独立的模块,每个模块负责特定的任务或功能。这样,在需要修改或调试某个功能时,只需关注相关的模块,而不需要涉及整个程序。这大大简化了维护和调试的工作,使得代码更易于理解和修改。
-
重用性:模块化编程鼓励开发人员将一些常用的功能封装成模块,然后在不同的项目中重复使用。这样可以避免重复编写相同的代码,减少了开发工作量,提高了开发效率。同时,通过不断重用经过测试和验证的模块,可以提高代码的可靠性和稳定性。
-
可扩展性:当需要添加新的功能或修改现有功能时,模块化编程能够提供更好的可扩展性。由于模块之间的依赖关系明确定义和管理,可以单独修改或替换某个模块,而不会影响到其他模块。这种灵活性使得系统更容易适应变化和演化。
-
并行开发:模块化编程允许多个开发人员并行工作,每个人负责开发和测试不同的模块。这样可以提高开发效率,缩短项目的开发周期。同时,模块化编程也方便团队协作和沟通,降低了开发过程中的冲突和合并的风险。
-
可测试性:模块化编程使得单元测试更容易进行。每个模块都是相对独立的,可以单独测试其功能和性能。这样可以更容易地发现和修复问题,提高软件的质量和稳定性。
总之,模块化编程的优势包括可维护性、重用性、可扩展性、并行开发和可测试性。这些优势使得代码更易于理解、修改和维护,提高了开发效率和软件质量。
在学习通讯录管理系统前,我们先了解模块化编程,模块化编程的思想可以让我们更好的进行编程,让我们更好的理解接下来的通讯录管理系统过程。
二,系统框架构建
1.成员信息的创建
因为我们要输入成员信息较多,所有我们可以选择通过创建结构体来创建一个通讯录结构体和一个成员信息结构体。
通讯录结构体内部会嵌套一个成员信息结构体和一个表示成员数量的变量。
typedef struct PeoInfo//创建成员信息结构体
{char name[FILENAME_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;
2.菜单实现
首先对于我们要创建的通讯录管理系统来说,建立一个菜单让人们选择功能是非常重要的,这就好比在一个餐厅里,只有提供了一份菜单,顾客就可以根据自己的意愿的点菜,在操作界面显示一个完整简明的菜单,才能更好地管理通讯录系统。
void nume()
{printf("*******************************\n");printf("***** 通讯录管理系统 ******\n");printf("*** 1.add 2.del ****\n");//增加和删除指定联系人printf("*** 3.search 4.modify***\n");//查找和修改指定联系人printf("*** 5.show 6.sort ****\n");//显示和排序所有联系人printf("*** 7.empty 0.exit ****\n");//清除所有联系人,和退出程序printf("*******************************\n");
}
3.系统功能声明
//对通讯录进行初始化
void InitContact(Contact* pc);//增加联系人
void AddContact(Contact* pc);//显示联系人
void ShowContact(Contact* pc);//删除联系人
void DelContact(Contact* pc);//查找联系人
void SearchContact(Contact* pc);//修改联系人
void ModifyContact(Contact* pc);//清空所有联系人
void QingContact(Contact* pc);//排序联系人
void PaiContact(Contact* pc);
三、系统功能实现
1.初始化通讯录
为什么要对通讯录进行初始化呢,因为在创建了通讯录之后,里边的所有信息的以随机值的形式存在,不知道的还以为这个通讯录里已经存放了成员信息,所以要进行初始化。
//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);//防止空指针pc->sz = 0;//将sz初始化为0memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}
2.增加联系人
//增加联系人
void AddContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了{printf("通讯录已满,无法增加\n");return;}//通讯录没有满就输入else{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].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;//一个结构体数据填满后,就在继续填充下一个printf("增加成功\n");}
}
3.显示所有联系人
//打印所有联系人
void ShowContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == 0)//检查sz是否是指向开头{printf("通讯录为空,无需打印\n");return;}int i = 0;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);}
}
4.根据姓名查找位置
这个函数的存在就是为了通讯录管理人员通过成员姓名来查找该成员信息所处的位置。
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)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1{return i;}}return -1;
}
5.删除指定联系人
//删除指定联系人
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;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}
6.查找指定联系人
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", "名字", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}
7.修改指定联系人
//修改联系人
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;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功\n");
}
8.清空所有联系人
//清空所有联系人
void QingContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("删除成功\n");}
9.按照名字排序所有联系人
使用qsort函数经行排序
//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{assert(pc);qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);int i = 0;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);}
}
四,源文件展示
1.test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void nume()
{printf("*******************************\n");printf("***** 通讯录管理系统 ******\n");printf("*** 1.add 2.del ****\n");//增加和删除指定联系人printf("*** 3.search 4.modify***\n");//查找和修改指定联系人printf("*** 5.show 6.sort ****\n");//显示和排序所有联系人printf("*** 7.empty 0.exit ****\n");//清除所有联系人,和退出程序printf("*******************************\n");
}
enum Option
{EXIT,ADD,DEL,SEARCH,MODIFY,SHOW,SORT,EMPTY,
};
int main()
{int input = 0;Contact con;InitContact(&con);do{nume();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 SORT:PaiContact(&con);break;case EMPTY:QingContact(&con);break;default:break;}} while(input);return 0;
}
2.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);//防止空指针pc->sz = 0;//将sz初始化为0memset(pc->data, 0, sizeof(pc->data));//数组名,替换,替换数
}
//增加联系人
void AddContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == MAX)//表示通讯录结构体的开辟的空间满了{printf("通讯录已满,无法增加\n");return;}//通讯录没有满就输入else{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].tele);printf("请输入地址:");scanf("%s", pc->data[pc->sz].addr);pc->sz++;//一个结构体数据填满后,就在继续填充下一个printf("增加成功\n");}
}
//打印所有联系人
void ShowContact(Contact* pc)
{assert(pc);//防止空指针if (pc->sz == 0)//检查sz是否是指向开头{printf("通讯录为空,无需打印\n");return;}int i = 0;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);}
}
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)//对比数据是否相同,如果相同就返回该指针的指向数据,不相同就返回-1{return i;}}return -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;}int i = 0;for (i = ret; i < pc->sz - 1; i++){pc->data[i] = pc->data[i + 1];}pc->sz--;printf("删除成功\n");
}
//查找联系人
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", "名字", "年龄", "性别", "电话", "地址");printf("%-20s%-5d%-5s%-12s%-30s%\n", pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].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;}printf("请输入名字:");scanf("%s", pc->data[ret].name);printf("请输入年龄:");scanf("%d", &(pc->data[pc->sz].age));printf("请输入性别:");scanf("%s", pc->data[ret].sex);printf("请输入电话:");scanf("%s", pc->data[ret].tele);printf("请输入地址:");scanf("%s", pc->data[ret].addr);printf("修改成功\n");
}
//清空所有联系人
void QingContact(Contact* pc)
{char name[NAME_MAX];assert(pc);if (pc->sz == 0){printf("通讯录为空,无法删除\n");return;}pc->sz = 0;memset(pc->data, 0, sizeof(pc->data));printf("删除成功\n");}
//排序所有人
int cmp_s(const void* elem1, const void* elem2)
{return strcmp((char*)elem1, (char*)elem2);
}
void PaiContact(Contact* pc)
{assert(pc);qsort(pc, pc->sz, sizeof(pc->data[0]), cmp_s);int i = 0;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);}
}
3.game.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100typedef struct PeoInfo
{char name[FILENAME_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);//清空所有联系人
void QingContact(Contact* pc);//排序联系人
void PaiContact(Contact* pc);
总结
本篇文章详细的,有体系的介绍了通讯录管理系统的结构,方便我们小白的更加理解C语言的自定义结构体。
相关文章:
【C语言】通讯录管理系统(保姆级教程+内含源码)
C系列文章目录 目录 C系列文章目录 前言 一,模块化编程 二,系统框架构建 1.成员信息的创建 2.菜单实现 3.系统功能声明 三、系统功能实现 1.初始化通讯录 2.增加联系人 3.显示所有联系人 4.根据姓名查找位置 5.删除指定联系人 6.查找指定联…...

python自动解析301、302重定向链接
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 使用模块requests 方式代码如下: import requests url_string"http://******" r requests.head(url_string, streamTrue) print r.h…...
【未解决问题】opencv 交叉编译 ffmpeg选项始终为NO
opencv 打不开视频的原因 在交叉编译时候,发现在 pc 端能用 opencv 打开的视频,但是在 rv1126 上打不开。在网上查了很久,原因可能是 ffmpeg 造成的。 解决opencv源代码编译找不到ffmpeg-CSDN博客 交叉编译 ffmpeg 尝试了一天还是第二个博客…...

Python实用技术二:数据分析和可视化(2)
目录 一,多维数组库numpy 1,操作函数: 2,numpy数组元素增删 1)添加数组元素 2)numpy删除数组元素 3)在numpy数组中查找元素 4)numpy数组的数学运算 3,numpy数…...

24Hibench
1. Hibench 官网 HiBench is a big data benchmark suite that helps evaluate different big data frameworks in terms of speed, throughput and system resource utilizations. It contains a set of Hadoop, Spark and streaming workloads, including Sort, WordCou…...
VC++父进程交互式操作子进程标准输入输出
父进程接管子进程的标准输入输出和错误,实现对子进程的交互操作。比如子进程是一个类似mysql这种可以交互的命令,执行操作后输出结果,父进程根据结果分析决定执行下一步的命令,从而替代人工的输入。 通过父进程创建子进程,使用管道重定向子进程的输入输出错误可以实现 在 …...

一步一招,教你如何制作出成功的优惠促销微传单
在当今的数字化时代,几乎所有的事情都可以在互联网上完成,包括制作宣传单。有很多在线工具可以帮助我们轻松制作出精美的商场促销宣传单。下面就以乔拓云为例,详细介绍如何简单几步制作出让人眼前一亮的商场促销宣传单。 1. 注册并登录乔拓云…...

27、Flink 的SQL之SELECT (Pattern Recognition 模式检测)介绍及详细示例(7)
Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…...

Git使用【上】
欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析3 前言 先前有些git命令我在我的其它文章里面已经写过,若要查看可参考【Linu…...

flink的序列化基准测试
背景: flink提供了在本地环境使用jmh测试不同序列化方法的性能差异,本文就是基于这个https://github.com/apache/flink-benchmarks这个性能测试,总结几个结论,以便后面使用时避免掉坑 基准测试 我们本次运行的是SerializationF…...

Error: node: unknown or unsupported macOS version: :dunno 错误解决
一、原因 今天安装 brew install node报错了,错误信息如下: 二、解决方案 1)查找homebrew-cask安装位置 echo $(brew --repo homebrew/homebrew-cask) // 输出 /opt/homebrew/Library/Taps/homebrew/homebrew-cask2)使用 gi…...

嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理②
嵌入式Linux应用开发-基础知识-第十八章系统对中断的处理② 第十八章 Linux系统对中断的处理 ②18.3 Linux中断系统中的重要数据结构18.3.1 irq_desc数组18.3.2 irqaction结构体18.3.3 irq_data结构体18.3.4 irq_domain结构体18.3.5 irq_chip结构体 18.4 在设备树中指定中断_在…...
Kolmogorov-Smirnov正态性检验
Kolmogorov-Smirnov正态性检验是一种统计方法,用于检验数据集是否服从正态分布。其基本原理和用途如下: 基本原理: 假设检验:Kolmogorov-Smirnov检验基于一个假设,即待检验的数据集服从特定的理论正态分布。计算累积…...

BI神器Power Query(25)-- 使用PQ实现表格多列转换(1/3)
实例需求:原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中,att1、att3、att5为一组,att2、att3、att6为另一组,数据如下所示。 更新表格数据 原始数据表: Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

windows系统一键开启和关闭虚拟化
说明 跟虚拟化相关的三个程序 一键开启脚本 REM 开启 Hyper-V 服务 pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %%i in (findstr /i . hyper-v.txt 2^>nul) do dism /online /norestart /add-package:"%Sy…...

NSSCTF做题(5)
[NSSCTF 2022 Spring Recruit]babyphp 代码审计 if(isset($_POST[a])&&!preg_match(/[0-9]/,$_POST[a])&&intval($_POST[a])){ if(isset($_POST[b1])&&$_POST[b2]){ if($_POST[b1]!$_POST[b2]&&md5($_POST[b1])md5($_POST[b2])){…...
java基础题——二维数组的基本应用
1.设计程序按照各个学生的 Java 成绩进行排序 ( 降序 ) 2.设计程序,根据学生总成绩进行排序(降序排列),并输出学生姓名、每门课程的名称和该学生的成绩、该学生的总成绩 public static void main(String[] args) {String[] names {"安琪拉",…...

Leetcode 2119.反转两次的数字
反转 一个整数意味着倒置它的所有位。 例如,反转 2021 得到 1202 。反转 12300 得到 321 ,不保留前导零 。 给你一个整数 num ,反转 num 得到 reversed1 ,接着反转 reversed1 得到 reversed2 。如果 reversed2 等于 num &#x…...

BI神器Power Query(27)-- 使用PQ实现表格多列转换(3/3)
实例需求:原始表格包含多列属性数据,现在需要将不同属性分列展示在不同的行中,att1、att3、att5为一组,att2、att3、att6为另一组,数据如下所示。 更新表格数据 原始数据表: Col1Col2Att1Att2Att3Att4Att5Att6AAADD…...

VUE3照本宣科——认识VUE3
VUE3照本宣科——认识VUE3 前言一、命令创建项目1.中文官网2.菜鸟教程 二、VUE3项目目录结构1.public2.src(1)assets(2)components 3. .eslintrc.cjs4. .gitignore5. .prettierrc.json6.index.html7.package.json8.README.md9.vit…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...