通讯录的动态实现

news2024/12/23 12:32:45

文章目录

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

通讯录的动态实现

模块化编程

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

通讯录的框架构建

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

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;

		}
	}
}

总结

在这里插入图片描述

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

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

相关文章

Word为图表设置图注并在图表清单中自动生成

1如果需要自动插入题注&#xff0c;请不要自己为文件增加新的标题样式或删除自带的标题1样式 2章节大标题最好是标题1&#xff0c;2,3而不要设置标题一、二、三&#xff0c;否则图例在自动生成时会显示 图一 -1&#xff0c;调整起来会非常不方便 若实在要使用大写中文标题&…

Rust之构建命令行程序(五):环境变量

开发环境 Windows 11Rust 1.77.0 VS Code 1.87.2 项目工程 这次创建了新的工程minigrep. 使用环境变量 我们将通过添加一个额外的功能来改进minigrep:一个不区分大小写的搜索选项&#xff0c;用户可以通过环境变量打开该选项。我们可以将此功能设置为命令行选项&#xff0c;…

【Mysql】面试题汇总

1. 存储引擎 1-1. MySQL 支持哪些存储引擎&#xff1f;默认使用哪个&#xff1f; 答&#xff1a; MySQL 支持的存储引擎包括 InnoDB、MyISAM、Memory 等。 Mysql 5.5 之前默认的是MyISAM&#xff0c;Mysql 5.5 之后默认的是InnoDB。 可以通过 show engines 查看 Mysql 支持…

【Vue】Vue集成Element-UI框架

&#x1f64b;‍ 一日之际在于晨 ⭐本期内容&#xff1a;Vue集成Element-UI框架 &#x1f3c6;系列专栏&#xff1a;从0开始的Vue之旅 文章目录 Element-UI简介安装Element-UInpm安装CDN安装 引入Element-UI测试是否引入成功总结 Element-UI简介 Element-UI官网&#xff1a;点…

yolov9目标检测可视化图形界面GUI源码

该系统是由微智启软件工作室基于yolov9pyside6开发的目标检测可视化界面系统 运行环境&#xff1a; window python3.8 安装依赖后&#xff0c;运行源码目录下的wzq.py启动 程序提供了ui源文件&#xff0c;可以拖动到Qt编辑器修改样式&#xff0c;然后通过pyside6把ui转成python…

C语言学习--八种排序算法

目录 排序的概念 1.直接插入排序 基本思想 代码实现 算法分析 2.希尔排序 基本思想 代码实现 算法分析 3.冒泡排序 基本思想 代码实现 算法分析 4.快速排序 基本思想 代码实现 算法分析 5.简单选择排序 基本思想 代码实现 算法分析 6.堆排序 基本思想 代…

数据中台:如何构建企业核心竞争力_光点科技

在当今信息化快速发展的商业环境下&#xff0c;“数据中台”已经成为构建企业核心竞争力的关键步骤。数据中台不仅是数据集成与管理的平台&#xff0c;更是企业智能化转型的加速器。本文将深入探讨数据中台的定义、特点、构建方法及其在企业中的作用。 数据中台的定义 数据中台…

小程序—音频

比较常见的需求&#xff1a;当阈值超出或识别不通过时&#xff0c;模拟蜂鸣器响&#xff08;准备相关音频文件&#xff09; 小程序支持播放和录制音频。小程序播放音频的方式有两种&#xff1a;内部音频和背景音频。 内部音频支持用户在使用小程序过程中播放音效;背景音频支持…

算法---前缀和练习-2(和为k的子数组)

和为k的子数组 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 创建一个无序映射&#xff08;哈希表&#xff09; hash&#xff0c;用于统计前缀和的出现次数。初始时&#xff0c;将前缀和为 0 的次数设为 1&#xff0c;表示…

基于Spring Boot技术的幼儿园管理系统

摘 要 随着信息时代的来临&#xff0c;过去的传统管理方式缺点逐渐暴露&#xff0c;对过去的传统管理方式的缺点进行分析&#xff0c;采取计算机方式构建幼儿园管理系统。本文通过课题背景、课题目的及意义相关技术&#xff0c;提出了一种活动信息、课程信息、菜谱信息、通知公…

现在阿里云云服务器租用多少钱?一张表,报价单

2024年阿里云服务器优惠价格表&#xff0c;一张表整理阿里云服务器最新报价&#xff0c;阿里云服务器网整理云服务器ECS和轻量应用服务器详细CPU内存、公网带宽和系统盘详细配置报价单&#xff0c;大家也可以直接移步到阿里云CLUB中心查看 aliyun.club 当前最新的云服务器优惠券…

python 空间距离计算

目录 python 空间距离计算 已知两点&#xff0c;画三角形 批量矩阵计算 python 空间距离计算 要在空间中找到一个点&#xff0c;使其位于点 b 和 c 之间的连线上&#xff0c;并且与点 b 的距离等于点 a 到点 b 的距离的2倍。 import numpy as npif __name__ __main__:a …

深度学习基础之《TensorFlow框架(10)—案例:实现线性回归(2)》

增加其他功能 一、增加变量显示 1、目的&#xff1a;在TensorBoard当中观察模型的参数、损失值等变量值的变化 2、收集变量 不同的变量要用不同的方式收集 &#xff08;1&#xff09;tf.summary.scalar(name, tensor) 收集对于损失函数和准确率等单值变量&#xff0c;name为…

什么是行业垂直类媒体?有哪些?怎么邀约

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体胡老师。 行业垂直类媒体是聚焦于特定行业或领域的媒体平台。 行业垂直类媒体不同于主流媒体&#xff0c;它们专注于提供与某个特定领域相关的深入内容和服务&#xff0c;例如商业新闻、旅游、数字…

WMI接口设计实现

WMI是Windows操作系统管理数据和操作的基础设施&#xff0c;系统管理员可以使用VB Script、PowerShell及Windows API&#xff08;C、C#等&#xff09;管理本地或远程计算机。 使用WMI框架应用程序可以直接访问EC RAM、 I/O端口、Memory地址、寄存器、Setup NV设定值&#xff0c…

vue 安装脚手架报错 certificate has expired

vue 安装脚手架的时候报错&#xff0c;报错信息如下&#xff1a; 错误信息&#xff1a;npm ERR! request to https://registry.npm.taobao.org/vue%2fcli failed, reason: certificate has expired 翻译&#xff1a;npm ERR&#xff01;请求到https://registry.npm.taobao.org…

【C++练级之路】【Lv.15】AVL树(双子旋转,领略绝对平衡之美)

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《C语言》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、AVL树的概念二、AVL树的模拟实现2.1 结点2.2 成员变量2.3 插入2.4 旋转2.4.1 左单旋2.4.2 右单旋2.4.3 …

python文学名著分享系统的设计与实现flask-django-nodejs-php

在此基础上&#xff0c;结合现有文学名著分享体系的特点&#xff0c;运用新技术&#xff0c;构建了以python为基础的文学名著分享信息化管理体系。首先&#xff0c;以需求为依据&#xff0c;根据需求分析结果进行了系统的设计&#xff0c;并将其划分为管理员和用户二种角色和多…

自己的博客阵地(互联网核心之一 DNS)

DNS(Domain Name System)是一种用于将易记的域名映射到计算机网络中的 IP 地址的系统。它充当互联网上计算机和网络设备的地址簿&#xff0c;使人们可以使用便于记忆的域名来访问网站&#xff0c;而不必记住复杂的数字IP地址。&#xff08;完全合格域名&#xff09; 名字号联系…

Milvus 向量数据库介绍及使用

一、Milvus 介绍及安装 Milvus 于 2019 年创建&#xff0c;其目标只有一个&#xff1a;存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的大量嵌入向量。它具备高可用、高性能、易拓展的特点&#xff0c;用于海量向量数据的实时召回。 作为专门为处理输入向量查…