通讯录的动态实现

文章目录

  • 通讯录的动态实现
    • 模块化编程
    • 通讯录的框架构建
    • 功能的具体实现
        • 初始化通讯录
        • 添加联系人
        • 删除联系人
        • 查找联系人
        • 修改联系人
        • 打印通讯录
        • 排序通讯录
        • 检查容量并扩容
        • 加载通讯录
        • 保留通讯录
        • 销毁通讯录
    • 完整代码
    • 总结

通讯录的动态实现

模块化编程

分文件
不同模块放在不同的文件下
优点
可维护性:不同模块便于调试某个功能和修改
重用性:常用的功能封装成模块,减少重复利用,提高开发效率
可扩展性:需要增删改现有功能时,模块化编程能够提供更好的扩展性
并行开发:允许多个开发人员并行工作,降低开发过程中的冲突和合并的风险
可测试性:每个模块都是独立的,便于测试功能和性能

通讯录的框架构建

录入联系人信息
由于录入人员一般比较多,需要用创建结构体来创建通讯录结构体和成员信息结构体
录入的信息一般有联系人的姓名、性别、年龄、联系方式、家庭住址

typedef struct peoinfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}peoinfo;
typedef struct Contact
{
	peoinfo* data;
	int count;//用于记录data对应的下标
	int capacity;

}Contact;

宏定义

#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 12
#define MAX_ADDR 30

#define MAX_PEONUM 2
#define MAX_COUNT 3

菜单实现

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

通讯录功能声明

void InitContact(Contact* pc);//初始化
void Addpeoinfo(Contact* pc);//增加联系人
void PrintContact(Contact* pc);//打印通讯录
void Delpeoinfo(Contact* pc);//删除联系人
void Findpeoinfo(Contact* pc);//查找联系人
void Modifypeoinfo(Contact* pc);//修改联系人
void SortContact(Contact* pc);//排序通讯录
void DestroyContact(Contact* pc);//销毁通讯录
void SaveContact(Contact* pc);//保留通讯录
void LoadContact(Contact* pc);//加载通讯录
void Check_Capacity(Contact* pc);//检查容量

声明都放在Contact.h头文件里

功能的具体实现

初始化通讯录
void InitContact(Contact* pc)
{
	pc->count = 0;
	pc->data = (peoinfo*)calloc(MAX_PEONUM ,sizeof(peoinfo));//动态内存管理,在堆区分配一块peoinfo*MAX_PEONUM的内存,并且每个字节初始化为0
	// memset(pc->data, 0, sizeof(pc->data));
	pc->capacity = MAX_PEONUM;
	//LoadContact(pc);
}
添加联系人
void Addpeoinfo(Contact* pc)
{
	/*assert(pc);
	if (pc->count = MAX_PEONUM)
	{
		printf("通讯录已满\n");

	}
	else
	{
		printf("请输入名字;>");
		scanf("%s", pc->data[pc->count].name);
		printf("请输入性别;>");
		scanf("%s", pc->data[pc->count].sex);
		printf("请输入年龄;>");
		scanf("%s", pc->data[pc->count].age);
		printf("请输入电话;>");
		scanf("%s", pc->data[pc->count].tele);
		printf("请输入地址;>");
		scanf("%s", pc->data[pc->count].addr);
		pc->count++;
		printf("添加成功\n");
	}*/
	assert(pc);//确定不是空指针
	Check_Capacity(pc);
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("添加成功\n");
	

}
删除联系人
void Delpeoinfo(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入要删除的联系人的名字;>");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通讯录中没有这个人\n");
		return;
	}
	else
	{
		int i = 0;
		for (int i = pos; i < pc->count - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		printf("删除成功\n");
		pc->count--;
	}
减容,如果容量减去录入的联系人大于3,减少为两个空间
	if ((pc->capacity - pc->count) > 3)
	{
		peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->count + 2) * sizeof(peoinfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity = pc->count + 2;

			printf("通讯录空闲内存大于三个人,减为两个空间,减容成功\n");
		}
		else
		{
			perror("Delpeoinfo");//perror是打印错误信息
		}
	}
}
查找联系人

查找联系人可以通过找到联系人对应名字,并返回下标记录是否找到
需要再封装一个函数

查找名字

static int FindName(const Contact* pc,const char *name)
{
	assert(pc && name);

	for (int pos = 0; pos < pc->count; pos++)
	{
		if (strcmp(pc->data[pos].name, name) == 0)
		{
			return pos;//返回下标
		}
		else
			return -1;
	}
}
void Findpeoinfo(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入你要查找的联系人的名字:>");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("查无此人\n");
		

	}
	else
	{
		printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
		printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
			pc->data[pos].name,
			pc->data[pos].sex,
			pc->data[pos].age,
			pc->data[pos].tele,
			pc->data[pos].addr);


	}

}
修改联系人
void Modifypeoinfo(Contact* pc) 
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入你要修改的联系人:>");
	scanf("%s", name);
	int pos = FindName(pc, name);
		if (pos == -1)
		{
			printf("查无此人\n");
			return ;
       	}
		else
		{
			printf("请输入修改后的名字:>");
			scanf("%s", pc->data[pos].name);
			printf("请输入修改后的性别:>");
			scanf("%s", pc->data[pos].sex);
			printf("请输入修改后的年龄:>");
			scanf("%d", &pc->data[pos].age);
			printf("请输入修改后的电话:>");
			scanf("%s", pc->data[pos].tele);
			printf("请输入修改后的地址:>");
			scanf("%s", pc->data[pos].addr);
			
			printf("修改成功\n");
			
		}
}
打印通讯录
void PrintContact(const Contact* pc)
{
	printf("---------------------\n");
	printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pc->count; i++)

	{
		printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].addr);
		
		
	}
	printf("---------------------\n");
}

打印int类型要用%d

排序通讯录
int cmp1(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int cmp3(const void* p1, const void* p2)
{
	return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp4(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sort_by_name(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo),cmp1);
}
void sort_by_sex(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp2);
}
void sort_by_age(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp3);
}
void sort_by_tele(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void sort_by_addr(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void Sortmenu()
{
	printf("*******************************\n");
	printf("*****  1.name     2.sex   *****\n");
	printf("*****  3.age      4.tele  *****\n");
	printf("*****        5.addr       *****\n");
	printf("*******************************\n");
}
void SortContact(Contact* pc)
{
	assert(pc);
	Sortmenu();
	printf("请选择如何排序;>");
	int num = 0;
		scanf("%d", &num);
		
		if (num==1)
		{
			sort_by_name(pc);
		}
		else if (num==2)
		{
			sort_by_sex(pc);
		}
		else if (num==3)
		{
			sort_by_age(pc);
		}
		else if (num==4)
		{
			sort_by_tele(pc);
		}
		else if (num==5)
		{
			sort_by_addr(pc);
		}
		else
		{
			printf("输入非法,请重新输入\n");
		}
		printf("排序后\n");
		printf("---------------------\n");
		printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
		for (int i = 0; i < pc->count; i++)

		{
			printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
				pc->data[i].name,
				pc->data[i].sex,
				pc->data[i].age,
				pc->data[i].tele,
				pc->data[i].addr);


		}
		printf("---------------------\n");

}
检查容量并扩容
void Check_Capacity(Contact* pc)

{
	if (pc->count == pc->capacity)
	{
		peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->capacity + MAX_COUNT) * sizeof(peoinfo));
		if (ptr != NULL)
		{
			pc->data= ptr;
			pc->capacity += MAX_COUNT;
			printf("增容成功\n");
		}
		else {
			perror("peoinfo");
			printf("通讯录已满,增容失败无法添加\n");
			return;

		}
	}
}
加载通讯录
void LoadContact(Contact* pc)
{
	FILE* pf = fopen("Contact.txt", "r");
	if (pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	peoinfo temp = { 0 };
	while (fread(&temp, sizeof(peoinfo), 1, pf))
	{
		Check_Capacity(pc);
		pc->data[pc->count] = temp;
		pc->count++;

	}
	fclose(pf);
	pf = NULL;
}
保留通讯录
void SaveContact(Contact* pc) 
{
	FILE* pf = fopen("Contact.txt", "w");//以写的方式打开文件
	if (pf == NULL)
	{
		perror("SaveContact");
		return;
	}
	fwrite(pc->data, sizeof(peoinfo),pc->count,pf);
	fclose(pf);//关闭文件
	pf = NULL;

}

在这里插入图片描述

这里是引用

销毁通讯录

不占用多余的内存空间,养成好习惯

void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->count = 0;
	pc->capacity = 0;
}

完整代码

Contact.h

#pragma once
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#define MAX_NAME 20
#define MAX_SEX 3
#define MAX_TELE 12
#define MAX_ADDR 30

#define MAX_PEONUM 2
#define MAX_COUNT 3
typedef struct peoinfo
{
	char name[MAX_NAME];
	char sex[MAX_SEX];
	int age;
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}peoinfo;
typedef struct Contact
{
	peoinfo* data;
	int count;
	int capacity;

}Contact;
void InitContact(Contact* pc);
void Addpeoinfo(Contact* pc);
void PrintContact(Contact* pc);
void Delpeoinfo(Contact* pc);
void Findpeoinfo(Contact* pc);
void Modifypeoinfo(Contact* pc);
void SortContact(Contact* pc);
void DestroyContact(Contact* pc);
void SaveContact(Contact* pc);
void LoadContact(Contact* pc);
void Check_Capacity(Contact* pc);

test.c

#define  _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//1.添加联系人
//2.删除联系人
//3.查找联系人
//排序
//修改联系人
//打印通讯录

void menu()
{
	printf("******************************\n");
	printf("*****  1.add     2.del   *****\n");
	printf("*****  3.find    4.sort  *****\n");
	printf("*****  5.modify  6.print *****\n");
	printf("*****      0.exit    *********\n");
	printf("******************************\n");
}
enum option
{
	EXIT,//无指定默认从0开始
	ADD,
	DEL,
	FIND,
	SORT,
	MODIFY,
	PRINT
};
void test()
{
	
		Contact con;
		InitContact(&con);
		printf("Welcome to use contact!\n");
		int input = 0;
		do
		{
			menu();
			printf("请选择>");
			scanf("%d", &input);
			switch (input)
			{
			case ADD:
				Addpeoinfo(&con);
				break;
			case DEL:
				Delpeoinfo(&con);
				break;
			case FIND:
				Findpeoinfo(&con);
				break;
			case SORT:
				SortContact(&con);
				break;
			case MODIFY:
				Modifypeoinfo(&con);
				break;
			case PRINT:
				PrintContact(&con);
				break;
			case EXIT:
				SaveContact(&con);
				LoadContact(&con);
				printf("退出程序\n");
				break;
			default:
				printf("非法输入,请重`在这里插入代码片`新输入\n");
				break;
			}

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

Contact.c

#define  _CRT_SECURE_NO_WARNINGS
#include"contact.h"

void InitContact(Contact* pc)
{
	pc->count = 0;
	pc->data = (peoinfo*)calloc(MAX_PEONUM ,sizeof(peoinfo));//动态内存管理,在堆区分配一块peoinfo*MAX_PEONUM的内存,并且每个字节初始化为0
	// memset(pc->data, 0, sizeof(pc->data));
	pc->capacity = MAX_PEONUM;
	LoadContact(pc);
}
void Addpeoinfo(Contact* pc)
{
	assert(pc);
	Check_Capacity(pc);
	printf("请输入名字:>");
	scanf("%s", pc->data[pc->count].name);
	printf("请输入性别:>");
	scanf("%s", pc->data[pc->count].sex);
	printf("请输入年龄:>");
	scanf("%d", &pc->data[pc->count].age);
	printf("请输入电话:>");
	scanf("%s", pc->data[pc->count].tele);
	printf("请输入地址:>");
	scanf("%s", pc->data[pc->count].addr);
	pc->count++;
	printf("添加成功\n");
	

}

void PrintContact(const Contact* pc)
{
	printf("---------------------\n");
	printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
	for (int i = 0; i < pc->count; i++)

	{
		printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
			pc->data[i].name,
			pc->data[i].sex,
			pc->data[i].age,
			pc->data[i].tele,
			pc->data[i].addr);
		
		
	}
	printf("---------------------\n");
}
static int FindName(const Contact* pc,const char *name)
{
	assert(pc && name);

	for (int pos = 0; pos < pc->count; pos++)
	{
		if (strcmp(pc->data[pos].name, name) == 0)
		{
			return pos;//返回下标
		}
		else
			return -1;
	}
}
void Delpeoinfo(Contact* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入要删除的联系人的名字;>");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("通讯录中没有这个人\n");
		return;
	}
	else
	{
		int i = 0;
		for (int i = pos; i < pc->count - 1; i++)
		{
			pc->data[i] = pc->data[i + 1];
		}
		printf("删除成功\n");
		pc->count--;
	}

	if ((pc->capacity - pc->count) > 3)
	{
		peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->count + 2) * sizeof(peoinfo));
		if (ptr != NULL)
		{
			pc->data = ptr;
			pc->capacity = pc->count + 2;

			printf("通讯录空闲内存大于三个人,减为两个空间,减容成功\n");
		}
		else
		{
			perror("Delpeoinfo");
		}
	}
}
void Findpeoinfo(const Contact* pc)
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入你要查找的联系人的名字:>");
	scanf("%s", name);
	int pos = FindName(pc, name);
	if (pos == -1)
	{
		printf("查无此人\n");
		

	}
	else
	{
		printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
		printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
			pc->data[pos].name,
			pc->data[pos].sex,
			pc->data[pos].age,
			pc->data[pos].tele,
			pc->data[pos].addr);


	}

}
void Modifypeoinfo(Contact* pc) 
{
	assert(pc);
	char name[MAX_NAME];
	printf("请输入你要修改的联系人:>");
	scanf("%s", name);
	int pos = FindName(pc, name);
		if (pos == -1)
		{
			printf("查无此人\n");
			return ;
       	}
		else
		{
			printf("请输入修改后的名字:>");
			scanf("%s", pc->data[pos].name);
			printf("请输入修改后的性别:>");
			scanf("%s", pc->data[pos].sex);
			printf("请输入修改后的年龄:>");
			scanf("%d", &pc->data[pos].age);
			printf("请输入修改后的电话:>");
			scanf("%s", pc->data[pos].tele);
			printf("请输入修改后的地址:>");
			scanf("%s", pc->data[pos].addr);
			
			printf("修改成功\n");
			
		}
}
int cmp1(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->name, ((peoinfo*)p2)->name);
}
int cmp2(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->sex, ((peoinfo*)p2)->sex);
}
int cmp3(const void* p1, const void* p2)
{
	return ((peoinfo*)p1)->age-((peoinfo*)p2)->age;
}
int cmp4(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->tele, ((peoinfo*)p2)->tele);
}
int cmp5(const void* p1, const void* p2)
{
	return strcmp(((peoinfo*)p1)->addr, ((peoinfo*)p2)->addr);
}
void sort_by_name(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo),cmp1);
}
void sort_by_sex(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp2);
}
void sort_by_age(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp3);
}
void sort_by_tele(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void sort_by_addr(Contact* pc)
{
	qsort(pc->data, pc->count, sizeof(peoinfo), cmp4);
}
void Sortmenu()
{
	printf("*******************************\n");
	printf("*****  1.name     2.sex   *****\n");
	printf("*****  3.age      4.tele  *****\n");
	printf("*****        5.addr       *****\n");
	printf("*******************************\n");
}
void SortContact(Contact* pc)
{
	assert(pc);
	Sortmenu();
	printf("请选择如何排序;>");
	int num = 0;
		scanf("%d", &num);
		
		if (num==1)
		{
			sort_by_name(pc);
		}
		else if (num==2)
		{
			sort_by_sex(pc);
		}
		else if (num==3)
		{
			sort_by_age(pc);
		}
		else if (num==4)
		{
			sort_by_tele(pc);
		}
		else if (num==5)
		{
			sort_by_addr(pc);
		}
		else
		{
			printf("输入非法,请重新输入\n");
		}
		printf("排序后\n");
		printf("---------------------\n");
		printf("%-15s\t%-5s\t%-5s%-12s\t%-30s\n", "名字", "性别", "年龄", "电话", "地址");
		for (int i = 0; i < pc->count; i++)

		{
			printf("%-15s\t%-5s\t%-5d%-12s\t%-30s\n",
				pc->data[i].name,
				pc->data[i].sex,
				pc->data[i].age,
				pc->data[i].tele,
				pc->data[i].addr);


		}
		printf("---------------------\n");

}
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	pc->count = 0;
	pc->capacity = 0;
}
void SaveContact(Contact* pc) 
{
	FILE* pf = fopen("Contact.txt", "w");
	if (pf == NULL)
	{
		perror("SaveContact");
		return;
	}
	fwrite(pc->data, sizeof(peoinfo),pc->count,pf);
	fclose(pf);
	pf = NULL;

}
void LoadContact(Contact* pc)
{
	FILE* pf = fopen("Contact.txt", "r");
	if (pf == NULL)
	{
		perror("LoadContact");
		return;
	}
	peoinfo temp = { 0 };
	while (fread(&temp, sizeof(peoinfo), 1, pf))
	{
		Check_Capacity(pc);
		pc->data[pc->count] = temp;
		pc->count++;

	}
	fclose(pf);
	pf = NULL;
}
void Check_Capacity(Contact* pc)

{
	if (pc->count == pc->capacity)
	{
		peoinfo* ptr = (peoinfo*)realloc(pc->data, (pc->capacity + MAX_COUNT) * sizeof(peoinfo));
		if (ptr != NULL)
		{
			pc->data= ptr;
			pc->capacity += MAX_COUNT;
			printf("增容成功\n");
		}
		else {
			perror("peoinfo");
			printf("通讯录已满,增容失败无法添加\n");
			return;

		}
	}
}

总结

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一招鲜吃遍天!CleanMyMac X苹果电脑Mac管家让你的Mac倍儿爽

一招鲜吃遍天&#xff01;CleanMyMac X 苹果电脑Mac管家让你的 Mac 倍儿爽 &#xff0c; 轻松清理、优化、保护你的 Apple 设备&#xff0c;体验前所未有的流畅&#xff0c;在当今数字化时代&#xff0c;我们的生活离不开各类电子设备&#xff0c;尤其是苹果电脑 Mac。 然而&am…

CISP 4.2备考之《安全支撑技术》知识点总结

文章目录 第一节 密码技术第二节 标识和身份鉴别技术第三节 访问控制技术 第一节 密码技术 密码学发展阶段&#xff1a;古典、近代、现代和公钥密码学及特点。 密码系统组成&#xff1a;明文、加密、密钥、解密、密文。 柯克霍夫原则&#xff1a;密钥保密&#xff0c;算法公开…

【Node.js】npx

概述 npx 可以使用户在不安装全局包的情况下&#xff0c;运行已安装在本地项目中的包或者远程仓库中的包。 高版本npm会自带npx命令。 它可以直接运行 node_modules/.bin 下的 exe 可执行文件。而不像之前&#xff0c;我们需要在 scripts 里面配置&#xff0c;然后 npm run …

利用Scala与Apache HttpClient实现网络音频流的抓取

概述 在当今数字化时代&#xff0c;网络数据的抓取和处理已成为许多应用程序和服务的重要组成部分。本文将介绍如何利用Scala编程语言结合Apache HttpClient工具库实现网络音频流的抓取。通过本文&#xff0c;读者将学习如何利用强大的Scala语言和Apache HttpClient库来抓取网…

npm i安装依赖报错,但是cnpm i 却安装成功

问题描述&#xff1a;在a项目中npm i 安装依赖时发生以上报错&#xff0c;但是cnpm i 却成功&#xff0c;而且在其他项目中npm i 安装其他项目依赖也能成功.... 解决办法&#xff1a;删除项目中package-lock.json文件后再npm i 即可

如何查询期刊的影响因子

查询期刊影响因子可以用下面两个方法&#xff1a; 一、中文期刊影响因子可以用知网查询 在知网首页&#xff0c;点击“出版物检索” 进入出版物检索页&#xff0c;输入期刊名称点击检索 &#xff0c;可查到该期刊的详细信息&#xff0c;例如输入“当代法学” 从上图可看到《…

el-tab 如何点击不同标签触发不同函数

介绍 el-tab本身的功能是点击之后切换不同页&#xff0c;但是我希望点击不同标签就触发不同页 代码实现 <template><el-tabsv-model"activeName"type"card"class"demo-tabs"tab-click"handleClick"><el-tab-pane lab…

如何开通企业付款到零钱功能

商家转账到零钱是什么&#xff1f; 使用商家转账到零钱这个功能&#xff0c;可以让商户同时向多个用户的零钱转账。商户可以使用这个功能用于费用报销、员工福利发放、合作伙伴货款或分销返佣等场景&#xff0c;提高效率。 商家转账到零钱的使用场景有哪些&#xff1f; 商家…

宜搭低代码高级认证实操题2 faas连接器加密解密

密钥维护页-保证有一条数据 敏感信息提交页 存档页&#xff0c;只是用来存数据的审批的时候不用这个表提交数据不然会出两条 授权查看页 FaaS连接器先下载好他的示例代码然后按照要求配置好参数直接拷贝进去就行 然后需要在云开发环境里面先new一个terminal然后跑一下./builde…

简介:KMeans聚类算法

在机器学习中&#xff0c;无监督学习一直是我们追求的方向&#xff0c;而其中的聚类算法更是发现隐藏数据结构与知识的有效手段。聚类是一种包括数据点分组的机器学习技术。给定一组数据点&#xff0c;我们可以用聚类算法将每个数据点分到特定的组中。 理论上&#xff0c;属于同…

Nacos的简介及安装和使用

Nacos的简介及安装和使用 1. Nacos简介1.1 核心特性1.2 常见的注册中心1.3 Nacos结构图 2. 如何安装和配置Nacos&#xff1f;2.1 Nacos的安装2.2 如何使用Nacos&#xff1f; 1. Nacos简介 ​ Nacos是一个开源的动态服务发现、配置和服务管理平台&#xff0c;由阿里巴巴开发和维…

OCP NVME SSD规范解读-14.Firmware固件升级要求

4.11节 Firmware Update Requirements 描述了数据中心NVMe SSD固件更新的具体要求&#xff0c;确保固件升级过程既安全又可靠&#xff0c;同时充分考虑了设备在升级过程中的可用性和功能性。 FWUP-1: 设备必须记录每一次固件激活过程。这意味着固件升级过程中&#xff0c;设备会…

SpringSecurity6.x

文章目录 一.什么是SpringSecurity二.SpringSecurity的特征三.SpringSecurity的第一个例子3.1 创建SpringBoot项目3.2 创建IndexController3.3 创建index.html3.4 启动项目3.5 Spring Security默认做了什么 四.SpringSecurity的整体架构4.1 Filter4.2 DelegatingFilterProxy4.3…

走进 Mybatis 内核世界:理解原理,释放更多生产力

目录 一、MyBatis 特点 二、 接口绑定实现原理 三、SpringBoot 加载 MyBatis 源码分析 四、MyBatis 执行性 五、MyBatis 分页原理 5.1 逻辑分页(内存分页) 5.2 物理分页 六、MyBatis 缓存 6.1 一级缓存 6.2 二级缓存 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自…

网站引入 Prism,使得代码高亮显示,并一键复制代码块

曾几何时&#xff0c;苦恼如何将本地写好的博文&#xff0c;更好的展示读者屏幕前&#xff1f;若只是简简单单的文章&#xff0c;其实还是很好的解决它的&#xff01;可是&#xff0c;像我们这样写技术文章&#xff08;有点牵强&#xff09;的&#xff0c;在文章内容嵌入部分代…

【文献分享】Quantum Self-Consistent Ab-Initio Lattice Dynamics

题目&#xff1a;Quantum Self-Consistent Ab-Initio Lattice Dynamics 链接&#xff1a;Redirecting 量子自洽从头算晶格动力学 量子自洽Ab-Initio晶格动力学软件包&#xff08;QSCAILD&#xff09;是一个python库&#xff0c;用于计算晶体中与温度相关的有效2级和3级原子间…

【Java多线程】多线程的三种实现方式和多线程常用方法

目录 1、多线程的三种实现方式 1.1、继承Thread类的方式进行实现 1.2、实现Runnable接口的方式进行实现 1.3、利用Callable接口和Future接口方式实现 1.4、三种实现方式的优缺点 2、多线程常用方法 1、多线程的三种实现方式 在main()方法中&#xff0c;你可以创建和启动…

STL —— string(2)

本篇文章主要讲解string的用法。 目录 1. 迭代器&#xff08;Iterators&#xff09; 1.1 begin() 和 end() 1.2 rbegin() 和 rend() 2. 容量操作&#xff08;capacity&#xff09; 2.1 size()、length()、maxsize() 2.2 capacity() 2.3 empty()、clear() 2.4 reserve…

罗德与施瓦茨联合广和通全面验证RedCap模组FG132系列先进性能

近日&#xff0c;罗德与施瓦茨联合广和通完成Redcap(Reduce Capability)功能和性能验证。本次测试使用R&SCMX500 OBT(One Box Tester)无线通信测试仪&#xff0c;主要验证广和通RedCap模组FG132系列射频性能以及IP层吞吐量&#xff0c;包括RedCap上下行吞吐量和射频指标如矢…

【技巧】ChatGPT Prompt 提示语大全

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 主要来自&#xff1a;https://github.com/f/awesome-chatgpt-prompts ChatGPT SEO提示 Contributed by: StoryChief AI Reference: 7 Powerful ChatGPT Prompts to Create SEO Content Faster 供稿人&#xff1a;…