【C语言】实现动态版通讯录

2023/9/30 16:56:20

💌内容专栏:【C语言】进阶部分

💌本文概括: 结合自定义类型、动态内存管理知识,对静态版本的通讯录进行优化。

💌本文作者:花 碟

💌发布时间:2023.4.2

 

目录

前言:

一、静态版本代码实现:

二、动态通讯录 

三、代码整理 


前言:

前面我们学过了结构体、枚举等自定义类型的学习,写了一个静态版本的通讯录【传送门】点击进入静态版通讯录界面,我们知道,我们写的通讯录其实本质用的是一个结构体数组,数组的大小是固定的,这时我们就可以使用动态内存管理相关知识,对内存空间进行一个合理的分配,而不至于一下开辟一个较大的数组空间,用的时候却很少,造成了内存浪费的问题等。如果在内存不够时,也可以进行申请一定的空间来存储数据。

一、静态版本代码实现:

这里我就直接将完整代码放过来,具体分析,可以点击传送门链接,看实现思路哦~~

test.c文件代码(测试通讯录的相关功能)

#include "contact.h"
void Menu()
{
	printf("********************************\n");
	printf("******   0.exit 1.add     ******\n");
	printf("******  2.delete  3.modify******\n");
	printf("******  4.search 5.show    *****\n");
	printf("******      6.sort         *****\n");
	printf("********************************\n");

}

enum Option
{
	EXIT,
	ADD,
	DELETE,
	MODIFY,
	SEARCH,
	SHOW,
	SORT
};
int main()
{
	Contact con;//创建一个名为con的结构体变量
	InitContact(&con);
	int input = 0;
	do
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DELETE:
			DeleteContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
	} while (input);

}

contact.h文件(用来声明函数、结构体变量)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 20
#define MAX 20 

//创建个人信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

//静态版本的通讯录
//声明一个通讯录结构体
typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;

//初始化结构体
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示通讯录
void ShowContact(const Contact* pc);
//删除指定联系人
void DeleteContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);

contact.c文件(用来具体实现函数内部的功能)

#define  _CRT_SECURE_NO_WARNINGS 
#include"contact.h"

//静态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	pc->sz = 0;
	memset(pc->data, 0, sizeof(pc->data));

}
 
//添加联系人
void AddContact(Contact* pc)
{
	//CheckContact(pc);
	if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}
	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 ShowContact(const Contact* pc)
{
	printf("%-15s %-5s %-5s %-15s %-20s\n","姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}
}

//查找姓名
static int Findname(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;//找到返回i
		}
	}
	return -1;//没找到返回-1
}
//删除指定联系人
void DeleteContact(Contact* pc)
{
	if (0 == pc->sz)
	{
		printf("通讯录为空,无法删除联系人\n");
			return;
	}
	printf("请输入姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s",name);
	//查找姓名
	int pos = Findname(pc,name);

	//删除
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	int i = 0;
	for (i = pos; i < pc->sz; i++)
	{
		pc->data[pos] = pc->data[pos + 1];
	}
	printf("删除成功\n");
	pc->sz--;
}
//查找指定联系人
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入姓名:>");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("%-15s %-5s %-5s %-15s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[pos].name, pc->data[pos].age,
		pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
//修改指定联系人
void ModifyContact(Contact* pc)
{
	printf("请输入要修改人的姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	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");
}
//通过名字来排序
int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//排序通讯录
void SortContact(Contact* pc)
{
	qsort(pc->data, pc->sz,sizeof(PeoInfo),cmp_by_name);

	printf("排序成功\n");
}

二、动态通讯录 

我们将动态的版本的通讯录修改为:默认能够存放3个人的信息,不够的话,每次增加2个人的信息

在contact.h文件中,我们宏定义 DEFAULT_SZ 表示 默认3个人的信息

INC_SZ 表示 容量不够时,每次增加2个人的信息

#define DEFAULT_SZ 3
#define INC_SZ 2

在contact.h文件中。声明结构体部分:我们要让动态申请的内存空间可大可小,一定需要malloc函数来申请空间,所以我们应该将结构体数组修改为一个结构体指针data,指针类型是PeoInfo*,data指向了存放数据的空间,定义sz变量用来记录当前通讯录中的信息个数,capacity变量用来记录通讯录的容量。

//动态版本的通讯录
typedef struct Contact
{
	PeoInfo* data;//data指向了存放数据的空间
	int sz;//记录通讯录中的有效信息个数
	int capacity;//记录通讯录的容量
}Contact;

在contact.c文件中,初始化通讯录函数里面的部分就需要大改了,我们需要首先开辟默认3个元素大小的空间,元素类型是PeoInfo* ,即malloc的参数为DEFAULT_SZ*sizeof(PeoInfo),

我们拿一个ptr的结构体指针接收,如果ptr为NULL,就打印报错的信息(strerror需要引用<string.h>头文件,errno需要引用<errno.h>),然后返回空,不为NULL的话,就将ptr赋给data,元素的起始地址就为data,sz初始化为0,capacity容量初始化为默认值。

//静态版本
初始化通讯录
//void InitContact(Contact* pc)
//{
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//
//}

//动态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	PeoInfo* ptr= (PeoInfo* )malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (ptr == NULL)
	{
		printf("通讯录初始化失败::%s", strerror(errno));
		return;
	}
	else
	{
		pc->data = ptr;
		pc->sz = 0;
		pc->capacity = DEFAULT_SZ;
	}	
}
在contact.c文件中,添加联系人函数里面我们也需要进行大幅度改动。pc->data这里就不是静态版本的数组了,我们直接将这个if语句给屏蔽掉,直接写一个CheckContact函数用来判断通讯录是否满了?是否需要扩容?
//添加联系人
void AddContact(Contact* pc)
{
	CheckContact(pc);
	/*if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}*/
	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++;
}

CheckContact函数

如果pc->sz 等于 pc->capacity ,即通讯录当前有效个人信息等于目前的容量时,说明通讯录已经满了,就需要扩容,此时就可以用realloc函数来扩容,pc->data表示通讯录的起始地址,新的大小为新的元素个数*每个元素的大小。返回值暂存在ptr指针之中,如果ptr为NULL,则打印报错的信息,不为NULL,则将ptr赋值给pc->data,容量+2,为了显示扩容效果,我们顺便打印当前容量值。

//检测通讯录是否满了
void CheckContact(Contact* pc)
{
	//如果通讯录满了 就增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr= (PeoInfo*)realloc(pc->data,(pc->capacity+ INC_SZ)*sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("CheckContact::%s", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功,当前容量为:%d\n", pc->capacity);
		}
	}
	//没满直接跳过以上语句
}

最后,我们退出通讯录的时候,也可以将自己申请的内存空间给释放掉。我们在contact.h文件中声明一个DestroyContact函数表示销毁通讯录。

在contact.c文件下面接着编写代码:

//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
    pc->sz = 0;
    pc->capacity = 0;
	printf("释放成功...\n");
}

 代码测试:

为了测试方便,作者直接将信息用数字测试,当我们输入三个有效信息之后,此时有效空间等于当前的通讯录容量了,当我们再次选择1,继续添加联系人,就“显示增容成功,当前容量为5”。

三、代码整理 

将代码整理在下面,需要的自取呐~

test.c文件

#include "contact.h"
void Menu()
{
	printf("********************************\n");
	printf("******   0.exit 1.add     ******\n");
	printf("******  2.delete  3.modify******\n");
	printf("******  4.search 5.show    *****\n");
	printf("******      6.sort         *****\n");
	printf("********************************\n");

}

enum Option
{
	EXIT,
	ADD,
	DELETE,
	MODIFY,
	SEARCH,
	SHOW,
	SORT
};
int main()
{
	Contact con;//创建一个名为con的结构体变量
	InitContact(&con);
	int input = 0;
	do
	{
		Menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case ADD:
			AddContact(&con);
			break;
		case DELETE:
			DeleteContact(&con);
			break;
		case MODIFY:
			ModifyContact(&con);
			break;
		case SEARCH:
			SearchContact(&con);
			break;
		case SHOW:
			ShowContact(&con);
			break;
		case SORT:
			SortContact(&con);
			break;
		case EXIT:
			DestroyContact(&con);
			printf("退出通讯录\n");
			break;
		default:
			printf("输入有误,请重新输入\n");
			break;
		}
	} while (input);
}

contact.h文件

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<errno.h>
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TELE 15
#define MAX_ADDR 20
//#define MAX 20 
#define DEFAULT_SZ 3
#define INC_SZ 2
//创建个人信息
typedef struct PeoInfo
{
	char name[MAX_NAME];
	int age;
	char sex[MAX_SEX];
	char tele[MAX_TELE];
	char addr[MAX_ADDR];
}PeoInfo;

静态版本的通讯录
声明一个通讯录结构体
//typedef struct Contact
//{
//	PeoInfo data[MAX];
//	int sz;
//}Contact;

//动态版本的通讯录
typedef struct Contact
{
	PeoInfo* data;//data指向了存放数据的空间
	int sz;//记录通讯录中的有效信息个数
	int capacity;//记录通讯录的容量
}Contact;

//初始化结构体
void InitContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示通讯录
void ShowContact(const Contact* pc);
//删除指定联系人
void DeleteContact(Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
//销毁通讯录
void DestroyContact(Contact* pc);

contact.c文件

#include"contact.h"
//静态版本
初始化通讯录
//void InitContact(Contact* pc)
//{
//	pc->sz = 0;
//	memset(pc->data, 0, sizeof(pc->data));
//
//}

//动态版本
//初始化通讯录
void InitContact(Contact* pc)
{
	PeoInfo* ptr= (PeoInfo* )malloc(DEFAULT_SZ * sizeof(PeoInfo));
	if (ptr == NULL)
	{
		printf("通讯录初始化失败::%s", strerror(errno));
		return;
	}
	else
	{
		pc->data = ptr;
		pc->sz = 0;
		pc->capacity = DEFAULT_SZ;
	}	
}

//检测通讯录是否满了
void CheckContact(Contact* pc)
{
	//如果通讯录满了 就增容
	if (pc->sz == pc->capacity)
	{
		PeoInfo* ptr= (PeoInfo*)realloc(pc->data,(pc->capacity+ INC_SZ)*sizeof(PeoInfo));
		if (ptr == NULL)
		{
			printf("CheckContact::%s", strerror(errno));
			return;
		}
		else
		{
			pc->data = ptr;
			pc->capacity += INC_SZ;
			printf("增容成功,当前容量为:%d\n", pc->capacity);
		}
	}
	//没满直接跳过以上语句
}
//添加联系人
void AddContact(Contact* pc)
{
	CheckContact(pc);
	/*if (pc->data == pc->sz)
	{
		printf("通讯录已满,无法添加联系人\n");
		return;
	}*/
	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 ShowContact(const Contact* pc)
{
	printf("%-15s %-5s %-5s %-15s %-20s\n","姓名", "年龄", "性别", "电话", "地址");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[i].name, pc->data[i].age,
			pc->data[i].sex,pc->data[i].tele, pc->data[i].addr);
	}
}

//查找姓名=
static int Findname(Contact* pc, char name[])
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (0 == strcmp(pc->data[i].name, name))
		{
			return i;//找到返回i
		}
	}
	return -1;//没找到返回-1
}
//删除指定联系人
void DeleteContact(Contact* pc)
{
	if (0 == pc->sz)
	{
		printf("通讯录为空,无法删除联系人\n");
			return;
	}
	printf("请输入姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s",name);
	//查找姓名
	int pos = Findname(pc,name);

	//删除
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	int i = 0;
	for (i = pos; i < pc->sz; i++)
	{
		pc->data[pos] = pc->data[pos + 1];
	}
	printf("删除成功\n");
	pc->sz--;
}
//查找指定联系人
void SearchContact(const Contact* pc)
{
	char name[MAX_NAME] = { 0 };
	printf("请输入姓名:>");
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	printf("%-15s %-5s %-5s %-15s %-20s\n", "姓名", "年龄", "性别", "电话", "地址");
	printf("%-15s %-5d %-5s %-15s %-20s\n", pc->data[pos].name, pc->data[pos].age,
		pc->data[pos].sex, pc->data[pos].tele, pc->data[pos].addr);
}
//修改指定联系人
void ModifyContact(Contact* pc)
{
	printf("请输入要修改人的姓名:>");
	char name[MAX_NAME] = { 0 };
	scanf("%s", name);
	int pos = Findname(pc, name);
	if (-1 == pos)
	{
		printf("联系人不存在\n");
		return;
	}
	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");
}
//通过名字来排序
int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((PeoInfo*)e1)->name, ((PeoInfo*)e2)->name);
}
//排序通讯录
void SortContact(Contact* pc)
{
	qsort(pc->data, pc->sz,sizeof(PeoInfo),cmp_by_name);

	printf("排序成功\n");
}
//销毁通讯录
void DestroyContact(Contact* pc)
{
	free(pc->data);
	pc->data = NULL;
	printf("释放成功...\n");
}

好了,动态版本的通讯录就到这里,感谢各位读者的支持~,如编写有误,还请联系我 ✨✨


http://www.jnnr.cn/a/369121.html

相关文章

lwip中线程优先级的分配原则

lwip的线程 lwIP是一个嵌入式TCP/IP协议栈&#xff0c;它主要包含以下几个线程&#xff1a; 主线程&#xff08;Main Thread&#xff09;&#xff1a;它是lwIP的主线程&#xff0c;用于初始化lwIP协议栈和各种网络接口&#xff0c;并提供处理网络事件的主循环。主线程的优先级…

PHP+SQL考勤系统安全性的设计与实现

第一章 概 述 1.1 PHP的概念 PHP: Hypertext Preprocessor (超文本预处理器) 的缩写&#xff0c;它是一种服务器端的 HTML 脚本/编程语言,是一种简单的、面向对象的、解释型的、健壮的、安全的、性能非常之高的、独立于架构的、可移植的、动态的脚本语言 PHP是一种功能强大…

docker安装以及springboot项目打包运行

我们都知道docker是一个非常好用的虚拟化容器&#xff0c;所谓虚拟化容器其实就是说可以将各个应用都隔离开来&#xff0c;每个应用都可以有自己的独立的运行时环境&#xff0c;这对于我们程序开发是非常有好处的&#xff0c;可以不需要去配置环境&#xff0c;每个组件都有独立…

FPGA 20个例程篇:20.USB2.0/RS232/LAN控制并行DAC输出任意频率正弦波、梯形波、三角波、方波(三)

如图1所示是USB2.0/RS232/ETH控制并行DAC输出任意频率正弦波、梯形波、三角波、方波的整体设计示意图&#xff0c;可以看到上位机通过RS232串口、ETH千兆网口以及USB2.0接口和FPGA建立通信&#xff0c;通过不同的接口发送报文&#xff0c;FPGA在指令解析模块中把相关设置和参数…

栈和队列OJ题合集(包含循环队列的两种实现)

目录 一:前言 二:有效的括号(括号匹配) 三:用队列实现栈 四:用栈实现队列 五:设计循环队列 一:前言 对栈和队列的基本性质和实现有问题的可以看上一期 链接&#xff1a;http://t.csdn.cn/YQMBA​​​​ 注意:本文用数据的大小来表示入栈入队的先后。 二:有效的括号(括号匹配…

networkx 2-hop邻居(Ego graph)节点

1 Ego graph的简单介绍 自我网络(Ego graph)是一种特殊类型的网络&#xff0c;由一个中心节点和所有直接与之相连的其他节点组成。 中心节点被称为 自我(ego)&#xff0c;而与之直接相连的其他周围节点被称为 分身( alters)。 自我网络大多用于分析社会联系、链接和关系。下…

带刷,带刷,刷起来!!!

A:::::::::::::::::::通电&#xff08;最小生成树&#xff0c;Prim&#xff0c;Kruskal&#xff09; 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0c;小明正在帮助一带一路上的国家通电。 这一次&#xff0c;小明要帮助 n 个村庄通电&am…

C的实用笔记37——几种常用的字符串处理API(二)

6.字符串拼接函数 0、知识点&#xff1a; 内存污染&#xff08;存储字符串的目的内存不够用时&#xff0c;后面的内存会被污染&#xff0c;也就是被修改&#xff0c;类似于下标越界&#xff09; strcat其实就是另一种形式的strcpy&#xff0c;一个从末尾开始复制&#xff0c;一…

[计算机图形学]着色,布林-冯着色模型,着色频率(前瞻预习/复习回顾)

一、前言 到目前为止的前几篇文章已经向大家介绍了从MVP变换到屏幕映射到光栅化的过程&#xff0c;但是仅仅这些还不能让我们很好的模拟真实的世界&#xff0c;究其原因是上面的所有过程都没有涉及光线的运算&#xff0c;而缺少了光也就缺少了明暗的变化&#xff0c;导致渲染出…

Twitter的推荐系统开源了,Twitter的推荐系统是什么样的呢?Twitter推荐系统的架构说明

Twitter的推荐系统开源了&#xff0c;Twitter的推荐系统是什么样的呢&#xff1f;Twitter推荐系统的架构说明01. Twitter的推荐系统是什么样的&#xff1f;02. Candidate Sources2.1 In-Network Source2.2 Out-of-Network Sources03. Ranking04. Heuristics, Filters, and Prod…

[综]Review of bike-sharing system studies using bibliometrics method

Review of bike-sharing system studies using bibliometrics method 文献计量学方法在自行车共享系统研究中的应用 article{2022reviewbikesharing, title {Review of bike-sharing system studies using bibliometrics method}, journal {Journal of Traffic and Transport…

Spring源码分析-Bean创建流程四

目录 目录 一、前言 二、Bean实例化构造器的选择 1、createBeanInstance方法解读 2、autowireConstructor 二、BeanPostProcess四个实现中的哪里会用到 Autowired注解构造使用注意 三、实例化几种策略 1、instantiateBean入口 2、获取实例化策略并且进行实例化操作主要有…

vue尚品汇商城项目-day04【25.面包屑处理关键字】

文章目录25.面包屑处理关键字25.1面包屑处理关键字25.2面包屑处理品牌信息25.3平台售卖属性的操作25.面包屑处理关键字 25.1面包屑处理关键字 &#xff08;1&#xff09;动态开发面包屑中的分类名 变成式导航路由跳转【自己跳自己】 &#xff08;2&#xff09;动态开发面包…

(Cont.) OpenPose OpenCV Caffe QT

Cont. conda deactivate Remember to deactivate conda before compiling conda deactivatecaffe colas.h Path: openpose/3rdparty/caffe/include/cblas.h Case 1: 如果没有 寻找一下 &#xff08;大概率在python directory有&#xff09;复制过来即可 exactly寻找命令&am…

C语言 —— 数组

一维数组与二维数组前言一、 一维数组1.1 一维数组定义和使用1.2 例子 &#xff1a;列出0-9的数字1.3 一维数组的初始化1.4 数组名二、二维数组2.1 二维数组的定义2.2 例题&#xff1a;一个学习小组有 5 个人&#xff0c;每个人有 3 门课程的考试成绩&#xff0c;求该小组各科的…

javaScript蓝桥杯----偷梁换柱

目录一、介绍二、目标三、代码四、知识点1. Object.defineProperty五、答案一、介绍 随着医疗水平的进步&#xff0c;人的平均寿命在慢慢提升。现在全球平均预期寿命是 73.2 岁&#xff0c;而在 1950 年则只有 47 岁。那么人类的寿命有极限吗&#xff1f;根据最新的研究&#…

用户体验设计中的颜色

&#x1f525;1 颜色模型是一种抽象的用于描述颜色被定义和呈现方式的数学模型。RGB模型&#xff08;加色模式&#xff09;最多用于显示器上&#xff0c;因为它是发光的颜色。CMYK模型&#xff08;减色模式&#xff09;适用于印刷体&#xff0c;不会发光而是反光的模式&#x1…

全网最详细的nodejs卸载和安装教程

因为项目需求&#xff0c;重装了3个版本的node.js&#xff0c;记录下完整过程&#xff0c;少走弯路少查资料。 一、卸载 1、Win菜单中找到Node.js的卸载程序&#xff0c;运行卸载程序。 2、点击是。 3、等待卸载完成。 4、删除C:\Users\用户名\AppData\Roaming目录下的npm和…

Linux使用:环境变量指南和CPU和GPU利用情况查看

Linux使用&#xff1a;环境变量指南和CPU和GPU利用情况查看Linux环境变量初始化与对应文件的生效顺序Linux的变量种类设置环境变量直接运行export命令定义变量修改系统环境变量修改用户环境变量修改环境变量配置文件环境配置文件的区别profile、 bashrc、.bash_profile、 .bash…

苦中作乐---竞赛刷题(15分-20分题库)

&#xff08;一&#xff09;概述 &#xff08;Ⅰ&#xff09;彩票是幸运的 &#xff08;Ⅱ&#xff09;AI 英文问答程序 &#xff08; Ⅲ &#xff09; 胎压检测 &#xff08;二&#xff09;题目 Ⅰ 彩票的号码有 6 位数字&#xff0c;若一张彩票的前 3 位上的数之和等于后 3 …
最新文章