通讯录(C语言文件版本)(超详细过程)

news2024/11/25 3:02:27


❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️
❇️❇️❇️❇️ 不同的信念 ❇️❇️❇️❇️
❇️❇️❇️ 决定不同的命运 ❇️❇️❇️
❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️❇️

📖通讯录

✅具备的功能

ℹ️需要的头文件名

#include<stdio.h>//第一个
#include<string.h>//第二个
#include<stdlib.h>//第三个

第一个头文件名是常规的头文件名如:int main()主函数和printf函数等都需要,只要写C语言都需要此头文件名。

第二个头文件名是在下面执行通讯录文件时需要使用strcmp函数会用到

第三个头文件名也是在下面执行通讯录文件时会用到,如:qsort()函数和free()函数会用到

当然这些函数的用途,在讲解通讯录的时候会个哦大家介绍。

ℹ️所用到的其它函数和相关结构体

typedef struct Proper//所存储的人的信息
{
	char name[20];//姓名
	int age;//年龄
	char number[20];//电话号码
}Proper;

typedef struct Contact存储人信息的空间
{
	Proper* date;//存储人信息的指针
	int se;//空间里存储联系人信息的数量
	int eff;//空间总的大小
}Contact;

void Inialize(Contact* con)//存储联系人信息的数组初始化
{
	con->date = (Proper*)malloc(3 * sizeof(Proper));
	if (con->date == NULL)
	{
		perror("Inialize");
		return;
	}
	con->se = 0;
	con->eff = 3;
}

void menu()//游戏菜单
{
	printf("*******************************\n");
	printf("***** 1、添加联系人 ***********\n");
	printf("***** 2、删除联系人 ***********\n");
	printf("***** 3、显示联系人 ***********\n");
	printf("***** 4、查找联系人 ***********\n");
	printf("***** 5、修改联系人 ***********\n");
	printf("***** 6、联系人排序 ***********\n");
	printf("***** 7、清空联系人 ***********\n");
	printf("***** 8、退出通讯录 ***********\n");
	printf("*******************************\n");
}
void test()//通讯录函数
{
	int input = 0;
	Contact con;
	Inialize(&con);//通讯录初始化
	do
	{
		menu();//游戏菜单
		printf("请作出选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);//添加联系人
			break;
		case 2:
			Delete(&con);//删除联系人
			break;
		case 3:
			Display(&con);//显示联系人
			break;
		case 4:
			SeekContact(&con);//查找联系人
			break;
		case 5:
			Modify(&con);//修改联系人
			break;
		case 6:
			SortContact(&con);//联系人排序
			break;
		case 7:
			empty(&con);
			break;
		case 8:
			SaveContact(&con);
			realse(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
		if (input == 8)
			input = 0;
	} while (input);
}
int main()//主函数
{
	test();
	return 0;
}

ℹ️添加联系人

int  Addeff(Contact* con)//检查存储空间是否满的函数
{
	if (con->se == con->eff)//两者相等时会满,除了首次进入两个都为0的情况
	{
		Proper* per = (Proper*)realloc(con->date, (con->eff + 2) * sizeof(Proper));
		if (per == NULL)//判断per空间的创建是否成功
		{
			perror("Addeff");
			return 0;
		}
		con->date = per;
		con->eff = con->eff + 2;
		printf("增容成功\n");
	}
	return 1;
}
void AddContact(Contact* con)//添加联系人函数
{
	if (Addeff(con) == 0)//如果Addeff函数如果返回0,则表示空间创建失败,则不可以添加联系人
	{
		return;
	}

	printf("输入姓名:>");
	scanf("%s", con->date[con->se].name);

	printf("输入年龄:>");
	scanf("%d", &con->date[con->se].age);//这里会什么会加&(地址符)呢,这是因为输入的是一个数,而上面输入不需要加&,是因为是数组。数组首元素就是该数组的大小
	
	printf("输入电话号码:>");
	
	scanf("%s", con->date[con->se].number);
	
	con->se++;
	printf("添加成功\n");
}

Addeff函数是用来检查我们所用来存储联系人的空间有没有满,如果满了,就会利用此函数来增加空间。Contact()函数就是来添加联系人

ℹ️删除联系人

void Delete(Contact* con)//删除联系人函数
{
	int i = 0;
	char m[20] = { 0 };//创建一个新的数组用来输入你需要查找的联系人的空间
	printf("输入你需要删除联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)//在数据里查找你需要删除的联系人的信息
	{
		int j = 0;
		if (strcmp(m, con->date[i].name) == 0)
		{
			for (j = i; j < con->se - 1; j++)//当你找到你所要删除的联系人的消息的时候,利用后面的数据把此数据进行覆盖,这样就达到删除的功效
			{

				con->date[j] = con->date[j + 1];
			}
			con->se--;//当你删除联系人的时候该联系人后面的数据都往前移了一步,这样最后就多了一个空间,此时我们就需要删掉这个空间
			printf("删除成功\n");
		}
	}
}

此过程还是很好理解的,因为存储联系人的信息是数组,所以我们只能利用覆盖来删除。

ℹ️显示联系人

void  Display(Contact* con)//打印通讯录所有联系人信息的函数
{
	int i = 0;
	printf("%-10s  %-10s  %-10s\n", "姓名", "年龄", "电话");
	for (i = 0; i < con->se; i++)
	{
		printf("%-10s  %-10d  %-10s\n", con->date[i].name, con->date[i].age, con->date[i].number);
	}
}

ℹ️查找联系人

void SeekContact(Contact* con)
{
	int i = 0;
	char m[20] = { 0 };//和删除联系人所需创建的变量是同一个意思,在这里它就是存储你需要查找的联系人的信息
	printf("输入你要查找的联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)//遍历一遍
	{
		if (strcmp(m, con->date[i].name) == 0)//利用了strcmp函数
		{
			printf("找到了:姓名:%s, 年龄:%d, 号码:%s\n", con->date[i].name, con->date[i].age, con->date[i].number);
		}
	}
}

strcmp就是用来比较字符串大小的函数,它的用法在我以前写的博客中有介绍大家可以去看看:字符和字符串的库函数模拟(这是一个链接有需要的可以直接点进去看)

ℹ️修改联系人

void Modify(Contact* con)//修改联系人信息的函数
{
	char m[20] = { 0 };//这里与上面的用法差不多,用来存储你需要查找联系人的信息
	printf("输入你需要修改联系人的姓名:>");
	scanf("%s", m);
	int i = 0;
	for (i = 0; i < con->se; i++)//遍历一遍
	{
		if (strcmp(m, con->date[i].name) == 0)//利用了strcmp函数
		{
			printf("重新输入姓名:>");
			scanf("%s", con->date[i].name);

			printf("重新输入年龄:>");
			scanf("%d", &con->date[i].age);//这里会什么会加&(地址符)呢,这是因为输入的是一个数,而上面输入不需要加&,是因为是数组。数组首元素就是该数组的大小

			printf("重新输入号码:>");
			scanf("%s", con->date[i].number);

			printf("修改成功\n");
		}
	}
}

ℹ️联系人排序

int compare(const void* p1, const void* p2)//比较函数
{
	return strcmp(((Proper*)p1)->name, ((Proper*)p2)->name);
}

void  SortContact(Contact* con)//用来进行联系人排序的函数
{
	qsort(con->date, con->se, sizeof(Proper), compare);//这是一个专门进行排序的函数
	printf("成功排序\n");
}

qsort()函数:可以参考相关的博客,也可以百度,在这里就不做过多解释了(抱歉)
compare()函数:此函数是和qsort函数搭配使用。参考相关资料。(抱歉)

ℹ️清空联系人

void empty(Contact* con)//清除联系人的函数
{
	con->se = 0;//因为con->se表示的是数组空间类的大小,当空间为0的时候这组也就没有数据了
	printf("成功清除\n");
}

ℹ️退出通讯录

当input输入为0的时候程序就退出了

ℹ️通讯录置空

void realse(Contact* con)//通讯录空间置空的函数
{
	free(con->date);//置空函数,只要是动态开辟的空间都需要使用该函数进行置空,否者就会有内存泄漏的情况
	con->date = NULL;//和free是搭配使用的
	con->se = 0;
	con->eff = 0;
}

关于free()函数的用法。大家可以看我以前这篇的博客:动态内存管理(c语言)(这是个链接,有不清楚的可以点进去观看,里面对于懂得太内存有详细的介绍)

ℹ️普通的通讯录实现

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct Proper
{
	char name[20];
	int age;
	char number[20];
}Proper;

typedef struct Contact
{
	Proper* date;
	int se;
	int eff;
}Contact;

void menu()
{
	printf("*******************************\n");
	printf("***** 1、添加联系人 ***********\n");
	printf("***** 2、删除联系人 ***********\n");
	printf("***** 3、显示联系人 ***********\n");
	printf("***** 4、查找联系人 ***********\n");
	printf("***** 5、修改联系人 ***********\n");
	printf("***** 6、联系人排序 ***********\n");
	printf("***** 7、清空联系人 ***********\n");
	printf("***** 8、退出通讯录 ***********\n");
	printf("*******************************\n");
}

void Inialize(Contact* con)
{
	con->date = (Proper*)malloc(3 * sizeof(Proper));
	if (con->date == NULL)
	{
		perror("Inialize");
		return;
	}
	con->se = 0;
	con->eff = 3;
}

int  Addeff(Contact* con)
{
	if (con->se == con->eff)
	{
		Proper* per = (Proper*)realloc(con->date, (con->eff + 2) * sizeof(Proper));
		if (per == NULL)
		{
			perror("Addeff");
			return 0;
		}
		con->date = per;
		con->eff = con->eff + 2;
		printf("增容成功\n");
	}
	return 1;
}

void AddContact(Contact* con)
{
	if (Addeff(con) == 0)
	{
		return;
	}

	printf("输入姓名:>");
	scanf("%s", con->date[con->se].name);

	printf("输入年龄:>");
	scanf("%d", &con->date[con->se].age);

	printf("输入电话号码:>");
	scanf("%s", con->date[con->se].number);

	con->se++;

	printf("添加成功\n");

}

void  Display(Contact* con)
{
	int i = 0;
	printf("%-10s  %-10s  %-10s\n", "姓名", "年龄", "电话");
	for (i = 0; i < con->se; i++)
	{
		printf("%-10s  %-10d  %-10s\n", con->date[i].name, con->date[i].age, con->date[i].number);
	}
}

void Delete(Contact* con)
{
	int i = 0;
	char m[20] = { 0 };
	printf("输入你需要删除联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)
	{
		int j = 0;
		if (strcmp(m, con->date[i].name) == 0)
		{
			for (j = i; j < con->se - 1; j++)
			{

				con->date[j] = con->date[j + 1];
			}
			con->se--;
			printf("删除成功\n");
		}
	}
}

void SeekContact(Contact* con)
{
	int i = 0;
	char m[20] = { 0 };
	printf("输入你要查找的联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)
	{
		if (strcmp(m, con->date[i].name) == 0)
		{
			printf("找到了:姓名:%s, 年龄:%d, 号码:%s\n", con->date[i].name, con->date[i].age, con->date[i].number);
		}
	}
}

void Modify(Contact* con)
{
	char m[20] = { 0 };
	printf("输入你需要修改联系人的姓名:>");
	scanf("%s", m);
	int i = 0;
	for (i = 0; i < con->se; i++)
	{
		if (strcmp(m, con->date[i].name) == 0)
		{
			printf("重新输入姓名:>");
			scanf("%s", con->date[i].name);

			printf("重新输入年龄:>");
			scanf("%d", &con->date[i].age);

			printf("重新输入号码:>");
			scanf("%s", con->date[i].number);

			printf("修改成功\n");
		}
	}
}

int compare(const void* p1, const void* p2)
{
	return strcmp(((Proper*)p1)->name, ((Proper*)p2)->name);
}

void  SortContact(Contact* con)
{
	qsort(con->date, con->se, sizeof(Proper), compare);
	printf("成功排序\n");
}

void empty(Contact* con)
{
	con->se = 0;
	printf("成功清除\n");
}

void realse(Contact* con)
{
	free(con->date);
	con->date = NULL;
	con->se = 0;
	con->eff = 0;
}

void test()
{
	int input = 0;
	Contact con;
	Inialize(&con);//通讯录初始化
	do
	{
		menu();//游戏菜单
		printf("请作出选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);//添加联系人
			break;
		case 2:
			Delete(&con);//删除联系人
			break;
		case 3:
			Display(&con);//显示联系人
			break;
		case 4:
			SeekContact(&con);//查找联系人
			break;
		case 5:
			Modify(&con);//修改联系人
			break;
		case 6:
			SortContact(&con);//联系人排序
			break;
		case 7:
			empty(&con);
			break;
		case 8:
			realse(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
		if (input == 8)
			input = 0;
	} while (input);
}

int main()
{
	test();
	return 0;
}

上面就是普通的通讯录的实现代码了。有需要的直接复制粘贴就可以了。

✅动态文件操作实现过程

ℹ️联系人信息保存在文件中

void SaveContact(Contact* con)
{
	FILE* fp = fopen("C:\\Users\\杨沛琪\\Desktop\\contact.txt", "wb");//这就是文件的创建
	if (fp == NULL)//这是文件的判断,如果创建的文件为空,则直接结束该函数,不会进行下一步
	{
		perror("fopen");
		return;
	}
	for (int i = 0; i < con->se; i++)
	{
		fwrite(&(con->date[i]), sizeof(Proper), 1, fp);//这是把数组的数据存储到我们刚才创建的文件fp中
	}
	fclose(fp);//文件置空,和free用法一样只不过fclose是文件置空使用,free是动态空间使用
	fp = NULL;//和fclose两者是搭配使用的

}

大家如果对于文件方面的操作不太了解的话,如:FILE,fwrite,fread等的用法,大家可以观看我的这篇博客文件详细操作过程(C语言)(这是一个链接,大家对于文件方面知识的欠缺可以点进去看)。

ℹ️从文件中读取联系人的信息

void LoadContact(Contact* con)//读取文件中联系人的信息
{
	FILE* fp = fopen("C:\\Users\\杨沛琪\\Desktop\\contact.txt", "rb");
	if (fp == NULL)
	{
		perror("LoadContact");
		return;
	}
	Proper tem = { 0 };
	while (fread( & tem, sizeof(Proper), 1, fp))//fread()函数是读取文件的函数
	{		
		if (0 == Addeff(con))
			return;
		con->date[con->se] = tem;
		con->se++;
	}
	//为什么要把函数放在while循环中呢?这是因为fread的返回值是整数型。它读取一个数据就会返回1,读取两个就返回2,以此类推,当读取的数据为空时就会返回0.
	fclose(fp);//置空函数,和free用法一样,只不过fclose是文件置空而free是动态空间置空
	fp = NULL;//和fclose搭配使用
}
void Inialize(Contact* con)//存储联系人信息的数组初始化
{
	con->date = (Proper*)malloc(3 * sizeof(Proper));
	if (con->date == NULL)
	{
		perror("Inialize");
		return;
	}
	con->se = 0;
	con->eff = 3;
	LoadContact(con);//和普通的通讯录实现中的初始化仅仅多了这一个函数,当我们需要在程序执行前读取文件中所存储的联系人信息,只能放在初始化过程中实现。
}

大家如果对于文件方面的操作不太了解的话,如:FILE,fwrite,fread等的用法,大家可以观看我的这篇博客文件详细操作过程(C语言)(这是一个链接,大家对于文件方面知识的欠缺可以点进去看)。

ℹ️通讯录(文件形式)实现过程

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

typedef struct Proper
{
	char name[20];
	int age;
	char number[20];
}Proper;

typedef struct Contact
{
	Proper* date;
	int se;
	int eff;
}Contact;

void menu()
{
	printf("*******************************\n");
	printf("***** 1、添加联系人 ***********\n");
	printf("***** 2、删除联系人 ***********\n");
	printf("***** 3、显示联系人 ***********\n");
	printf("***** 4、查找联系人 ***********\n");
	printf("***** 5、修改联系人 ***********\n");
	printf("***** 6、联系人排序 ***********\n");
	printf("***** 7、清空联系人 ***********\n");
	printf("***** 8、退出通讯录 ***********\n");
	printf("*******************************\n");
}

int  Addeff(Contact* con);//因为Addeff函数在创建的时候是在下面,而在它之前的函数需要调用的时候就会找不到,所以就需要提前写一个声明。在C语言中函数执行顺序是从上往下。

void LoadContact(Contact* con)
{
	FILE* fp = fopen("C:\\Users\\杨沛琪\\Desktop\\contact.txt", "rb");
	if (fp == NULL)
	{
		perror("LoadContact");
		return;
	}
	Proper tem = { 0 };
	while (fread( & tem, sizeof(Proper), 1, fp))
	{
		if (0 == Addeff(con))
			return;
		con->date[con->se] = tem;
		con->se++;
	}
	fclose(fp);
	fp = NULL;
}

void Inialize(Contact* con)
{
	con->date = (Proper*)malloc(3 * sizeof(Proper));
	if (con->date == NULL)
	{
		perror("Inialize");
		return;
	}
	con->se = 0;
	con->eff = 3;
	LoadContact(con);
}

int  Addeff(Contact* con)
{
	if (con->se == con->eff)
	{
		Proper* per = (Proper*)realloc(con->date, (con->eff + 2) * sizeof(Proper));
		if (per == NULL)
		{
			perror("Addeff");
			return 0;
		}
		con->date = per;
		con->eff = con->eff + 2;
		printf("增容成功\n");
	}
	return 1;
}

void AddContact(Contact* con)
{
	if (Addeff(con) == 0)
	{
		return;
	}

	printf("输入姓名:>");
	scanf("%s", con->date[con->se].name);

	printf("输入年龄:>");
	scanf("%d", &con->date[con->se].age);

	printf("输入电话号码:>");
	scanf("%s", con->date[con->se].number);

	con->se++;

	printf("添加成功\n");

}

void  Display(Contact* con)
{
	int i = 0;
	printf("%-10s  %-10s  %-10s\n", "姓名", "年龄", "电话");
	for (i = 0; i < con->se; i++)
	{
		printf("%-10s  %-10d  %-10s\n", con->date[i].name, con->date[i].age, con->date[i].number);
	}
}

void Delete(Contact* con)
{
	int i = 0;
	char m[20] = { 0 };
	printf("输入你需要删除联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)
	{
		int j = 0;
		if (strcmp(m, con->date[i].name) == 0)
		{
			for (j = i; j < con->se - 1; j++)
			{

				con->date[j] = con->date[j + 1];
			}
			con->se--;
			printf("删除成功\n");
		}
	}
}

void SeekContact(Contact* con)
{
	int i = 0;
	char m[20] = { 0 };
	printf("输入你要查找的联系人的姓名:>");
	scanf("%s", m);
	for (i = 0; i < con->se; i++)
	{
		if (strcmp(m, con->date[i].name) == 0)
		{
			printf("找到了:姓名:%s, 年龄:%d, 号码:%s\n", con->date[i].name, con->date[i].age, con->date[i].number);
		}
	}
}

void Modify(Contact* con)
{
	char m[20] = { 0 };
	printf("输入你需要修改联系人的姓名:>");
	scanf("%s", m);
	int i = 0;
	for (i = 0; i < con->se; i++)
	{
		if (strcmp(m, con->date[i].name) == 0)
		{
			printf("重新输入姓名:>");
			scanf("%s", con->date[i].name);

			printf("重新输入年龄:>");
			scanf("%d", &con->date[i].age);

			printf("重新输入号码:>");
			scanf("%s", con->date[i].number);

			printf("修改成功\n");
		}
	}
}

int compare(const void* p1, const void* p2)
{
	return strcmp(((Proper*)p1)->name, ((Proper*)p2)->name);
}

void  SortContact(Contact* con)
{
	qsort(con->date, con->se, sizeof(Proper), compare);
	printf("成功排序\n");
}

void empty(Contact* con)
{
	con->se = 0;
	printf("成功清除\n");
}

void realse(Contact* con)
{
	free(con->date);
	con->date = NULL;
	con->se = 0;
	con->eff = 0;
}

void SaveContact(Contact* con)
{
	assert(con);
	FILE* fp = fopen("C:\\Users\\杨沛琪\\Desktop\\contact.txt", "wb");
	if (fp == NULL)
	{
		perror("fopen");
		return;
	}
	for (int i = 0; i < con->se; i++)
	{
		fwrite(&(con->date[i]), sizeof(Proper), 1, fp);
	}
	fclose(fp);
	fp = NULL;

}

void test()
{
	int input = 0;
	Contact con;
	Inialize(&con);//通讯录初始化
	do
	{
		menu();//游戏菜单
		printf("请作出选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			AddContact(&con);//添加联系人
			break;
		case 2:
			Delete(&con);//删除联系人
			break;
		case 3:
			Display(&con);//显示联系人
			break;
		case 4:
			SeekContact(&con);//查找联系人
			break;
		case 5:
			Modify(&con);//修改联系人
			break;
		case 6:
			SortContact(&con);//联系人排序
			break;
		case 7:
			empty(&con);
			break;
		case 8:
			SaveContact(&con);
			realse(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
		if (input == 8)
			input = 0;
	} while (input);
}

int main()
{
	test();
	return 0;
}


✏️✏️✏️✏️📖📖✏️✏️✏️✏️✏️✏️✏️📖📖✏️✏️
✏️✏️✏️✏️📖📖我们一起加油哈!!📖📖✏️✏️
✏️✏️✏️✏️📖📖✏️✏️✏️✏️✏️✏️📖📖✏️✏️

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

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

相关文章

二叉树按二叉链表形式存储,试编写一个判别给定二叉树是否是完全二叉树的算法

完全二叉树&#xff1a;就是每层横着划过去是连起来的&#xff0c;中间不会断开 比如下面的左图就是完全二叉树 再比如下面的右图就是非完全二叉树 那我们可以采用层序遍历的方法&#xff0c;借助一个辅助队列 当辅助队列不空的时候&#xff0c;出队头元素&#xff0c;入队头…

开发知识点-PHP从小白到拍簧片

从小白到拍簧片 位异或运算&#xff08;^ &#xff09;引用符号(&)strlen() 函数base64_encode预定义 $_POST 变量session_start($array);操作符php 命令set_time_limit(7200)isset()PHP 命名空间(namespace)new 实例化类extends 继承 一个类使用另一个类方法error_reporti…

如何利用Jmeter从0到1做一次完整的压测?这2个步骤很关键!

压测&#xff0c;在很多项目中都有应用&#xff0c;是测试小伙伴必备的一项基本技能&#xff0c;刚好最近接手了一个小游戏的压测任务&#xff0c;一轮压测下来&#xff0c;颇有收获&#xff0c;赶紧记录下来&#xff0c;与大家分享一下&#xff0c;希望大家能少踩坑。 一、压…

ADO实战指南

这里写目录标题 ADO概念ADO主要对象对象间的相互联系对象模型示意图 关键代码关于代码中的一些问题设置字符串连接对象OLE DB是什么&#xff1f;与ADO的关系是什么&#xff1f;执行命令时&#xff0c;使用连接对象来访问数据库。close与nothing做了什么事&#xff1f;连接对象为…

Splunk 创建特色 dashboard 报表

1: 背景: 对原有的dashboard 进行增加点东西,特别是文字部分: 比如: 增加:“this is a guidline for how to use performance". 这段话,就不能写在title, 那样,这段文字,会出现在dashboard 的PDF 文件的分割线的上面,不符合要求。 2: 解决问题: 正确的做法是…

torch安装

https://download.pytorch.org/whl/torch_stable.html cp36 是python3.6的意思 python3.6对应torch1.8

外卖系统内部机理揭秘:了解更多

外卖系统是一个涉及多个环节和技术的复杂系统&#xff0c;包括前端用户交互、后端数据处理、订单管理和配送等多个方面。 技术架构概述&#xff1a; 前端应用程序&#xff1a; 包括用户界面和餐厅界面&#xff0c;常见的技术包括 HTML、CSS、JavaScript 和前端框架&#xff…

【入门Flink】- 06Flink作业提交流程【待完善】

Standalone 会话模式作业提交流程 代码生成任务的过程&#xff1a; 逻辑流图&#xff08;StreamGraph&#xff09;→ 作业图&#xff08;JobGraph&#xff09;→ 执行图&#xff08;ExecutionGraph&#xff09;→物理图&#xff08;Physical Graph&#xff09;。 作业图算子链…

【漏洞复现】Aapache_Tomcat_AJP协议_文件包含漏洞(CVE-2020-1938)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 说明内容漏洞编号CVE-2020-1938漏洞名称Aapache_Tomcat_AJP文件包含漏洞漏洞评级高…

el-select 搜索无选项时 请求接口添加输入的值

el-select 搜索无选项时 请求接口添加输入的值 <template><div class"flex"><el-select class"w250" v-model"state.brand.id" placeholder"请选择" clearable filterable :filter-method"handleQu…

关闭Dell xps 系列笔记本触控屏

【电脑】->【管理】->【设备管理器】 右键 禁用选择即可

怎么测量直线模组的精度?

直线模组是一款比较多变的一种产品&#xff0c;适合多种行业&#xff0c;同时它也适合比较多的环境&#xff0c;是一种比较全面的直线运动的装置。直线模组是非常精密的自动化机械设备&#xff0c;在实践中&#xff0c;应该要严格把握具体精度&#xff0c;并且在必要的时候&…

CDN加速是否对SEO有正面影响

当谈到网站性能优化和SEO&#xff08;搜索引擎优化&#xff09;时&#xff0c;CDN&#xff08;内容分发网络&#xff09;加速无疑是一个重要的话题。CDN是一种分布式网络基础设施&#xff0c;它通过将网站内容分发到全球各地的边缘服务器&#xff0c;从而加速内容的传递。在这篇…

apb介绍

https://www.cnblogs.com/xianyuIC/p/17279209.html***带testbench https://zhuanlan.zhihu.com/p/623829190?utm_id0 https://zhuanlan.zhihu.com/p/607964532带testbench by四人独行 https://blog.csdn.net/weixin_40377195/article/details/124899571 APB是最简单的AMBA总…

链表详讲(附代码)

1.什么是链表 链表是一种非常常见的数据结构&#xff0c;在程序设计中经常被使用。它由一系列节点组成&#xff0c;每个节点都有用来存放数据的数据区以及存放下一个节点地址指针的地址区。跟顺序表不同的是&#xff0c;链表的节点之间的空间并非是连续的&#xff0c;依靠地址区…

最新waymo数据集 百度网盘

最新waymo数据集介绍 waymo数据集是有史以来最大&#xff0c;最多样化的自动驾驶数据集&#xff0c;包含 传感器数据边界框数据2D视频全景分割标签关键点标签3D语义分割标签2D和3D边界框的关联 是该领域质量最高、规模最大的数据集之一&#xff0c;用于帮助研究界在机器感知…

【Orangepi Zero2 全志H616】开发板资料(刷机、系统烧录)及环境搭建

一、资料文档 二、MobaXterm远程连接工具 三、修改登录密码 四、修改内核日志等级 五、配置网络 六、SSH 访问 OrangePi ZERO 2 七、配置 vim 八、基于官方外设开发SDK 一、资料文档 官网资料下载 GitHub&#xff1a;新版本的 orangepi-build 源码 环境搭建&#xff1a;新手配…

IP协议汇总

IP协议 1.基本概念 IP协议全称为“网际互连协议&#xff08;Internet Protocol&#xff09;” ,IP协议是TCP/IP体系中的网络层协议。 总的来说&#xff0c;IP协议的最重要功能是提供了一种标准化的方式来路由和传输数据包&#xff0c;以实现全球互联网上的通信。 &#xff…

YOLOv7独家原创改进:新颖自研设计的BSAM注意力,基于CBAM升级

💡💡💡本文全网首发独家改进:提出新颖的注意力BSAM(BiLevel Spatial Attention Module),创新度极佳,适合科研创新,效果秒杀CBAM,Channel Attention+Spartial Attention升级为新颖的 BiLevel Attention+Spartial Attention 1)作为注意力BSAM使用; 推荐指数:…

数据结构构之顺序表

1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线…