C语言实现通讯录(超详细)

news2024/10/6 20:37:00

  1.实现怎样一个通讯录

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

 2.通讯录的实现

2.1创建两个源文件和一个头文件

首先我们创建contact.c和test.c,contact.h,在头文件中包含了程序所需的各种头文件并且实现对各种函数的声明,而源文件test.c用于引用函数,contact.c实现函数。这样做的目的是为了各个文件可以处理各自模块的功能,增强逻辑性和代码的清晰度,使得可读性更高。

 2.2搭建构架

1.菜单打印

首先在test.c这个源文件里面把菜单打印出来,直接使用printf函数打印出通讯录的功能即可。

void menu()
{
	printf("**********************************\n");
	printf("*****1.Add       2.del    ********\n");
	printf("*****3.Search    4.modify ********\n");
	printf("*****5.show      6.sort   ********\n");
	printf("*****       0.exit        ********\n");
	printf("**********************************\n");
}

 2.使用do while

这里相比较之前写的游戏代码进行了改进,因为数字的具体含义不知道,所以使用了枚举常量代替,而枚举常量会进行默认赋值,所以从0开始一一对应就行了,增加了代码的可读性

enum Option
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	Contact con;//通讯录
	InitContact(&con);//初始化通讯录
	do

	{
		menu();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DEL:
			break;
		case SEARCH:
			break;
		case MODIFY:
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

3.使用结构体保存联系人的信息

接下来在contact.h里面创建结构体来包含人的信息,如果觉得在使用结构体时每次都要写成struct PeoInfom比较复杂,可以在struct前面加上typedef,这样的话使用这个结构体写PeoInfom就行。如果我们在数组里面写上数字的话,就是常量,以后如果发生变化,修改起来不够方便,可以使用#define定义常量。

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define MAME_MAX 40
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100
//类型的声明
typedef struct  PeoInfom
{
	char name[MAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfom;

4.将通讯录初始化

在contact.h里面创建一个结构体,sz记录的是当前通讯录中存放的人的信息个数,PeoInfom data是用来存放数据。

typedef struct Contact
{
	PeoInfom data[MAX];//存放数据
	int sz;//记录的是当前通讯录中存放的人的信息个数
}Contact;

在test.c的主函数里面创建通讯录contact con,这个通讯录里面有一个存放数据的数组,还有个联系人数量,现在这个通讯录没有数据。

Contact con;

结果调试以后发现data和sz都是随机数,所以先对通讯录初始化。结构体传参的时候尽量传址,传值的话如果结构体过大会导致性能下降,在test.c中进行传址。

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

在contact.h中声明函数:

void InitContact(Contact* pc);//初始化通讯录

在contact.c中进行函数的实现,sz直接访问赋0即可。data是一块连续的空间,所以使用memset函数将数据全部变为0,data单独放在sizeof内部表示这个数组,第三个参数直接使用sizeof求出data的大小就行了,单位都是字节。当然使用循环也许,但是memset更加方便快捷。

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

5.添加联系人

首先在case语句中写上添加联系人函数AddContact,然后进行传址。

		case ADD:
			AddContact(&con);
			break;

在contact.h中声明:

void AddContact(Contact* pc);//增加联系人

在contact.c中实现: 

首先判断一下通讯录空间是否满了,使用if判断sz是不是等于MAX。如果没有满,则开始输入信息,先打印提醒信息,在输入,名字放在通讯录里面data数组的下标为pc->sz的位置上,所以是pc->data[pc->sz].name,name是数组名,数组名本身是地址,所以不需要使用&。然后模仿名字这样把各项信息输入进去,最后sz++,再打印提示信息。

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].tele);
	printf("请输入地址:");
	scanf("%s",pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加联系人成功\n");
}

那么我们输入成功之后是看不见这些信息的,所以需要完成show函数,展示出来。


6.展示通讯录信息

首先在case语句中写上添加联系人函数ShowContact,然后进行传址。

		case SHOW:
			ShowContact(&con);
			break;

在contact.c中实现:

由于不需要修改数据,使用const限制一下参数。

先使用if判断一下通讯录是否为空,如果不是再打印信息。

首先我们把各项信息的标题打印出来,确定好间隔。然后开始打印信息,通过找到data数组的下标找出相应的结构体,然后使用下标访问操作符找出相对应的信息,打印出来。

void ShowContact(const Contact *pc)
{
    if(ps->sz == 0)
    {
        printf("通讯录为空\n");
    }
    else
    {
        int i = 0;
        //标题
        printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
        //数据
        for(i = 0; i < pc->sz; i++)
        {
            printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
            pc->data[i].name,
            pc->data[i].age,
            pc->data[i].sex,
            pc->data[i].tele,
            pc->data[i].addr);
        }
    }
}


7.删除指定联系人

首先在contact.h声明:

void DelContact(Contact* pc);//删除指定联系人

在test.c中使用:

		case DEL:
			DelContact(&con);
			break;

在contact.c中实现:

删除联系人先判断一下通讯录是否为空,名字单独创建一个数组,然后输入名字,然后开始在通讯录查找名字。

写一个Findbyname的名字查找函数,参数分别是pc这个通讯录和name,在通讯录里面查找sz次,使用strcmp函数比较,如果等于0,就是找到了这个联系人,则返回下标,否则返回-1.

回到删除函数,如果返回的是-1,则联系人不存在。找到了则将返回的下标作为for函数的i,将i+1这个结构体代替i这个结构体,然后不断的循环。如果判断条件设置为i<pc->sz的话,访问到最后一个结构体就会越界,所以是sz-1,并且for循环走完之后sz--,如果要删除最后一个结构体的时候。则不会访问到最后一个结构体,已经被删除了。

int Findbyname(Contact* pc,char name[])
{
	assert(pc);
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
	}
	printf("请输入要删除的联系人:");
	scanf("%s", name);
	int ret = Findbyname(pc, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	else 
	{
		for (int i = ret; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

8.查找联系人 

在test.c中使用:

		case SEARCH:
			SearchContact(&con);
			break;

在contact.h中声明:

void SearchContact(const Contact* pc);//查找联系人

在contact.c中实现:

这里其实是使用到了Findbyname这个函数和展示函数,需要注意的是要把下标换成ret。

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


9.修改联系人

在contact.h里面声明:

void ModifyContact(Contact* pc);//修改联系人信息

在test.c中使用: 

		case MODIFY:
			ModifyContact(&con);
			break;

在contact.c中实现:

修改函数使用Findbyname函数后直接用添加联系人的方法就可以了,需要注意的是把下标改成ret。

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[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改联系人成功\n");
}


 10.排序联系人

在test.c中使用: 

		case SORT:
			SortContact(&con);
			break;

在contact.h里面声明:

void SortContact(Contact* pc);//排序联系人

在contact.c中实现:

这里使用一个qsort进行排序即可,比较函数使用strcmp。

int cmp_name(const void* e1, const void* e2)
{
	return (strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name));
}
//联系人排序
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
	//打印
	printf("排序完成\n");
	ShowContact(pc);
}

完整代码:

contact.h:

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<stdio.h>
#include<assert.h>
#include<string.h>
#define NAME_MAX 40
#define SEX_MAX 10
#define TELE_MAX 12
#define ADDR_MAX 30
#define MAX 100
//类型的声明
typedef struct  PeoInfom
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfom;

typedef struct Contact
{
	PeoInfom 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 SortContact(Contact* pc);//排序联系人

contact.c:

#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].tele);
	printf("请输入地址:");
	scanf("%s",pc->data[pc->sz].addr);
	pc->sz++;
	printf("添加联系人成功\n");
}
void ShowContact(const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
	}
	else
	{
		int i = 0;
		//标题
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//数据
		for (i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}
int Findbyname(Contact* pc,char name[])
{
	assert(pc);
	for (int i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void DelContact(Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
	}
	printf("请输入要删除的联系人:");
	scanf("%s", name);
	int ret = Findbyname(pc, name);
	if (ret == -1)
	{
		printf("要删除的人不存在\n");
		return;
	}
	else 
	{
		for (int i = ret; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}
void SearchContact(const Contact* pc)
{
	char name[NAME_MAX];
	assert(pc);
	printf("请输入联系人:");
	scanf("%s", name);
	int ret = Findbyname(pc, name);
	if (ret == -1)
	{
		printf("要查找的人不存在\n");
		return;
	}
	else
	{
		//标题
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "地址");
		//数据
			printf("%-20s\t%-4d\t%-5s\t%-12s\t%-20s\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[ret].age));
	printf("请输入性别:");
	scanf("%s", pc->data[ret].sex);
	printf("请输入电话:");
	scanf("%s", pc->data[ret].tele);
	printf("请输入地址:");
	scanf("%s", pc->data[ret].addr);
	printf("修改联系人成功\n");
}

int cmp_name(const void* e1, const void* e2)
{
	return (strcmp(((Contact*)e1)->data->name, ((Contact*)e2)->data->name));
}
//联系人排序
void SortContact(Contact* pc)
{
	assert(pc);
	qsort(pc->data, pc->sz, sizeof(pc->data[0]), cmp_name);
	//打印
	printf("排序完成\n");
	ShowContact(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      6.sort   ********\n");
	printf("*****       0.exit        ********\n");
	printf("**********************************\n");
}
enum Option
{
	EXIT,//0
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 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 SORT:
			SortContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

今天的分享到这里就结束啦!谢谢老铁们的阅读,让我们下期再见。

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

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

相关文章

C++DAY47

头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton> #include <QLabel> #include <QLineEdit> #include <QDebug>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

数据结构----算法--五大基本算法(这里没有写分支限界法)和银行家算法

数据结构----算法–五大基本算法&#xff08;这里没有写分支限界法&#xff09;和银行家算法 一.贪心算法 1.什么是贪心算法 在有多个选择的时候不考虑长远的情况&#xff0c;只考虑眼前的这一步&#xff0c;在眼前这一步选择当前的最好的方案 二.分治法 1.分治的概念 分…

6-8 舞伴问题 分数 15

void DancePartner(DataType dancer[], int num) {LinkQueue maleQueue SetNullQueue_Link();LinkQueue femaleQueue SetNullQueue_Link();// 将男士和女士的信息分别加入对应的队列for (int i 0; i < num; i) {if (dancer[i].sex M){EnQueue_link(maleQueue, dancer[i]…

Vue跨域配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 配置详情 请在项目的vue.config.js中通过proxy的配置&#xff0c;解决Vue跨域&#xff1b;代码如下&#xff1a; const { defineConfig } require(vue/cli-service) modu…

用JavaScript输出0-9的两种方法、以及setTimeout的三个参数的意义

方法一&#xff1a; for (let i 0; i < 10; i) {setTimeout(() > {console.log(i);}, 1000) } 方法二&#xff1a;利用 setTimeout 函数的第三个参数&#xff0c;会作为回调函数的第一个参数传入 for (var i 0; i < 10; i) {setTimeout(i > {console.log(i);…

canvas画布中beginPath和closePath的作用要点

1.画笔画完一个图案后&#xff0c;立即又回到了原点&#xff0c;所以下次如果没有beginPath&#xff0c;就会从原点重新开始 2.beginPath相当于让画笔从原点抬起&#xff0c;重新开始一个新路径&#xff0c;不重复走之前的路径&#xff0c;所以不会覆盖之前的路径 3.closePat…

通过IP地址查询避免电子招投标串标的方法

随着电子招投标的广泛应用&#xff0c;诚实和公平的竞争变得至关重要。然而&#xff0c;一些不道德的投标者可能试图串通以获取不正当的竞争优势。为了解决这个问题&#xff0c;可以利用IP地址查控技术&#xff0c;确保电子招投标的公平性和透明性。本文将介绍如何通过IP地址查…

XCode15与iOS17/17.1 真机测试问题处理

XCode15与iOS17/17.1 真机测试问题处理&#xff0c;网上相关博客很多&#xff0c;摘录了如下实践后能起作用的地址如下&#xff1a;Xcode 15 报错处理 - 简书iOS17版本适配-CSDN博客 Xcode15适配-六虎 主要介绍下&#xff1a;Assertion failure in void _UIGraphicsBeginImag…

【AI视野·今日Sound 声学论文速览 第二十六期】Mon, 16 Oct 2023

AI视野今日CS.Sound 声学论文速览 Mon, 16 Oct 2023 Totally 7 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Low-latency Speech Enhancement via Speech Token Generation Authors Huaying Xue, Xiulian Peng, Yan Lu现有的基于深度学习的语音增强…

VirtualBox安装时提示失败(未解决)

似乎是升级6.1.48的时候&#xff0c;提示签名有问题。重启后就这样了。 卸载1&#xff1a; 卸载2 修复式安装

【AI视野·今日Robot 机器人论文速览 第五十五期】Mon, 16 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 16 Oct 2023 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;***AcTExplore, 对于未知物体的主动触觉感知。基于强化学习自动探索物体的表面形貌&#xff0c;增量式重建。(from 马里兰…

Linear、Logistic回归

线性回归 线性回归的目标是找到最佳拟合线&#xff0c;以使观测数据点与该线的残差&#xff08;实际值与预测值之间的差异&#xff09;最小化。线性回归通常用于探索变量之间的趋势、预测未来数值&#xff0c;或者用于发现因果关系。 简单实例&#xff08;波士顿房价&#xff…

文创品经营商城小程序的作用是什么

如今私域流量运营成为各商家增加的新方式&#xff0c;而在转化链路中&#xff0c;私域商城是重要的节点。 通过【雨科】平台搭建文创品小程序商城全面展示产品&#xff0c;赋能客户随时购物需求&#xff0c;摆脱第三方限制&#xff0c;自营增强生意、拓展品牌&#xff0c;分类式…

中断:Zynq Uart中断的流程和例程~UG585的CH.19

Zynq里的uart UART 控制器是全双工异步接收器和发送器&#xff0c;支持多种可编程波特率和 I/O 信号格式。该控制器可以适应自动奇偶校验生成和多主机检测模式。 UART 操作由配置和模式寄存器控制。使用状态、中断状态和调制解调器状态寄存器读取 FIFO、调制解调器信号…

10.18作业

使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否为…

在ts中val is Map是什么意思呢?

最近在学习vue3的源码&#xff0c;顺便也在学习ts&#xff0c;就记录一下自己学习中的困惑吧 export const isArray Array.isArray export const isMap (val: unknown): val is Map<any, any> >toTypeString(val) [object Map] export const isSet (val: unknow…

【极速发表】2-4区SCI (含CCF),平均录用周期仅2个月,最快11天见刊!

一、计算机科学类SCI (11.30截稿) 【期刊概况】IF:4.0-5.0, JCR2区&#xff0c;中科院3区&#xff1b; 【检索情况】SCI在检&#xff0c;正刊&#xff1b; 【国人占比】10.58%&#xff1b; 【自引率】7.50%&#xff1b; 【年发文量】100篇以下&#xff1b; 【预警情况】无…

微服务负载均衡实践

概述 本文介绍微服务的服务调用和负载均衡&#xff0c;使用spring cloud的loadbalancer及openfeign两种技术来实现。 本文的操作是在微服务的初步使用的基础上进行。 环境说明 jdk1.8 maven3.6.3 mysql8 spring cloud2021.0.8 spring boot2.7.12 idea2022 步骤 改造Eu…

华为Atlas 200I DK A2开发者套件--基础使用配置

文章目录 前言一、快速开始二、通过路由器联网三、USB相机总结 前言 Atlas 200I DK A2基础使用配置方法。准备好键鼠、显示器、网线、USB拓展器。 一、快速开始 下载最新官方Windows版本昇腾开发者套件一键制卡工具&#xff1a; https://ascend-repo.obs.cn-east-2.myhuaweic…

消除隐患 防患未然|AIRIOT智慧消防管理解决方案

随着科技的飞速发展和城市化进程的不断推进&#xff0c;消防安全问题逐渐凸显。传统消防手段在应对现代复杂多变的火灾事故时显得力不从心&#xff0c;面临着许多挑战和弊端&#xff1a; 监控能力不足&#xff1a;传统消防手段通常依赖于人力监控和报警系统&#xff0c;如消防员…