数据结构——通讯录项目

news2024/11/18 0:40:20

1.通讯录的介绍

顺序表是通讯录的底层结构。

通讯录是将顺序表的类型替换成结构体类型来储存用户数据,通过运用顺序表结构来实现的。

用户数据结构:

typedef struct PersonInfo
{
	char name[12];
	char sex[10];
	int age;
	char tel[11];
	char addr[100];
}PeoInfo;

2. 通讯录功能的实现

2.1 构建菜单

将通讯录的所有功能都一一列出来,让用户一目了然。

Contact.c:

void menu()
{
	printf("*******************************************\n");
	printf("******* 1.添加联系人    2.查找联系人 ******\n");
	printf("******* 1.修改联系人    2.删除联系人 ******\n");
	printf("******* 1.查看通讯录    0.退出通讯录 ******\n");
	printf("*******************************************\n");
}

测试结果如下:

 2.2 构建选择操作

Contact.c:

	int op = -1;
	do {
		menu();
		printf("请选择您的操作:\n");
		scanf("%d", &op);
		switch (op)
		{
		case 1:
			//添加联系人
			break;
		case 2:
			//查找联系人
			break;
		case 3:
			//修改联系人
			break;
		case 4:
			//删除联系人
			break;
		case 5:
			//查看通讯录
			break;
		case 0:
			//退出通讯录
			printf("通讯录退出中.....\n");
			break;
			
		}
	} while(op);

 测试结果如下:

 2.3 构建通讯录数据类型

Contact.c:

typedef struct PersonInfo
{
	char name[NAME_MAX];//使用宏便于后期修改代码
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

2.4 通讯录的初始化和销毁

Contact.h:

//初始化通讯录
void InitContact(contact* con);//实际初始化的是顺序表
//销毁通讯录数据
void DestroyContact(contact* con);

Contact.c:

void InitContact(contact* con)
{
	SLInit(con);
}
void DestroyContact(contact* con)
{
	SLDestory(con);
}

2.5 增加联系人

Contact.h:

void AddContact(contact* con);

Contact.c:

void AddContact(contact* con)
{
	SLCheckCapacity(con);
	printf("请输入联系人姓名:\n");
	scanf("%s", con->arr[con->size].name);
	printf("请输入联系人性别:\n");
	scanf("%s", con->arr[con->size].sex);
	printf("请输入联系人年龄:\n");
	scanf("%d", &con->arr[con->size].age);
	printf("请输入联系人电话:\n");
	scanf("%s", con->arr[con->size].tel);
	printf("请输入联系人住址:\n");
	scanf("%s", con->arr[con->size].addr);
	con->size++;
}

测试结果如下:

2.6 展示联系人

Contact.h:

void ShowContact(contact* con);

Contact.c:

void ShowContact(contact* con) {
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < con->size; i++)
	{
		printf("%s %s %d %s %s\n",
			con->arr[i].name,
			con->arr[i].sex,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr
		);
	}
}

测试结果如下:

2.7 查找联系人

Contact.h:

void FindContact(contact* con);

Contact.c:

//查找通讯录数据
int FindByName(contact* con, char name[])//根据需求设计查找的方式
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找人的名字:\n");
	scanf("%s", name);
	int FindIndex = FindByName(con, name);
	if (FindIndex < 0)
	{
		printf("联系人不存在!\n");
		return;
	}
	printf(%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n, "姓名", "性别", "年龄", "电话", "住址");
	printf(%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n,
		con->arr[FindIndex].name,
		con->arr[FindIndex].sex,
		con->arr[FindIndex].age,
		con->arr[FindIndex].tel,
		con->arr[FindIndex].addr
	);
}

测试结果如下:

 2.8 删除联系人

 Contact.h:

void DelContact(contact* con);

Contact.c:

void DelContact(contact* con)
{
	//删除之前一定要查找
	printf("请输入要删除的联系人的姓名:\n");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindByName(con, name);
	//找不到,不能执行删除
	if (ret < 0)
	{
		printf("要删除的联系人不存在!\n");
		return;
	}
	//执行删除操作
	SLErase(con, ret);
}

测试结果如下:

2.9 修改联系人

Contact.h:

void ModifyContact(contact* con);

Contact.c:

void ModifyContact(contact* con)
{
	//修改之前进行查找
	char name[NAME_MAX];
	printf("请输入要修改联系人的姓名:\n");
	scanf("%s",name);
	int findIndex = FindByName(con, name);
	//没有找到,不能执行修改操作
	if (findIndex < 0)
	{
		printf("要修改的联系人不存在!\n");
		return;
	}
	//找到了,执行修改操作
	printf("请输入姓名:\n");
	scanf("%s", con->arr[findIndex].name);
	printf("请输入年龄:\n");
	scanf("%d", &con->arr[findIndex].age);
	printf("请输入性别:\n");
	scanf("%s", con->arr[findIndex].sex);
	printf("请输入电话:\n");
	scanf("%s", con->arr[findIndex].tel);
	printf("请输入地址:\n");
	scanf("%s", con->arr[findIndex].addr);
	printf("修改联系人成功!\n");
}
//找到了,执行修改操作
      

测试结果如下:

3. 通讯录功能优化

上面我们已经实现的通讯录的基本功能,但是我们会发现程序一旦结束,通讯录里储存的数据便会丢失。对于这种情况我们该如何解决呢?

答:将通讯录数据以二进制多大的方式储存到文件里

3.1 储存数据

Contact.h:

void SaveContact(contact* con)

Contact.c:

void SaveContact(contact* con) {
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//将通讯录数据写⼊⽂件
	for (int i = 0; i < con->size; i++)
	{
		fwrite(&(con->arr[i]), sizeof(Info), 1, pf);
	}
	printf("通讯录数据保存成功!\n");
	fclose(pf);
}

测试结果如下:

3.2 读取数据

 Contact.h:

void LoadContact(contact* con);

Contact.c:

void LoadContact(contact* con) {
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//循环读取⽂件数据
	Info info = { 0 };
	while (fread(&info, sizeof(Info), 1, pf))
	{
		SLCheckCapacity(con);
		con->arr[con->size] = info;
		con->size++;
	}
	//printf("%s %s\n", info.name, info.tel);
	printf("历史数据导入通讯录成功!\n");
	fclose(pf);

}

测试结果如下:

这样我们就不用担心数据丢失了!

4. 项目完整代码

SeqList.h:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include"Contact.h"
typedef Info SLDataType;
typedef struct SeqList
{
	SLDataType* arr;
	int capacity;
	int size;
}SL;
//初始化和打印
void SLInit(SL* ps);
void SLPrint(SL* ps);
//扩容
void SLCheckCapacity(SL* ps);
//头插和尾插
void SLPushBack(SL* ps, SLDataType x);
void SLPushFront(SL* ps, SLDataType x);
//头删和尾删
void SLPopBack(SL* ps);
void SLPopFront(SL* ps);
//在指定位置插入数据
void SLInsert(SL* ps, int pos, SLDataType x);
//在指定位置删除
void SLErase(SL* ps, int pos);
//查找数据
//int SLFind(SL* ps, SLDataType x);
//销毁
void SLDestory(SL* ps);

SeqList.c:

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}
//void SLPrint(SL* ps)
//{
//	for (int i = 0; i < ps->size; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	printf("\n");
//}
//检查内存空间,扩容
void SLCheckCapacity(SL* ps)
{
	int newcapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
	SLDataType* tmp = (SLDataType*)realloc(ps->arr, newcapacity * sizeof(SLDataType));
	if (tmp == NULL)
	{
		perror("realloc fall!");
		exit(1);
	}
	ps->arr = tmp;
	ps->capacity = newcapacity;
}
//尾插
void SLPushBack(SL* ps,SLDataType x)
{
	assert(ps);
	//空间不够,扩容
	SLCheckCapacity(ps);

	//空间足够,直接插入
	ps->arr[ps->size++] = x;
}
//头插
void SLPushFront(SL* ps, SLDataType x)
{
	assert(ps);
	//判断是否扩容
	SLCheckCapacity(ps);
	//旧数据往后挪动一位
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	ps->size++;
}
//尾删
void SLPopBack(SL* ps) {
	assert(ps);
	//判断顺序表是否为空
	assert(ps->size);
	//不为空
	ps->size--;
}
//头删
void SLPopFront(SL* ps)
{
	assert(ps);
	//判断顺序表是否为空
	assert(ps->size);

	for (int i = 0; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];

	}
	ps->size--;
}
//在指定位置插入数据
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps && (pos>=0&&pos <= ps->size));
	//判断是否扩容
	SLCheckCapacity(ps);
	for (int i = ps->size; i > pos; i--)
	{
		ps->arr[i ] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;
}
//在指定位置删除
void SLErase(SL* ps, int pos)
{
	assert(ps && (pos >= 0 && pos <= ps->size));
	//判断顺序表是否为空
	assert(ps->size);
	//不为空
	for (int i = pos; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];

	}
	ps->size--;
}
//查找数据

//int SLFind(SL* ps, SLDataType x)
//{
//	assert(ps);
//	for (int i = 0; i < ps->size; i++)
//	{
//		if (ps->arr[i] == x)
//		{
//			return i;
//		}
//	}
//	return -1;
//}
void SLDestory(SL* ps)
{
	assert(ps);
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->arr = NULL;
	ps->capacity = ps->size = 0;
}

Contact.h:

#pragma once
#include<stdio.h>
#define NAME_MAX 100
#define SEX_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
//⽤户数据
typedef struct PersonInfo
{
	char name[NAME_MAX];
	char sex[SEX_MAX];
	int age;
	char tel[TEL_MAX];
	char addr[ADDR_MAX];
}Info;
//前置声明  防止头文件嵌套调用
typedef struct SeqList contact;

//初始化通讯录
void InitContact(contact* con);//实际初始化的是顺序表
//销毁通讯录数据
void DestroyContact(contact* con);
//添加通讯录数据
void AddContact(contact* con);
//展⽰通讯录数据
void ShowContact(contact* con);
//删除通讯录数据
void DelContact(contact* con);
//查找通讯录数据
void FindContact(contact* con);
//修改通讯录数据
void ModifyContact(contact* con);
//保存数据
void SaveContact(contact* con);
//读取数据
void LoadContact(contact* con);

Contact.c:

#include"SeqList.h"
void InitContact(contact* con)
{
	SLInit(con);
}
void DestroyContact(contact* con)
{
	SLDestory(con);
}
//添加联系人
void AddContact(contact* con)
{
	SLCheckCapacity(con);
	printf("请输入联系人姓名:\n");
	scanf("%s", con->arr[con->size].name);
	printf("请输入联系人性别:\n");
	scanf("%s", con->arr[con->size].sex);
	printf("请输入联系人年龄:\n");
	scanf("%d", &con->arr[con->size].age);
	printf("请输入联系人电话:\n");
	scanf("%s", con->arr[con->size].tel);
	printf("请输入联系人住址:\n");
	scanf("%s", con->arr[con->size].addr);
	con->size++;
}
//展⽰通讯录数据
void ShowContact(contact* con) {
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
	for (int i = 0; i < con->size; i++)
	{
		printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",
			con->arr[i].name,
			con->arr[i].sex,
			con->arr[i].age,
			con->arr[i].tel,
			con->arr[i].addr
		);
	}
}
//查找通讯录数据
int FindByName(contact* con, char name[])//根据需求设计查找的方式
{
	for (int i = 0; i < con->size; i++)
	{
		if (strcmp(con->arr[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
void FindContact(contact* con)
{
	char name[NAME_MAX];
	printf("请输入要查找人的名字:\n");
	scanf("%s", name);
	int FindIndex = FindByName(con, name);
	if (FindIndex < 0)
	{
		printf("联系人不存在!\n");
		return;
	}
	printf("%-20s\t%-5s\t%-4s\t%-12s\t%-20s\n", "姓名", "性别", "年龄", "电话", "住址");
	printf("%-20s\t%-5s\t%-4d\t%-12s\t%-20s\n",
		con->arr[FindIndex].name,
		con->arr[FindIndex].sex,
		con->arr[FindIndex].age,
		con->arr[FindIndex].tel,
		con->arr[FindIndex].addr
	);
}
//删除通讯录数据
void DelContact(contact* con)
{
	//删除之前一定要查找
	printf("请输入要删除的联系人的姓名:\n");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindByName(con, name);
	//找不到,不能执行删除
	if (ret < 0)
	{
		printf("要删除的联系人不存在!\n");
		return;
	}
	//执行删除操作
	SLErase(con, ret);
}
//修改通讯录数据
void ModifyContact(contact* con)
{
	//修改之前进行查找
	char name[NAME_MAX];
	printf("请输入要修改联系人的姓名:\n");
	scanf("%s",name);
	int findIndex = FindByName(con, name);
	//没有找到,不能执行修改操作
	if (findIndex < 0)
	{
		printf("要修改的联系人不存在!\n");
		return;
	}
	//找到了,执行修改操作
	printf("请输入姓名:\n");
	scanf("%s", con->arr[findIndex].name);
	printf("请输入年龄:\n");
	scanf("%d", &con->arr[findIndex].age);
	printf("请输入性别:\n");
	scanf("%s", con->arr[findIndex].sex);
	printf("请输入电话:\n");
	scanf("%s", con->arr[findIndex].tel);
	printf("请输入地址:\n");
	scanf("%s", con->arr[findIndex].addr);
	printf("修改联系人成功!\n");
}
//保存数据
void SaveContact(contact* con) {
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//将通讯录数据写⼊⽂件
	for (int i = 0; i < con->size; i++)
	{
		fwrite(&(con->arr[i]), sizeof(Info), 1, pf);
	}
	printf("通讯录数据保存成功!\n");
	fclose(pf);
	pf = NULL;
}
//读取数据
void LoadContact(contact* con) {
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL) {
		perror("fopen error!\n");
		return;
	}
	//循环读取⽂件数据
	Info info = { 0 };
	while (fread(&info, sizeof(Info), 1, pf))
	{
		SLCheckCapacity(con);
		con->arr[con->size] = info;
		con->size++;
	}
	//printf("%s %s\n", info.name, info.tel);
	printf("历史数据导入通讯录成功!\n");
	fclose(pf);
	pf = NULL;
}

ConTest.c

#include"SeqList.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;
	//通讯录初始化
	InitContact(&con);
	LoadContact(&con);
	do {
		
		menu();
		printf("请选择您的操作:\n");
		scanf("%d", &op);
		switch (op)
		{
		case 1:
			//添加联系人
			AddContact(&con);
			break;
		case 2:
			//查找联系人
			FindContact(&con);
			break;
		case 3:
			//修改联系人
			ModifyContact(&con);
			break;
		case 4:
			//删除联系人
			DelContact(&con);
			printf("联系人删除成功!\n");
			break;
		case 5:
			//查看通讯录
			ShowContact(&con);
			break;
			break;
		case 0:
			//退出通讯录
			printf("通讯录退出中.....\n");
			break;
		}
	} while (op);
	SaveContact(&con);
	DestroyContact(&con);
	return 0;
}

 对于顺序表代码的实现在上一篇中有讲解,如果有的小伙伴有兴趣,可以去看一看。链接在下方:http://t.csdnimg.cn/wpM1t

本文为作者学习后的总结,如果有什么不恰当的地方,欢迎大佬指正!!! 

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

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

相关文章

Java Web 概述

XML基础 XML概述 XML(exiensile markup language&#xff0c;可扩展标记语言)是一套定义语义标记的规则&#xff0c;这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言&#xff0c;可以定义其他与特定领域有关的、语义的、结构化的标记。 XML与 HTML 都…

【C语言步行梯】各类操作符、类型转换与原码、反码、补码详谈

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 算术运算符原码、反码、补码介绍移位运算…

【C语言步行梯】C语言实现三子棋游戏(含详细分析)

&#x1f3af;每日努力一点点&#xff0c;技术进步看得见 &#x1f3e0;专栏介绍&#xff1a;【C语言步行梯】专栏用于介绍C语言相关内容&#xff0c;每篇文章将通过图片代码片段网络相关题目的方式编写&#xff0c;欢迎订阅~~ 文章目录 需求分析具体实现主函数体菜单实现游戏实…

LLM之RAG实战(三十)| 探索RAG语义分块策略

在LLM之RAG实战&#xff08;二十九&#xff09;| 探索RAG PDF解析解析文档后&#xff0c;我们可以获得结构化或半结构化的数据。现在的主要任务是将它们分解成更小的块来提取详细的特征&#xff0c;然后嵌入这些特征来表示它们的语义&#xff0c;其在RAG中的位置如图1所示&…

【GitHub】使用git链接下载很慢?试试服务器配置SSH,起飞

参考文献 保姆级教学&#xff0c;教你用配置SSH拉取github代码 CentOS ssh -T gitgithub.comgit config --global user.name "learnore" git config --global user.email "15200831505163.com"cd /root/.ssh vim id_rsa.pubGitHub Settings 结果 下载速…

力扣L13--- 409.最长回文串(JAVA版)-2024年3月1日

1.题目描述 2.知识点 注1&#xff1a;向下取整是将一个数值向下舍入到最接近的整数&#xff0c;但不超过这个数值的整数。具体规则如下&#xff1a; 对于正数&#xff0c;向下取整后得到的整数是不大于原数值的最大整数&#xff1b; 对于负数&#xff0c;向下取整后得到的整数…

uniapp——第2篇:编写vue语法

前提&#xff0c;建议先学会前端几大基础&#xff1a;HTML、CSS、JS、Ajax&#xff0c;还有一定要会Vue!&#xff08;Vue2\Vue3&#xff09;都要会&#xff01;&#xff01;&#xff01;不然不好懂 一、去哪写&#xff1f; 就在【pages】的你的人一个页面文件夹里的【.vue】文…

简单的网页制作

1网页编写格式 <!DOCTYPE html> <html><head><meta charset"utf-8"> <title>中文测试。。。。</title></head><body>这里是测试body测试内容。。。</body> </html>2标签 在body内<h1></h1&…

突破编程_前端_JS编程实例(工具栏组件)

1 开发目标 工具栏组件旨在模拟常见的桌面软件工具栏&#xff0c;所以比较适用于 electron 的开发&#xff0c;该组件包含工具栏按钮、工具栏分割条和工具栏容器三个主要角色&#xff0c;并提供一系列接口和功能&#xff0c;以满足用户在不同场景下的需求&#xff1a; 点击工具…

中间件 | RPC - [Dubbo]

INDEX 1 Dubbo 与 web 容器的关系2 注册发现流程3 服务配置3.1 注册方式 & 订阅方式3.2 服务导出3.3 配置参数 4 底层技术4.1 Dubbo 的 spi 机制4.2 Dubbo 的线程池4.3 Dubbo 的负载均衡策略4.3 Dubbo 的协议 1 Dubbo 与 web 容器的关系 dubbo 本质上是一个 RPC 框架&…

leetcode代码记录(动态规划基础题(斐波那契数列)

目录 1. 题目&#xff1a;2. 斐波那契数列&#xff1a;小结&#xff1a; 1. 题目&#xff1a; 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a…

基于高德地图JS API实现Vue地图选点组件

基于高德地图JS API2.0实现一个搜索选择地点后返回给父组件位置信息的功能&#xff0c;同时可以进行回显 目录 1 创建key和秘钥1.1 登录高德地图开放平台1.2 创建应用1.3 绑定服务创建秘钥 2 使用组件前准备2.1 导入loader2.2 在对应的组件设置秘钥2.3 引入css样式 3 功能实现…

【C语言】整型提升与算术转换

一、表达式求值 在我们平常的表达式求值的题目中&#xff0c;虽然看似是道很简单的题目&#xff1b;但是出题人总是会埋坑&#xff0c;其中最常见的就是整型提升与算术转换。 二、整型提升 C语⾔中整型算术运算总是⾄少以缺省(默认)整型(int)类型的精度来进⾏的&#xff1b;…

【MySQL基础】MySQL基础操作二

文章目录 &#x1f34e;1.数据库约束&#x1f350;约束类型&#x1f346;1.1NOT NULL&#x1f346;1.2UNIQUE&#x1f346;1.3DEFAULT&#x1f346;1.4PRIMARY KEY&#x1f346;1.5FOREIGN KEY &#x1f34f;2.查询操作&#x1f35f;2.1聚合查询&#x1f354;2.1.1聚合函数&…

视频号电商的风口来了!这个消息还有多少人不知道?

大家好&#xff0c;我是电商糖果 短视频做电商&#xff0c;这几年的热度真的是非常高&#xff0c;就是因为热度太高了&#xff0c;才让视频号也动了电商的心思。 腾讯推出的视频号是为了和抖音对打&#xff0c;这几年靠着微信输送的流量&#xff0c;视频号的日活已经渐渐有赶…

JavaSE-----认识异常【详解】

目录 一.异常的概念与体系结构&#xff1a; 1.1异常的概念&#xff1a; 1.2一些常见的异常&#xff1a; 1.3异常的体系结构&#xff1a; 1.4异常的分类&#xff1a; 二.异常的处理机制&#xff1a; 2.1 抛出异常&#xff1a; 2.2异常的捕获&#xff1a; 2.3try-catch-&…

JavaWeb一些开发问题

一、Restful package com.example.crudtest1.pojo;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result {private Integer code;//响应码&#xff0c;1 代表成功; 0 代表失…

浅易理解:卷积神经网络(CNN)

浅易理解卷积神经网络流程 本文的目录&#xff1a; 1 什么卷积神经网络 2 输入层 3 卷积层 4 池化层 5 全连接层 传统的多层神经网络只有 输入层、隐藏层、输出层 卷积神经网络&#xff08;CNN)&#xff1a; 在多层神经网络的基础上&#xff0c;加入了更加有效的特征学习部分…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…

【Linux进程状态】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、直接谈论Linux的进程状态 看看Linux内核源代码怎么说 1.1、R状态 -----> 进程运行的状态 1.2、S状态 -----> 休眠状态(进程在等待“资源”就绪) 1.3、T状…