C语言实现通讯录 (附完整代码)

news2024/12/25 1:12:55

C语言实现通讯录

  • 🍀实现一个通讯录:
  • 🍀通讯录的功能:
  • 🍀多文件实现
  • 💮设计结构体——保存人的信息
  • 💮初始通讯录
  • 💮封装通讯录
  • 💮define宏定义修改通讯录的最大容量
  • 初始化通讯录
  • 💐💐大致框架
  • 💐改进--枚举 提高代码的可读性
  • 🌼🌼定义函数实现功能
    • 🌼AddContact
    • 🌼ShowContact
    • 🌼DelContact
    • 🌼进一步改进
    • 🌼SearchContact
    • 🌼ModifyContact
    • 🌼Sort Contact
  • 🎆🎆🎆完整代码

🍀实现一个通讯录:

通讯录中保存人的信息:
名字
年龄
性别
电话
住址

🍀通讯录的功能:

1.通讯录可以存放100个人的信息
2.显示所有联系人的信息
3.排序功能
4.增:增加联系人
5.删:删除指定联系人
6.查:查找指定联系人
7.改:修改指定联系人

🍀多文件实现

test.c 测试通讯录
contact.h 函数和类型的声明
contact.c 函数的实现

💮设计结构体——保存人的信息

初级:

struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];//一个汉字占两个字符
	char tele[12];
	char addr[30];
};

结构体的引用:

struct PeoInfo num1 ;
struct PeoInfo num2;
struct PeoInfo data[50];

改进:
考虑到每次使用结构体都需要写 struct PeoInfo比较繁琐,能不能直接把struct自己省略掉呢?
这时候就需要对改结构体进行重命名typedef

typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];
	char tele[12];
	char addr[30];
}PeoInfo;

这样,当我们使用结构体时,就不用用 struct PeoInfo了,直接使用PeoInfo就可以了。

💮初始通讯录

因为我们刚刚定义了结构体用来存储人的信息,但一个通讯录中有很多人,我们上面设置了该通讯录可以存放100个人的信息,所以我们需要用结构体数组将每一个类型都是结构体的元素存储起来。
C语言定义结构体数组一般形式:

结构体类型 数组名[数组长度];

所以我们定义 通讯录:

PeoInfo data[100];

同时,我们需要一个变量,来判断通讯录里已经存放数据的个数。(以防止在增添联系人时,超过了定义的通讯录的最大容量)

int sz=0;

💮封装通讯录

在上面考虑到通讯录PeoInfo data[100]和变量 sz是一种封锁的关系。即,sz等于几,PeoInfo data里面就有几个数据元素。sz加1,则PeoInfo data数组里会再存放一个元素。
所以,我们考虑将通讯录进行进一步的封装,构建一个结构体

typedef struct Contact
{
	PeoInfo data[100];
	int sz;
}Contact;

这时,我们的通讯录就为 con

Contact con;

💮define宏定义修改通讯录的最大容量


在这里插入图片描述
同样我们也可以对 我们刚开始定义的 姓名、地址、联系方式等 以同样的宏定义进行转变。

初始化通讯录

将通讯录初始化为0。可以定义一个函数,用来初始化通讯录。

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data);
	pc->sz = 0;
}

因为我们要改变通讯录的内部,所以函数参数是一个地址值,类型是我们定义的通讯录结构体 Contact类型。
利用memset函数,将结构体中数组所有元素全部赋值为0.同时将pc所指向的sz也初始化为0.

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data);
	pc->sz = 0;
}

💐💐大致框架

接下来,我们在void test ()函数中写一下大概的框架:
(因为要尽可能避免在主函数中太过冗长,所以我们把通讯录的具体实现——增删查找等等都放在test函数中,之后我们就只需要在主函数中进行调用即可。)

首先,我们可以用do...while循环 打印一个菜单。
定义一个函数 void menu()完成打印。在()函数中调用即可。
之后我们利用switch,对输入的input进行判断,进行相应的操作。对于下面的七种情况,我们可以写七个函数分别实现其相应的功能。

在这里插入图片描述
我们进行的所有操作都是对于通讯录而言的,所以在test函数中必须有通讯录。所以我们将我们已经初始化的通讯录放在函数中。
在这里插入图片描述
不要忘了包含头文件contact.h
(在contact.h头文件中,包含着本身已经封装好的常见的头文件 比如 <stdio.h><string.h>等,还有我们自己对于结构体或者函数的一些声明和定义,比如定义人的信息的结构体 PeoInfo、定义通讯录的 Contact,以及我们函数的声明,完成Contact初始化的函数InitContact等,还有之后,我们要对通讯录进行操作的一系列增删查找函数等函数的声明都会放在都文件中。)
(要注意,函数的定义不是放在头文件中的,而是在contat.c中)

在这里插入图片描述

💐改进–枚举 提高代码的可读性

在这里插入图片描述
在这里插入图片描述

🌼🌼定义函数实现功能

🌼AddContact

在这里插入图片描述

//增加联系人的信息
void AddContact(Contact* pc)
{
	//判断数组是否可以增添?
	if (pc->sz == 100)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//通讯录没满
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);//pc->data 指向的是结构体数组 数组名本身就是地址,不用用取地址符号
		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);
		pc->sz++;
		printf("增加联系人成功!");
	}
}

🌼ShowContact

//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	for (i = 0; i < pc->sz; i++)
	{
		printf("姓名:%-20s\t", pc->data[i].name);//根据联系人结构体信息
		printf("年龄:%-4d\t", pc->data[i].age);
		printf("性别:%-5s\t", pc->data[i].sex);
		printf("电话:%-12s\t", pc->data[i].tele);
		printf("住址:%-13s\t", pc->data[i].addr);//统一左对齐
		printf("\n");
	}
}


但是,当显示的数据变多的时候,尽管是左对齐,还是不够美观。
接下来,我们采用打印标题的形式,更好的打印出数据。

//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

🌼DelContact

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)
	//查找有没有这个人
	for (i = 0; i < pc->sz; i ++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			flag = 1;
		}	
	}

	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return;
	}
	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

🌼进一步改进

当我们写后面的函数时,我们发现后面的查找函数 还是 修改函数 都需要像 删除函数一样 先在通讯录类进行查找。
为了更高效完成整个工程,提高效率,我们可以来写一个通过名字进行查找的函数FindByName
当我们写 删除 查找 修改函数时,首先可以直接调用这个函数。

int FindByName(Contact* pc, char name[])
{
	int flag = 0;
	int i = 0;
	int pos;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			return pos;
		}
	}
	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return -1;
	}

}

DelContact函数改进为:

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)


	//查找有没有这个人
	if ((FindByName(pc, name) == -1))
	{
		printf("找不到要删除的联系人");
	}
	else
		pos = FindByName(pc, name); //记下位置


	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

🌼SearchContact

在这里插入图片描述

//查找指定联系人
void SearchContact(const Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有指定联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要查找的联系人\n");
	else
	{
		pos = FindByName(pc, name);
		printf("找到了!\n");
		printf("该联系人的下标为%d", pos);
		//打印数据
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[pos].name,
			pc->data[pos].age,
			pc->data[pos].sex,
			pc->data[pos].tele,
			pc->data[pos].addr);
	}
}

🌼ModifyContact

在这里插入图片描述


//修改指定联系人
void ModifyContact(Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有要修改的联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要修改的联系人\n");
	else 
	{
		printf("找到了要修改的联系人!\n");
		pos = FindByName(pc, name);
		//修改 (修改可以理解为再次录入一遍信息)
		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("成功修改联系人!");

	}
}

🌼Sort Contact

//按照名字进行排序
//排序

int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
void SortContact(Contact* pc)
{
	int i = 0;
	//利用qsort 函数
	qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

🎆🎆🎆完整代码

contact.h

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#define MAX 100

//声明结构体--保存人的信息
typedef struct PeoInfo
{
	char name[20];
	int age;
	char sex[5];//一个汉字占两个字符
	char tele[12];
	char addr[30];
}PeoInfo;
//声明结构体通讯录
typedef struct Contact
{
	PeoInfo data[MAX];
	int sz;
}Contact;
int FindByName(Contact* pc, char name[]);
void AddContact(Contact* pc);
void ShowContact(const Contact* pc);
void DelContact(Contact* pc);
void SearchContact( Contact* pc);
void SearchContact(Contact* pc);
void SortContact(Contact* pc);

enum OPTION
{
	EXIT,//0
	ADD,//1
	DEL,//2
	SEARCH,//3
	MODIFY,//4
	SHOW,//5
	SORT//6
};


//函数的声明--初始化通讯录
void InitContact(Contact* pc);

contact.c

#include "contact.h"

void InitContact(Contact* pc)
{
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}


//增加联系人的信息
void AddContact(Contact* pc)
{
	//判断数组是否可以增添?
	if (pc->sz == 100)
	{
		printf("通讯录已满,无法添加\n");
		return;
	}
	//通讯录没满
	else
	{
		printf("请输入名字:>");
		scanf("%s", pc->data[pc->sz].name);//pc->data 指向的是结构体数组 数组名本身就是地址,不用用取地址符号
		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);
		pc->sz++;
		printf("增加联系人成功!");
	}
}


//显示所有联系人的信息
void ShowContact(const Contact* pc)//仅仅是显示,而不修改 所以用const限制修饰
{
	int i;
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}
}

int FindByName(Contact* pc, char name[])
{
	int flag = 0;
	int i = 0;
	int pos;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0) //字符串比较函数
		{
			pos = i;//找到了,记下位置
			return pos;
		}
	}
	if (flag == 0)
	{
		printf("要删除的人不存在\n");
		return -1;
	}

}

//删除指定联系人
void DelContact(Contact* pc)
{
	int i = 0;
	char name[20];
	int pos = 0;
	int flag = 0;//输入要删除的人删除
	printf("请输入要删除人的名字:>");
	scanf("%s", name);//将要删除的人的名字放入name中(name本就是一个地址值)


	//查找有没有这个人
	if ((FindByName(pc, name) == -1))
	{
		printf("找不到要删除的联系人");
	}
	else
		pos = FindByName(pc, name); //记下位置


	//进行删除
	for (i = pos; i <pc->sz-1; i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("成功删除联系人!");
}

//查找指定联系人
void SearchContact( Contact* pc)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有指定联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要查找的联系人\n");
	else
	{
		pos = FindByName(pc, name);
		printf("找到了!\n");
		printf("该联系人的下标为%d", pos);
		//打印数据
		printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\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)
{
	int pos = 0;
	char name[20] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	//查找有没有要修改的联系人
	if (FindByName(pc, name) == -1)
		printf("没有找到要修改的联系人\n");
	else 
	{
		printf("找到了要修改的联系人!\n");
		pos = FindByName(pc, name);
		//修改 (修改可以理解为再次录入一遍信息)
		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("成功修改联系人!");

	}
}

//按照名字进行排序
//排序

int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((PeoInfo*)p1)->name, ((PeoInfo*)p2)->name);
}
void SortContact(Contact* pc)
{
	int i = 0;
	//利用qsort 函数
	qsort(pc->data, pc->sz, sizeof((pc->data)[0]), cmp_name);
	//打印列标题
	printf("%-20s\t%-4s\t%-5s\t%-12s\t%-30s\n", "名字", "年龄", "性别", "电话", "地址");
	//打印数据
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-12s\t%-30s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

test.c


#include"contact.h"

void menu()
{
	printf("\n");
	printf("******************\n");
	printf("******请选择******\n");
	printf("******1.增添******\n");
	printf("******2.删除******\n");
	printf("******3.查找******\n");
	printf("******4.修改******\n");
	printf("******5.显示******\n");
	printf("******6.排序******\n");
	printf("******0.退出******\n");
			
}

void test()
{
	Contact con;  //定义结构体变量-通讯录
	InitContact(&con);//对通讯录进行初始化
	int input = 0;
	do
	{
		menu();
		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:
			printf("退出通讯录\n");
			break;
		default:
			printf("选择错误,重新选择\n");
			break;
		}

	} while (input);

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

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

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

相关文章

【机器学习】文本多分类

声明&#xff1a;这只是浅显的一个小试验&#xff0c;且借助了AI。使用的是jupyter notebook,所以代码是一块一块&#xff0c;从上往下执行的 知识点&#xff1a;正则删除除数字和字母外的所有字符、高频词云、混淆矩阵 参考&#xff1a;使用python和sklearn的中文文本多分类…

JDK9特性——语法、API的改变

文章目录 语法层次改变钻石操作符号语法升级try结构语法升级下划线命名标识符的使用限制 API层次的改变接口中的私有方法String底层存储结构变化Stream新增4个APIInputStream新增transferTo方法只读集合创建 语法层次改变 钻石操作符号语法升级 钻石操作符&#xff0c;就是我…

LeetCode(力扣)738. 单调递增的数字Python

LeetCode738. 单调递增的数字 题目链接代码 题目链接 https://leetcode.cn/problems/monotone-increasing-digits/description/ 代码 class Solution:def monotoneIncreasingDigits(self, n: int) -> int:strNum str(n)flag len(strNum)for i in range(len(strNum) - …

ffmpeg6.0编译(NDK)

ffmpeg 6.0 支持vulkan 需要手动安装Vulkan 并将include里面的vk_video 和 vulkan 拷贝到 android-ndk-r25c/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/ vulkan 下载 cp -r vk_video $NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/include/…

前端vue3分享——项目封装axios、vite使用env环境变量

文章目录 ⭐前言⭐vue3封装统一的axios请求&#x1f496; 请求拦截器 ⭐vue3使用env环境变量&#x1f496; vite env变量规则&#x1f496; vite.config获取env参数 ⭐总结&#x1f496; 编码sliod原则 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前端…

iOS开发之编译OpenSSL静态库

项目审查发现OpenSSL1.0.2d有漏洞&#xff0c;所以需要升级更新OpenSSL版本&#xff0c;借此机会&#xff0c;记录一下编译OpenSSL静态库的流程。 Xcode使用的是14.2&#xff0c;OpenSSL使用的是1.0.2u、1.1.1u&#xff0c;由于是对两个不同版本进行的编译操作&#xff0c;所以…

企业架构LNMP学习笔记55

MongoDB的安装和配置&#xff1a; 1、安装方式介绍&#xff1a; yum安装方式&#xff1a; 手动通用安装方式&#xff1a; 2、二进制可执行安装&#xff1a; 下载路径&#xff1a;Download MongoDB Community Server | MongoDB 下载mongodb的源码包进行安装。 1&#xff09;…

220kV 及以下避雷器直流泄露电流试验

试验步骤: 1) 记录试验现场的环境温度、 湿度。 2) 对被试设备充分放电后可靠接地。 3) 试验前正确设置安全围栏和悬挂标示牌。 4) 做上节避雷器直流试验时, 根据图进行试验接线, 微安表的一端夹子接在上节避雷器的下端, 另一端安装在高压直流发生器的电压输出端, 上节避雷…

cgroup限制内存

首先简单介绍下cgroup限制cpu的使用率&#xff0c;写一段代码如下&#xff1a; #include <stdio.h> #include <pthread.h>int main() { int i 0; for(;;)i; return 0; }很明显&#xff0c;这里面是单核拉满&#xff0c;然后top看下进程的cpu使用率&#xff0c;如…

【深度学习】Pytorch 系列教程(十四):PyTorch数据结构:6、模块(Module):前向传播

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 2、张量操作&#xff08;Tensor Operations&#xff09; 3、变量&#xff08;Variable&#xff09; 4、数据集&#xff08;Dataset&#xff09; 5、数据加载器&#x…

科学计算器网站Desmos网站

科学计算器网站Desmos网站 有时在学习工作或者生活中&#xff0c;需要用到计算问题&#xff0c;但由于电脑上没有安装相应的专业软件&#xff0c;难以计算有的问题&#xff0c;因而&#xff0c;本文推荐一种免费的在线计算网站Desmos。 一、Desmos网址 Desmos官网的地址为&a…

[管理与领导-96]:IT基层管理者 - 扩展技能 - 5 - 职场丛林法则 -10- 七分做,三分讲,完整汇报工作的艺术

目录 前言&#xff1a; 一、汇报工作的重要性 1.1 汇报的重要性&#xff1a;汇报工作是工作重要的一环 1.2 向上司汇报工作状态具有重要的意义 1.2 汇报工作存在一些误解 1.3 汇报工作中的下错误做法 1.4 汇报工作与做实际工作的关系 二、工作汇报的内容与艺术 2.1 工…

【深度学习】- NLP系列文章之 1.文本表示以及mlp来处理分类问题

系列文章目录 1. 文本分类与词嵌入表示&#xff0c;mlp来处理分类问题 2. RNN、LSTM、GRU三种方式处理文本分类问题 3. 评论情绪分类 还是得开个坑&#xff0c;最近搞论文&#xff0c;使用lstm做的ssd的cache prefetching&#xff0c;意味着我不能再划水了。 文章目录 系列文章…

js创建动态key的对象ES6和ES5的方法

前提&#xff1a; 有个场景&#xff0c;循环数组&#xff0c;根据每一项的值&#xff0c;往一个数组中push一个新对象&#xff0c;对象的key不同要从数组中获取 情况解析&#xff1a;push没有什么问题&#xff0c;问题就是创建一个动态key的对象。下面就说一下如何以参数为key…

【pwn入门】基础知识

声明 本文是B站你想有多PWN和星盟安全学习的笔记&#xff0c;包含一些视频外的扩展知识。 工具和命令 常见的工具 pwntools安装checksec安装pwndbg的安装和gdb使用ubuntu没有使用全部磁盘空间 sudo lvextend -l 100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv sudo resize2f…

Vue中一键批量注册全局组件

文件目录如下 1. component文件夹中编写所有的公共组件 注意&#xff1a;之后一键注册的全局组件名就是每个公共组件&#xff08;xxx.vue&#xff09;文件的文件名 xxx 2. plugins/components.js中批量注册组件 import Vue from "vue"let requireFile require.con…

关于阿里云服务器Ubuntu编译jdk8中遇到的坑及解决方案

关于阿里云服务器Ubuntu系统安装jdk8中遇到的坑及解决方案 记录一下困扰了很多天、到处查资料最后终于成功安装的过程 关于阿里云服务器无法登录的问题 基本反馈是这样的&#xff1a; 如果你添加了ip之后仍然登不进去&#xff0c;有一种方法是直接从第三个选项进去登录之后修…

十天学完基础数据结构-第一天(绪论)

1. 数据结构的研究内容 数据结构的研究主要包括以下核心内容和目标&#xff1a; 存储和组织数据&#xff1a;数据结构研究如何高效地存储和组织数据&#xff0c;以便于访问和操作。这包括了在内存或磁盘上的数据存储方式&#xff0c;如何将数据元素组织成有序或无序的集合&…

浅谈C++|多态篇

1.多态的基本概念 多态是C面向对象三大特性之一多态分为两类 1. 静态多态:函数重载和运算符重载属于静态多态&#xff0c;复用函数名 2.动态多态:派生类和虚函数实现运行时多态 静态多态和动态多态区别: 静态多态的函数地址早绑定–编译阶段确定函数地址 动态多态的函数地址晚绑…

浅谈C++|类的继承篇

引子&#xff1a; 继承是面向对象三大特性之一、有些类与类之间存在特殊的关系&#xff0c;例如下图中: 我们发现&#xff0c;定义这些类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这个时候我们就可以考虑利用继承的技术&#xff0c;减少…