通讯录(C语言)

news2024/12/28 3:06:49

通讯录

  • 一、基本思路及功能介绍
  • 二、功能实现
    • 1.基础菜单的实现
    • 2.添加联系人信息功能实现
    • 3.显示联系人信息功能实现
    • 4.删除联系人信息功能实现
    • 5.查找联系人信息功能实现
    • 6.修改联系人信息功能实现
    • 7.排序联系人信息功能实现
    • 8.加载和保存联系人信息功能实现
  • 三、源文件展示
    • 1.test.c
    • 2.contact.c
    • 3.contact.h

一、基本思路及功能介绍

想要用C语言实现通讯录的功能,基本上涵概了C语言入门的一些知识运用,如:指针、结构体、文件操作、动态内存管理等相关的知识;

实现一个简单的通讯录的基本功能:

    1.添加联系人信息;

    2.删除联系人信息;

    3.查找联系人信息;

    4.修改联系人信息;

    5.显示联系人信息;

    6.排序联系人信息;   

    7.保存联系人信息;

    8.退出通讯录;

二、功能实现

1.基础菜单的实现

void menu()
{
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t******    通讯录管理系统    ********\n");
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t*      1.添加联系人       *\n");
	printf("\t\t\t\t*      2.删除联系人       *\n");
	printf("\t\t\t\t*      3.查找联系人	      *\n");
	printf("\t\t\t\t*      4.修改联系人       *\n");
	printf("\t\t\t\t*      5.显示联系人       *\n");
	printf("\t\t\t\t*      6.排序联系人       *\n");
	printf("\t\t\t\t*      0.退出通讯录       *\n");
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t************************************\n");
}
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	struct 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:
			SaveContact(&con);//保存信息
			DistroyContact(&con);//销毁通讯录信息
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

2.添加联系人信息功能实现

//扩充容量
void CheckContact(struct Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("扩容成功\n");
		}
		else
		{
			printf("扩容失败\n");
			exit(1);
		}
	}
}
 
//初始化通讯录
void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));
	pc->capacity = DEFAULT_SZ;
}
 
//添加联系人信息
void AddContact(struct Contact* pc)
{
	CheckContact(pc);
	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);
	printf("添加成功\n");
	pc->sz++;
}

3.显示联系人信息功能实现

 
//显示联系人信息
void ShowContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,显示失败!!!\n");
		return;
	}
	int i = 0;
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n",
		"姓名", "年龄", "性别", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t\t--------------------------------------------------------------------------\n");
}

4.删除联系人信息功能实现

 
//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}
 
void DelContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("联系人为空,操作失败\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除的联系人姓名:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("查找的联系人不存在!!!\n");
	}
	else
	{
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}

5.查找联系人信息功能实现

//查找联系人信息
void SearchContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,查找失败!!!\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!!!\n");
		return;
	}
	else
	{
		printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n",
			"姓名", "年龄", "性别", "电话", "住址");
			printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",
				pc->data[pos].name,
				pc->data[pos].age,
				pc->data[pos].sex,
				pc->data[pos].tele,
				pc->data[pos].addr);
	}
}

6.修改联系人信息功能实现

//修改联系人信息
void ModifyContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,查找失败!!!\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的联系人姓名:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!!!\n");
		return;
	}
	else
	{
		printf("请输入新的联系人姓名:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入新的联系人年龄:>");
		scanf("%d", &pc->data[pos].age);
		printf("请输入新的联系人性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的联系人电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入新的联系人住址:>");
		scanf("%s", pc->data[pos].addr);
	}
	printf("修改成功\n");
}

7.排序联系人信息功能实现

//排序联系人信息
void SortContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法排序!!!\n");
		return;
	}
	int i = 0;
	int j = 0;
	struct PeoInfo tmp;
	for (i = 0; i < pc->sz - 1; i++)
	{
		int flag = 1;
		for (j = 0; j < pc->sz - i - 1; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0)
			{
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			return;
		}
	}
	printf("排序成功\n");
}

8.加载和保存联系人信息功能实现

//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("contact:fopen");
		return;
	}
	struct PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(struct PeoInfo), 1, pf))
	{
		CheckContact(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pf);
	pf = NULL;
}
 
 
//保存信息
void SaveContact(struct Contact* pc)
{
	//1.打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact:fopen");
		return;
	}
	//2.写数据
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);
	}
	//3.关闭文件
	fclose(pf);
	pf = NULL;
}

三、源文件展示

1.test.c

void menu()
{
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t******    通讯录管理系统    ********\n");
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t*      1.添加联系人       *\n");
	printf("\t\t\t\t*      2.删除联系人       *\n");
	printf("\t\t\t\t*      3.查找联系人	      *\n");
	printf("\t\t\t\t*      4.修改联系人       *\n");
	printf("\t\t\t\t*      5.显示联系人       *\n");
	printf("\t\t\t\t*      6.排序联系人       *\n");
	printf("\t\t\t\t*      0.退出通讯录       *\n");
	printf("\t\t\t\t************************************\n");
	printf("\t\t\t\t************************************\n");
}
enum
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT
};
int main()
{
	int input = 0;
	struct 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:
			SaveContact(&con);//保存信息
			DistroyContact(&con);//销毁通讯录信息
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

2.contact.c

#include "contact.h"

//扩充容量
void CheckContact(struct Contact* pc)
{
	if (pc->sz == pc->capacity)
	{
		struct PeoInfo* ptr = (struct PeoInfo*)realloc(pc->data, (pc->capacity + 2) * sizeof(struct PeoInfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity += 2;
			printf("扩容成功\n");
		}
		else
		{
			printf("扩容失败\n");
			exit(1);
		}
	}
}



//加载有效信息到通讯录中
void LoadContact(struct Contact* pc)
{
	FILE* pf = fopen("contact.txt", "rb");
	if (pf == NULL)
	{
		perror("contact:fopen");
		return;
	}
	struct PeoInfo tmp = { 0 };
	while (fread(&tmp, sizeof(struct PeoInfo), 1, pf))
	{
		CheckContact(pc);
		pc->data[pc->sz] = tmp;
		pc->sz++;
	}
	fclose(pf);
	pf = NULL;
}


//初始化通讯录
void InitContact(struct Contact* pc)
{
	pc->sz = 0;
	pc->data = (struct PeoInfo*)malloc(DEFAULT_SZ * sizeof(struct PeoInfo));
	pc->capacity = DEFAULT_SZ;
	LoadContact(pc);//加载有效信息到通讯录中
}

//添加联系人信息
void AddContact(struct Contact* pc)
{
	CheckContact(pc);
	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);
	printf("添加成功\n");
	pc->sz++;
}

//销毁通讯录
void DistroyContact(struct Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->sz = 0;
	pc->capacity = 0;
}


//显示联系人信息
void ShowContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,显示失败!!!\n");
		return;
	}
	int i = 0;
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n",
		"姓名", "年龄", "性别", "电话", "住址");
	for (i = 0; i < pc->sz; i++)
	{
		printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
	printf("\t\t--------------------------------------------------------------------------\n");
	printf("\t\t--------------------------------------------------------------------------\n");
}


//删除联系人信息
int FindContactByName(const struct Contact* pc, char* name)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(pc->data[i].name, name) == 0)
		{
			return i;
		}
	}
	return -1;
}

void DelContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("联系人为空,操作失败\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除的联系人姓名:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("查找的联系人不存在!!!\n");
	}
	else
	{
		for (int i = pos; i < pc->sz - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		pc->sz--;
		printf("删除成功\n");
	}
}


//查找联系人信息
void SearchContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,查找失败!!!\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找的联系人的名字:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!!!\n");
		return;
	}
	else
	{
		printf("\t%15s\t%15s\t%15s\t%15s\t%15s\n\n",
			"姓名", "年龄", "性别", "电话", "住址");
		printf("\t%15s\t%15d\t%15s\t%15s\t%15s\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}


//修改联系人信息
void ModifyContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,查找失败!!!\n");
		return;
	}
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的联系人姓名:>");
	scanf("%s", name);
	int pos = FindContactByName(pc, name);
	if (pos == -1)
	{
		printf("联系人不存在!!!\n");
		return;
	}
	else
	{
		printf("请输入新的联系人姓名:>");
		scanf("%s", pc->data[pos].name);
		printf("请输入新的联系人年龄:>");
		scanf("%d", &pc->data[pos].age);
		printf("请输入新的联系人性别:>");
		scanf("%s", pc->data[pos].sex);
		printf("请输入新的联系人电话:>");
		scanf("%s", pc->data[pos].tele);
		printf("请输入新的联系人住址:>");
		scanf("%s", pc->data[pos].addr);
	}
	printf("修改成功\n");
}

//排序联系人信息
void SortContact(struct Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录为空,无法排序!!!\n");
		return;
	}
	int i = 0;
	int j = 0;
	struct PeoInfo tmp;
	for (i = 0; i < pc->sz - 1; i++)
	{
		int flag = 1;
		for (j = 0; j < pc->sz - i - 1; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) < 0)
			{
				tmp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = tmp;
				flag = 0;
			}
		}
		if (flag == 1)
		{
			return;
		}
	}
	printf("排序成功\n");
}


//保存信息
void SaveContact(struct Contact* pc)
{
	//1.打开文件
	FILE* pf = fopen("contact.txt", "wb");
	if (pf == NULL)
	{
		perror("SaveContact:fopen");
		return;
	}
	//2.写数据
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		fwrite(&(pc->data[i]), sizeof(struct PeoInfo), 1, pf);
	}
	//3.关闭文件
	fclose(pf);
	pf = NULL;
}

3.contact.h

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME_MAX 20
#define SEX_MAX 20
#define TELE_MAX 20
#define ADDR_MAX 20
#define DEFAULT_SZ 3

struct PeoInfo
{
	char name[NAME_MAX];//姓名
	int age;			//年龄
	char sex[SEX_MAX];  //性别
	char tele[TELE_MAX];//电话
	char addr[ADDR_MAX];//住址
};

struct Contact
{
	struct PeoInfo* data;//能够动态存储联系人的信息
	int sz;				 //记录当前联系人的个数
	int capacity;		 //记录当前通讯录的容量
};


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

//添加联系人信息
void AddContact(struct Contact* pc);

//销毁通讯录信息
void DistroyContact(struct Contact* pc);

//显示联系人信息
void ShowContact(struct Contact* pc);

//删除联系人信息
void DelContact(struct Contact* pc);

//查找联系人信息
void SearchContact(struct Contact* pc);

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

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

//加载有效信息到通讯录中
void LoadContact(struct Contact* pc);

//保存信息
void SaveContact(struct Contact* pc);

#四、演示效果

没有联系人
在这里插入图片描述

存入联系人
在这里插入图片描述

查找联系人
在这里插入图片描述

修改联系人
在这里插入图片描述

显示联系人
加粗样式

排序联系人
在这里插入图片描述

退出通讯录
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

使用WSL修改docker文件存储位置

按照以下说明将其重新定位到其他驱动器/目录&#xff0c;并保留所有现有的Docker数据。 首先&#xff0c;右键单击Docker Desktop图标关闭Docker桌面&#xff0c;然后选择退出Docker桌面&#xff0c;然后&#xff0c;打开命令提示符&#xff1a; wsl --list -v您应该能够看到&a…

三极管NPN、PNP的区别及简单应用

目录 一、NPN、PNP三极管的概念 二、NPN、PNP三极管的区别 三、三极管NPN、PNP的简单应用 一、NPN、PNP三极管的概念 NPN型三极管&#xff1a; 由两块N型半导体和一块P型半导体组成&#xff0c;P型半导体在中间&#xff0c;两块N型半导体在两侧。 三极管是电子电路中最重要的…

【数据结构】如何用栈实现队列?图文解析(LeetCode)

LeetCode链接&#xff1a;232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;本文默认读者已掌握栈与队列的基本操作 可以看这篇文章熟悉知识点&#xff1a;【数据结构】栈与队列_字节连结的博客-CSDN博客 目录 做题思路 代码实现 1. MyQueue 2. …

windows10 docker 安装在D盘

win10安装docker后发现c盘空间急速减少&#xff0c;360管家查看发现images镜像安装在C盘&#xff0c;于是重装docker desktop以为在安装过程中能够选择&#xff0c;遗憾的是没有提供选择权限&#xff0c;默认直接就安装到了c盘。 desktop 迁移 百度得知可以将c盘的docker安装…

【Sublime Text 】Sublime Text 设置中文 超详细 持续更新中

Sublime Text 设置中文 超详细 持续更新中 概述开发环境一、Sublime Text 设置中文 概述 一个好的安装教程能够帮助开发者完成更便捷、更快速的开发。书山有路勤为径&#xff0c;学海无涯苦作舟。我是秋知叶i、期望每一个阅读了我的文章的开发者都能够有所成长。 开发环境 开…

微积分基本概念

微分 函数的微分是指对函数的局部变化的一种线性描述。微分可以近似地描述当函数自变量的取值作足够小的改变时&#xff0c;函数的值是怎样改变的。。对于函数 y f ( x ) y f(x) yf(x) 的微分记作&#xff1a; d y f ′ ( x ) d x d_y f^{}(x)d_x dy​f′(x)dx​ 微分和…

STTran: Spatial-Temporal Transformer for Dynamic Scene Graph Generation

文章目录 0 Abstract1 Introduction2 Related Work3 Method3.1 Transformer3.2 Relationship Representation3.3 Spatio-Temporal Transformer3.3.1 Spatial Encoder3.3.2 Frame Encoding3.3.3 Temporal Decoder 3.4 Loss Function3.5 Graph Generation Strategies 4 Experimen…

最新ChatGPT网站AI系统源码+详细图文搭建教程/支持GPT4/AI绘画/H5端/Prompt知识库

一、AI系统 如何搭建部署AI创作ChatGPT系统呢&#xff1f;小编这里写一个详细图文教程吧&#xff01; SparkAi使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到AIGC系统&#xff01; 1.1 程序核心功能 程序已支持ChatGPT3.5/GPT-4提问、AI绘画、Midjourney绘画&#…

3.1、BGP的通告原则

BGP的通告原则 1、BGP通过network、.import-route、aggregate聚合方式生成BGP路由后&#xff0c;通过Update?报文将BGP路由传递给对等体。 2、BGP通告遵循以下原则&#xff1a; 只发布最优且有效路由。从EBGP对等体获取的路由&#xff0c;会发布给所有对等体。IBGP水平分割…

R语言画样本不均衡组的箱线图

# 导入 ggplot2 包 library(ggplot2)# 示例数据框&#xff0c;包含数值数据和分组信息 data <- data.frame(Group c(rep("Group A",10), rep("Group B",15),rep("Group C",20)),Value c(rnorm(10, mean 10, sd 2),rnorm(15, mean 15, sd…

渗透测试漏洞原理之---【XSS 跨站脚本攻击】

文章目录 1、跨站 脚本攻击1.1、漏洞描述1.2、漏洞原理1.3、漏洞危害1.4、漏洞验证1.5、漏洞分类1.5.1、反射性XSS1.5.2、存储型XSS1.5.3、DOM型XSS 2、XSS攻防2.1、XSS构造2.1.1、利用<>2.1.2、JavaScript伪协议2.1.3、时间响应 2.2、XSS变形方式2.2.1、大小写转换2.2.2…

【设备树笔记整理6】中断系统中的设备树

1 中断概念的引入与处理流程 1.1 中断处理框图 1.2 中断程序的使用 主函数() while(1) {do_routine_task(); }中断处理函数() {handle_interrupt_task(); }如何调用中断处理函数&#xff1f; 1.3 ARM对异常(中断)的处理过程 &#xff08;1&#xff09;初始化 ① 设置中断…

springboot+mp完成简单案例

目录 1.框架搭建 2.前端搭建 3.后端编写 需求&#xff1a;完成简单的连表条件查询以及添加即可 1.框架搭建 1.创建springboot项目 2.相关依赖 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

Java 时间日期处理,工作必用(建议收藏)

工作中经常会遇到对时间日期进行处理的业务&#xff0c;像日期类的API个人觉得不需要背&#xff0c;需要的时候去查资料就行。我整理了Java8之前及之后日期类常用的时间日期处理方法&#xff0c;方便工作需要时查找&#xff0c;觉得有用的朋友可以收藏。 一、日期格式化和解析 …

ElasticSearch - 海量数据索引拆分的一些思考

文章目录 困难解决方案初始方案及存在的问题segment merge引入预排序 拆分方案设计考量点如何去除冗余数据按什么维度拆分&#xff0c;拆多少个最终的索引拆分模型演进历程整体迁移流程全量迁移流程流量回放比对验证异步转同步多索引联查优化效果 总结与思考参考 困难 索引数据…

DaVinci Resolve(达芬奇)软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 DaVinci Resolve是一款专业的影视后期制作软件&#xff0c;被广泛应用于电影、电视剧、广告、纪录片等影视制作领域。它提供了全面的后期制作工具&#xff0c;包括色彩校正、颜色分级、视觉效果处理、音频处理等&#xff0c;能够…

【前端工程化】万字拆解package.json (一)

什么是package package 指拥有 package.json 的一个文件夹&#xff08;或压缩包&#xff09;&#xff0c;而 package 的属性就是 package.json 文件的内容&#xff0c;比如&#xff1a; name&#xff1a;这个包叫什么名字&#xff0c;唯一version&#xff1a;这个包的版本号是…

第三方检测检验实验室信息化建设

检测公司配置先进的信息化管理系统&#xff0c;信息化管理系统采用适宜的、先进的架构&#xff0c;具备开放性、扩展性、前瞻性、安全性等。先期建设按照实验室的规格及整体配套设施&#xff0c;整个实验室信息化系统的结构化数据考虑本地存储&#xff0c;且应考虑高速存储应用…

python3GUI--模仿一些b站网页端组件By:PyQt5(详细介绍、附下载地址)

文章目录 一&#xff0e;前言二&#xff0e;展示1.banner1.静图2.动图 2.一般视频组件1.静图2.动图 3.排行榜1.静图2.动图 三&#xff0e;设计心得(顺序由简到难)1.排行榜2.一般视频组件3.banner 四&#xff0e;总结五&#xff0e;下载地址 一&#xff0e;前言 播客二连发&…

React Hooks 全解:零基础入门

Hooks 的由来 你还在为该使用无状态组件&#xff08;Function&#xff09;还是有状态组件&#xff08;Class&#xff09;而烦恼吗&#xff1f; ——拥有了hooks&#xff0c;你再也不需要写Class了&#xff0c;你的所有组件都将是Function。 你还在为搞不清使用哪个生命周期钩…