C语言之通讯录的实现篇

news2024/11/16 3:30:02

目录

test.c

主菜单menu

创建通讯录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总代码


今天实现同通讯录的功能。在学习了结构体和其他的自定义的类型以及动态内存之后,我们就可以实现一个动态的通讯录。

实现一个通讯录:

  1. 可以保存100个人的信息
  2. 增加人的信息
  3. 删除指定联系人的信息
  4. 查找指定联系人的信息
  5. 修改指定联系人的信息
  6. 显示所有联系人的信息
  7. 排序通讯录的信息
  • 一个人的信息包括:名字+年龄+性别+电话+住址

那接下来我们将从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,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT,//6	
};
int main()
{
	int input = 0;
	Contact con;//创建通讯录con
	do
	{
		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,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT,//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 20

typedef 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的下标放入ret
	int 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的下标放入ret
	int 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】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1083695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于PTP的同步时钟同步

基于PTP的同步时钟同步 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; ​本设计采用PTP (Precision Time Protocol)协议&#xff0c;来实现同步时间。PTP是一种精确测量和控制系统的网络协议&#xff0c;用于同步分布式系统中的各种设备和服务器的时间。 首先…

Maxon Cinema 4D 2024:创造无限可能,激发你的创造力

在视觉效果和3D建模领域&#xff0c;Maxon的Cinema 4D一直以其卓越的性能和创新的功能引领着时代潮流。今天&#xff0c;我们很高兴地宣布推出最新版本——Maxon Cinema 4D 2024&#xff08;C4D 2024&#xff09;&#xff0c;它将再次提升行业标准&#xff0c;为设计师提供更强…

SVN提交项目时,出现了这样的提示:“XXX“ is scheduled for addition, but is missing。

原因是&#xff1a;之前用SVN提交过的文件/文件夹&#xff0c;被标记为"addition"状态&#xff0c;等待被加入到仓库。虽然你把这个文件删除了&#xff0c;SVN提交的时候还是会尝试提交这个文件&#xff0c;所以就会提示&#xff1a;"but is missing"。解决…

科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰

据中国乘联会发布的初步数据&#xff0c;中国 9 月份乘用车市场零售 202.8 万辆&#xff0c;同比增长 6%&#xff0c;环比增 6%。今年以来&#xff0c;我国乘用车市场累计零售 1,524 万辆&#xff0c;同比增长 2%。 乘联会预计&#xff0c;9 月份新能源车市场零售 74.3 万辆&a…

​电子商务新宠电商独立站成功案例解析|抢占市场巅峰:成功打造日本跨境电商独立站攻略! ​

日本离中国只有690公里&#xff0c;时差仅一个小时。距离和便捷的物流是日本跨境电商最具天然的优势&#xff0c;但除了这种天然优势外&#xff0c;日本还有哪些优势不容忽视&#xff1f;无论是独立站还是乐天、雅虎、日亚&#xff0c;都要遵循一个国家的消费习惯&#xff0c;制…

更新 | 持续开源迅为RK3568驱动指南第十二篇-GPIO子系统

《iTOP-RK3568开发板驱动开发指南》更新&#xff0c;本次更新内容对应的是驱动&#xff08;第十二期_GPIO子系统-全新升级&#xff09;视频&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 文档教程更新至第十…

【翻译】增长秘笈,如何让你的开源项目Star数快速增长

TL;DR &#xff08;前言&#xff09; 本文翻译自 https://star-history.com/blog/playbook-for-more-github-stars&#xff0c;尽可能遵照原文&#xff0c;部分内容做少许改动。 我和我的团队最近推出了一个面向开发者的开源工具。这是我第一次推广一个开源工具。很难找到有意…

ES相关面试问题整理

索引模板了解么 索引模板&#xff0c;一种复用机制&#xff0c;就像一些项目的开发框架如 Laravel 一样&#xff0c;省去了大量的重复&#xff0c;体力劳动。当新建一个 Elasticsearch 索引时&#xff0c;自动匹配模板&#xff0c;完成索引的基础部分搭建。 模板定义&#xf…

印尼封锁TikTok Shop后,数字商业将何去何从?

近年来&#xff0c;TikTok已成为全球范围内备受欢迎的短视频平台&#xff0c;它的崛起改变了用户的娱乐方式&#xff0c;也为商家提供了一个全新的数字营销平台。 然而&#xff0c;最近印尼政府宣布封锁TikTok Shop&#xff0c;理由是平台上存在虚假广告和欺诈行为。这一决定引…

跳槽阿里,面试被虐惨了

1、八股文几乎全背熟&#xff0c;谁能想到最后问的全是JVM&#xff0c;一下给我问懵了&#xff0c;当场就挂了&#xff01; 2、曾经的我很不屑JVM&#xff0c;后来我逐帧学习&#xff01; 3、现在竞争激烈&#xff0c;甭管什么厂&#xff0c;都要问点JVM&#xff01; 最近有…

sonarqube 代码质量检测

官方文档 1.安装 我安装的是 sonarqube-10.2 需要jdk17的环境请先安装 jdk17 下载sonarqube-10.2安装包 直接解压、运行启动脚本 sonarqube-10.2.1.78527\bin\windows-x86-64\StartSonar.batsonarqube访问端口&#xff1a;9000 http://localhost:9000 2.项目改造 2.1 修改…

【TensorFlow2 之011】TF 如何使用数据增强提高模型性能?

一、说明 亮点&#xff1a;在这篇文章中&#xff0c;我们将展示数据增强技术作为提高模型性能的一种方式的好处。当我们没有足够的数据可供使用时&#xff0c;这种方法将非常有益。 教程概述&#xff1a; 无需数据增强的训练什么是数据增强&#xff1f;使用数据增强进行训练可视…

Excel 中使用数据透视图进行数据可视化

使用数据透视表&#xff08;PivotTable&#xff09;是在Excel中进行数据可视化的强大工具。下面将提供详细的步骤来使用数据透视表进行数据可视化。 **步骤一&#xff1a;准备数据** 首先&#xff0c;确保你有一个包含所需数据的Excel表格。数据应该按照一定的结构和格式组织…

4.js中next()方法与prev()方法使用

我们可以选择某个DOM元素进行获取和操作&#xff0c;但是有时候我们在操作某个元素的时候&#xff0c;也要对它相邻的的元素进行获取或是操作&#xff0c;那我们该如何去做呢&#xff0c;今天记录一个获取某个元素的相邻的上一个元素或相邻的下一个元素 js中的next()方法 next…

【HarmonyOS】低代码平台组件拖拽使用技巧之堆叠容器

【关键字】 HarmonyOS、低代码平台、组件拖拽、堆叠组件 1、写在前面 从本篇开始&#xff0c;我们一起来学习一下低代码平台中组件的托拉拽&#xff0c;虽然组件拖拽十分简单&#xff0c;但实际上还是有一定的技巧&#xff0c;新手上路难免会遇到一定的问题&#xff0c;如果能…

Python并行编程之道—加速海量任务同时执行

这次我要和大家分享一种加速海量任务执行的方法&#xff0c;那就是Python并行编程。如果你经常处理大量的任务&#xff0c;并且希望能够同时执行它们以提高效率&#xff0c;那么并行编程将会给你带来巨大的帮助&#xff01; 1、了解并行编程 并行编程是利用多个执行单元同时执…

国产化系统加密/国产化系统防泄密

​深信达网络科技有限公司自主研发的深信达主机加固系统软件V2.0、深信达沙盒防泄密系统软件V5.0&#xff0c;与麒麟软件完成兼容认证&#xff0c;并被纳入麒麟软件安全生态联盟成员之一。 麒麟软件主要面向通用和专用领域打造安全创新操作系统产品和相应解决方案&#xff0c;以…

《动手学深度学习 Pytorch版》 8.4 循环神经网络

8.4.1 无隐状态的神经网络 对于无隐藏装态的神经网络来说&#xff0c;给定一个小批量样本 X ∈ R n d \boldsymbol{X}\in\mathbb{R}^{n\times d} X∈Rnd&#xff0c;则隐藏层的输出 H ∈ R n h \boldsymbol{H}\in\mathbb{R}^{n\times h} H∈Rnh 通过下式计算&#xff1a; …

【2023研电赛】商业计划书命题:基于三维视觉感知的可重构智能表面通信设计

该作品参与极术社区组织的2023研电赛作品征集活动&#xff0c;欢迎同学们投稿&#xff0c;获取作品传播推广&#xff0c;并有丰富礼品哦~ 基于三维视觉感知的可重构智能表面通信设计 参赛单位&#xff1a;华北水利水电大学 参赛队伍&#xff1a;创新小组 指导老师&#xff1a;邵…

揭秘光耦合器继电器:了解其功能和应用

在现代电子领域&#xff0c;光耦合器继电器已成为重要组件&#xff0c;可实现各种电路之间的无缝通信。这些小型但功能强大的设备广泛用于从家庭自动化到工业控制系统的各种应用。在本文中&#xff0c;我们将深入研究光耦合器继电器的工作原理&#xff0c;并探讨其广泛采用背后…