通讯录的实现(增删查改排序)

news2025/1/23 14:56:09

本课题模拟通讯录的实现,包括:

1.增加联系人的信息

2.删除联系人

3.查找联系人

4.修改联系人信息

5.对联系人进行排序

本节目录:

通讯录的实现样貌展示:这就算通讯录的菜单

下面对每个功能进行模块性讲解。

一、通讯录变量的创建

【思路1】

    通讯录是一个复杂的对象,包含了用户的名字、性别、年龄、电话号码和家庭住址等信息,所以需要用结构体来定义

#define NAME_MAX 20
#define SEX_MAX 6
#define TELE_MAX 20
#define ADDR_MAX 20
typedef struct PeoInfo
{
	char name[NAME_MAX];//姓名
	char sex[SEX_MAX];//性别
	int age;//年龄
	char tele[TELE_MAX];//电话
	char addr[ADDR_MAX];//地址
}PeoInfo;

为了方便后续修改结构体中每个成员的大小范围,使用了宏定义的常量,来表示每个数组的大小。

【思路2】

(1)这是一个结构体类型,用来创造变量,一次只能创建一个,不合适,所以需要数组。

(2)因为通讯录是数组,所以需要一个变量来实时记录通讯录的个数。

(3)为了可以使用,他们需要同类型,所以还需要再创造一个结构体

#define MAX 100
typedef struct contact
{
	PeoInfo data[MAX];//通讯录
	int sz;//记录通讯录的个数
}contact;

接下来再用contact创造变量就好 

contact con;//通讯录变量的创建

二、通讯录的初始化

(1)需要修改通讯录中的内容,需要传结构体的地址

InitContact(&con);//传参

(2)初始化函数

void InitContact(contact* pc)
{
	assert(pc);
	memset(pc->data,0,sizeof(pc->data));
	pc->sz = 0;//通讯录开始的容量为0
}

(1)用assert函数判断指针是否为空,为空则会退出程序。需要包含头文件:#include<assert.h>

(2)用memset函数将通讯录中的内容设置成0即可。需要包含头文件:#include<string.h>

三、通讯录信息的添加(add)

(1)信息添加的条件

在信息添加前我们需要查看通讯录是否已满,满了则不能再继续添加信息。

传参:

AddContact(&con);

通讯录判满:

void AddContact(contact* pc)
{
    assert(pc);//指针判空操作
    if (pc->sz == MAX)
	{
		printf("通讯录已满,存入信息失败\n");
		return;
	}
}

(2)信息添加的过程

void AddContact(contact* pc)
{
	assert(pc);	
		if (pc->sz == MAX)
		{
			printf("通讯录已满,存入信息失败\n");
			return;
		}
		printf("请输入姓名>:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别>:");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄>:");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话>:");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址>:");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("信息添加成功\n");
}

(1)逐一对通讯录进行信息添加即可,需要注意结构体的访问方式

(2)data数组的第一个联系人的下标是0,等于sz的值

(3)信息添加的完善

以上的操作每次只能添加一个人的信息,很不方便。所以我们使用go语句循环以上的代码

void AddContact(contact* pc)
{
	assert(pc);
	int adds;
		back://go语句标记2
		if (pc->sz == MAX)
		{
			printf("通讯录已满,存入信息失败\n");
			return;
		}
		printf("请输入姓名>:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别>:");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄>:");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话>:");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址>:");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("信息添加成功\n");
        //循环是否继续的判断
		printf("是否继续添加联系人信息1/0:");
		scanf("%d",&adds);
		if (adds == 1)
			goto back;//go语句标记1
		else
		{
			return;
		}
}

四、通讯录的打印(show)

当已经可以想通讯录中添加了联系人信息之后,就可以将他们的信息打印在屏幕上进行验证:

(1)可以打印通讯录的条件

传参:

ShowContact(&con);

通讯录判空:

void ShowContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
}

如果通讯录一个信息都没有,将不会打印

(2)通讯录的打印

void ShowContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-10s %-5s %-10s %-15s %-10s\n","名字","性别","年龄","电话","住址");
	int i = 0;
	for (i=0;i<pc->sz;i++)
	{
		printf("%-10s %-5s %-10d %-15s %-10s\n",
			pc->data[i].name, pc->data[i].sex, pc->data[i].age,
			pc->data[i].tele, pc->data[i].addr);
	}
	printf("\n");
}

(1)通讯录打印的时候,注意打印的格式

(2)%-10s:实现的是左对齐

五、删除联系人(del)

(1)通讯录的判空

传参:

DelContact(&con);

判空:

void DelContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
}

(2)删除联系人的条件

 如果需要删除的联系人不存在,那么也将会删除失败。所以需要查找联系人是否存在

查找函数:(联系人存在,返回联系人的下标;不存在返回-1)

传参:

    printf("请输入你要删除的联系人:");
	char name[NAME_MAX];
	scanf("%s",name);
	int ret = FindContact(pc,name);
static int FindContact(contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i=0;i<pc->sz;i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
			return i;
	}
	return -1;
}

(3)删除操作

void DelContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	printf("请输入你要删除的联系人:");
	char name[NAME_MAX];
	scanf("%s",name);
	int ret = FindContact(pc,name);
	if (ret == -1)
	{
		printf("联系人不存在,删除失败\n");
		return;
	}
	int i = 0;
	for (i=ret;i<pc->sz-1;i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除联系人成功\n");
}

六、查找联系人并打印(Search)

依然需要用到上述的查找某位联系人是否存在的函数

传参:

SearchContact(&con);

(1)先查找

void SearchContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
}

(2)后打印

联系人存在就打印该联系人的信息

void SearchContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在,查找失败\n");
		return;
	}
	printf("查找成功:\n");
	printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址");
	printf("%-10s %-5s %-10d %-15s %-10s\n",
		pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
		pc->data[ret].tele, pc->data[ret].addr);
}

七、修改联系人(modify)

想要修改某位联系人的信息,首先确定该联系人是否存在

传参:

ModifyContact(&con);

(1)查找联系人

void ModifyContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在,修改失败\n");
		return;
	}
}

(2)修改联系人信息

void ModifyContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在,修改失败\n");
		return;
	}
	printf("联系人存在:");
	printf("%-10s %-5s %-10d %-15s %-10s\n",
	pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
	pc->data[ret].tele, pc->data[ret].addr);
	printf("请修改姓名>:");
	scanf("%s", pc->data[ret].name);
	printf("请修改性别>:");
	scanf("%s", pc->data[ret].sex);
	printf("请修改年龄>:");
	scanf("%d", &(pc->data[ret].age));
	printf("请修改电话>:");
	scanf("%s", pc->data[ret].tele);
	printf("请修改住址>:");
	scanf("%s", pc->data[ret].addr);
	printf("\n修改成功");
}

八、联系人排序

对联系人排序,使用库函数中的排序函数qsort,我们只需要完成比较函数即可。

排序可以按照名字的字典顺序或者年龄等,我们这里介绍名字和年龄的排序。

(1)按照名字排序

传参:

qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);

第四个为函数指针,指向的比较函数需要我们自己完成

名字的比较函数:

//名字排序
int qsort_cmp_name(const void* e1,const void* e2)
{
	return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name);
}

(1) 名字的字典顺序,其实就算字符串的比较。

(2)字符串比较需要用函数strcmp,头文件#include<string.h>

(2)按照年龄排序

传参:

qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);

年龄的比较函数:

//年龄排序
int qsort_cmp_age(const void* e1,const void* e2)
{
	return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age;
}

(3)完整排序函数

void menu2()
{
	printf("*************************\n");
	printf("**** 1.名字   2.年龄 ****\n");
	printf("*************************\n");
}
//联系人排序
void SortContact(contact* pc)
{
	int input2;
	menu2();
	printf("请选择排序方式:");
	scanf("%d",&input2);
	switch (input2)
	{
	case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break;
	case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break;
	defualt:printf("选择错误\n");
		break;
	}
}

每进入一次该函数,只能排序一次,不需要设置循环

九、菜单的实现

(1)主函数部分

enum Option
{
	EXIT,//退出
ADD,//增加
DEL,//删除联系人
SEARCH,//查找联系人
MODIFY,//修改指定联系人
SHOW,//打印联系人
SORT,//分类
};
int main()
{
    contact con;
	InitContact(&con);
	int input;
	do
	{
		menu();
		printf("请输入你的选择>:");
		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);
	return 0;
}

【代码思路】

(1)do…while循环配合switch选择语句完成菜单的构造。可以供用户多次选择,直至退出

(2)在选择语句中

(2)菜单函数

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

所谓的菜单,就算打印出来让我们看。具体的选项还是得由主函数部分实现。

十、完整通讯录代码

#define _CRT_SECURE_NO_WARNINGS 1

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

#define NAME_MAX 20
#define SEX_MAX 6
#define TELE_MAX 20
#define ADDR_MAX 20

#define MAX 100

typedef struct PeoInfo
{
	char name[NAME_MAX];//姓名
	char sex[SEX_MAX];//性别
	int age;//年龄
	char tele[TELE_MAX];//电话
	char addr[ADDR_MAX];//地址
}PeoInfo;

typedef struct contact
{
	PeoInfo data[MAX];//通讯录
	int sz;//记录通讯录的个数
}contact;

//函数的声明
//初始化
 void InitContact(contact* pc);

 //添加用户信息
 void AddContact(contact* pc);

 //打印通讯录
 void ShowContact(contact* pc);

 //删除联系人
 void DelContact(contact* pc);

 //查找某个联系人
 void SearchContact(contact* pc);

 //修改联系人
 void ModifyContact(contact* pc);

 //联系人排序
 void SortContact(contact* pc);

//函数功能的实现

void InitContact(contact* pc)
{
	assert(pc);
	memset(pc->data,0,sizeof(pc->data));
	pc->sz = 0;
}
void ShowContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空\n");
		return;
	}
	printf("%-10s %-5s %-10s %-15s %-10s\n","名字","性别","年龄","电话","住址");
	int i = 0;
	for (i=0;i<pc->sz;i++)
	{
		printf("%-10s %-5s %-10d %-15s %-10s\n",
			pc->data[i].name, pc->data[i].sex, pc->data[i].age,
			pc->data[i].tele, pc->data[i].addr);
	}
	printf("\n");
}

void AddContact(contact* pc)
{
	assert(pc);
	int adds;
		back:
		if (pc->sz == MAX)
		{
			printf("通讯录已满,存入信息失败\n");
			return;
		}

		printf("请输入姓名>:");
		scanf("%s", pc->data[pc->sz].name);
		printf("请输入性别>:");
		scanf("%s", pc->data[pc->sz].sex);
		printf("请输入年龄>:");
		scanf("%d", &(pc->data[pc->sz].age));
		printf("请输入电话>:");
		scanf("%s", pc->data[pc->sz].tele);
		printf("请输入住址>:");
		scanf("%s", pc->data[pc->sz].addr);
		pc->sz++;
		printf("信息添加成功\n");

		printf("是否继续添加联系人信息1/0:");
		scanf("%d",&adds);
		if (adds == 1)
			goto back;
		else
		{
			return;
		}
}
//查看某个联系人是否存在
static int FindContact(contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i=0;i<pc->sz;i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
			return i;
	}
	return -1;
}
//删除联系人
void DelContact(contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空,删除失败\n");
		return;
	}
	printf("请输入你要删除的联系人:");
	char name[NAME_MAX];
	scanf("%s",name);
	int ret = FindContact(pc,name);
	if (ret == -1)
	{
		printf("联系人不存在,删除失败\n");
		return;
	}
	int i = 0;
	for (i=ret;i<pc->sz-1;i++)
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除联系人成功\n");
}
//查找联系人
void SearchContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
		char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在,查找失败\n");
		return;
	}
	printf("查找成功:\n");
	printf("%-10s %-5s %-10s %-15s %-10s\n", "名字", "性别", "年龄", "电话", "住址");
	printf("%-10s %-5s %-10d %-15s %-10s\n",
		pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
		pc->data[ret].tele, pc->data[ret].addr);
}
//修改联系人
void ModifyContact(contact* pc)
{
	assert(pc);
	printf("请输入你要查找联系人的名字:");
	char name[NAME_MAX];
	scanf("%s", name);
	int ret = FindContact(pc, name);
	if (ret == -1)
	{
		printf("联系人不存在,修改失败\n");
		return;
	}
	printf("联系人存在:");
	printf("%-10s %-5s %-10d %-15s %-10s\n",
		pc->data[ret].name, pc->data[ret].sex, pc->data[ret].age,
		pc->data[ret].tele, pc->data[ret].addr);
	printf("请修改姓名>:");
	scanf("%s", pc->data[ret].name);
	printf("请修改性别>:");
	scanf("%s", pc->data[ret].sex);
	printf("请修改年龄>:");
	scanf("%d", &(pc->data[ret].age));
	printf("请修改电话>:");
	scanf("%s", pc->data[ret].tele);
	printf("请修改住址>:");
	scanf("%s", pc->data[ret].addr);
	printf("\n修改成功");
}
//分类菜单
void menu2()
{
	printf("*************************\n");
	printf("**** 1.名字   2.年龄 ****\n");
	printf("*************************\n");

}
//名字排序
int qsort_cmp_name(const void* e1,const void* e2)
{
	return strcmp((((contact*)e1)->data)->name, (((contact*)e2)->data)->name);
}
//年龄排序
int qsort_cmp_age(const void* e1,const void* e2)
{
	return (((contact*)e1)->data)->age - (((contact*)e2)->data)->age;
}
//联系人排序
void SortContact(contact* pc)
{
	int input2;
	menu2();
	printf("请选择排序方式:");
	scanf("%d",&input2);
	switch (input2)
	{
	case 1:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_name);break;
	case 2:qsort(pc->data, pc->sz, sizeof(pc->data[0]), qsort_cmp_age);break;
	defualt:printf("选择错误\n");
		break;
	}
}

//主函数及菜单
void menu()
{
	printf("********************************\n");
	printf("**** 1. add      2. del     ****\n");	
	printf("**** 3. search   4. modify  ****\n");
	printf("**** 5. show     6. sort    ****\n");
	printf("**** 0. exit                ****\n");
	printf("********************************\n");
}
enum Option
{
EXIT,//退出
ADD,//增加
DEL,//删除联系人
SEARCH,//查找联系人
MODIFY,//修改指定联系人
SHOW,//打印联系人
SORT,//分类
};
int main()
{
	contact con;
	InitContact(&con);
	int input;
	do
	{
		menu();
		printf("请输入你的选择>:");
		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);
	return 0;
}

至此,通讯录的实现完成。


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

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

相关文章

领英如何注册?2023超全面详细教程

领英是一家面向商业用户的全球最大的职业社交网站&#xff0c;据统计&#xff0c;Linkedln用户每月与网页的交互次数超过10亿次。对于跨境人来说&#xff0c;他更是作为一个开发客户、广告营销的工具&#xff0c;被称为跨境的“风口”。 一、领英被封原因 1、IP、设备问题 1&…

QT中使用QVTKOpenGLNativeWidget的简单教程以及案例,利用PCLVisualizer显示点云

先添加一个带有ui的QT应用程序。 一、在ui界面中添加QVTKOpenGLNativeWidget控件 先拖出来一个QOpenGLWidget控件 修改布局如下&#xff1a; 然后将QOpenGLWidget控件提升为QVTKOpenGLNativeWidget控件&#xff0c;步骤如下&#xff1a; 右击QOpenGLWidget窗口&#xff0c;选…

Linux系统下的shell外壳

往期回顾: ⭐Linux系统常用指令(一) ⭐Linux系统常用指令(二) ⭐Linux系统常用指令(三) ⭐Linux系统常用指令(完) 本篇文章我们来深挖Linux的知识! Linux严格意义上说的是一个操作系统&#xff0c;我们称之为“核心&#xff08;kernel&#xff09; “ &#xff0c;但我们一般用…

技术路线决定出海方向:中国车企的全球市场密码

摘要&#xff1a;面对全球化的挑战,中国汽车企业站在了一个十字路口:选择大众市场还是豪华市场?背后涉及的不仅是消费者的购车偏好,更有技术路线和产业链的深层次支撑。从丰田的Prius到宝马的驾驶乐趣&#xff0c;不同的市场策略背后隐藏着怎样的全球化密码? 随着全球化浪潮的…

网络库OKHTTP(3)拦截器扩展,一个好用的网络请求监控工具Chuck

序、慢慢来才是最快的方法。 场景一 明明是服务端的接口数据错误&#xff0c;而QA&#xff08;测试&#xff09;第一个找到的可能是客户端开发的你&#xff0c;为什么这个页面出现错误了&#xff1f; 而作为客户端开发的你&#xff0c;可能要拿出测试机连上电脑&#xff0c;打…

ftp服务开启——windows

一、打开服务 1、打开控制面板——》选中程序和功能 2、 选择启用或关闭windows功能 3、全选FTP服务器&#xff0c;web管理工具里面的IIS管理控制台&#xff0c;一个都不能漏 4、全选 万维网服务下面的安全性的所有选项&#xff0c;最后点击确定 二、 IIS 配置 1、windows的…

如何使用ai去水印?用这款就够了

AI在图像处理领域的不断成熟确实为我们提供了更多便利和高效率的工具&#xff0c;使得图像处理变得更加便捷&#xff0c;尤其是AI去水印技术&#xff0c;它可以轻松去除图片中的各种杂质&#xff0c;包括水印、文字、标志、物体、以及其他杂乱的干扰元素&#xff0c;有效提高了…

SSM - Springboot - MyBatis-Plus 全栈体系(三十一)

第七章 MyBatis-Plus 二、MyBatis-Plus 核心功能 1. 基于 Mapper 接口 CRUD 通用 CRUD 封装 BaseMapper (opens new window)接口&#xff0c; Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器! 内部包含常见的单表操作&#xff01; 1.1 Insert 方…

LoongArch 指令集设计——单周期5条指令exp5

对应实验手册请参阅《LoongArch CPU设计实验》。 NOTE: minicpu_env/miniCPU/目录下的代码功能不全&#xff0c;是有意为之&#xff0c;无需提issue修正。mycpu_env/myCPU/目录下的代码有功能错误&#xff0c;亦是有意为之&#xff0c;无需提issue修正。 实验安排简介 // dc…

E053-web安全应用-Brute force暴力破解初级

课程分类&#xff1a; web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请&#xff0c;对该公司旗下的网站进行安全检测&#xff0c;经过一番检查发现该论坛的后台登录页面上可能存在万能密码漏洞&#xff0c;导致不知道账号密码也能登录后台&am…

Windows消息 队列

1、 Windows消息机制 Windows是一个消息驱动的操作系统&#xff0c;消息是用一个常量标识符来标记&#xff0c;并且有两个32Bit的消息附加信息。单击鼠标、敲击键盘&#xff0c;都会通过电脑外设向系统发送特定的中断信号&#xff0c;这个中断信息在操作系统中会转化为一个消息…

leetcode每日一题复盘(10.16~10.22)

leetcode 501 二叉搜素树中的众数 对二叉搜索树的性质还不是很熟悉,不懂得利用其性质,做题没有方法论,这是暴露出来的问题,明天重做一下98,530,501这三个题,再进行总结

33 机器学习(一):特征工程

文章目录 机器学习需要用到的包的介绍机器学习做什么深度学习做什么常见的概念 数据介绍数据类型数据的来源数据的构成 特征工程one-hot编码接口集特征提取DictVectorizerCountVectorizerTfidfVectorizer 特征处理归一化 MinMaxScaler标准化 StandardScaler标准化和归一化的对比…

mmdetection及mmengine源码结构

python中的装饰函数 所谓的函数修饰符&#xff0c;就是在函数外面再套一层函数&#xff0c; 装饰函数可以接受不同的参数类型的函数传入&#xff0c;对其进行装饰加工&#xff1b; 在需要装饰的函数前面装饰函数即可&#xff1b; 这样子做的好处在于代码的复用&#xff0c;比…

使用interrupt()中断线程

示例一 : public class Test01 extends Thread {Overridepublic void run() {while (true) {}}public static void main(String[] args) {Test01 t new Test01();t.start();try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.prin…

家用洗地机哪个牌子最好用?质量最好的洗地机推荐

提到家务清洁&#xff0c;相信应该是很多宝妈头疼的事儿&#xff0c;不仅工作量打&#xff0c;耗时又耗力&#xff0c;拥有一款完美的清洁工具&#xff0c;那讲大大的提升幸福指数&#xff0c;而洗地机便是当下的智能清洁神器之一。那么家用洗地机哪个牌子最好用&#xff0c;质…

竞赛 深度学习YOLO图像视频足球和人体检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov5算法5 数据集6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习YOLO图像视频足球和人体检测 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非…

使用Nginx实现采集端和数据分析平台的数据加密传输

1. 需求描述 目前鸿鹄暴露出来的重要ports如下表&#xff1a; 在实际的生产环境中&#xff0c;结合我司的使用场景&#xff0c;需要在鸿鹄前端安装proxy&#xff0c;用以解决如下两个问题&#xff1a; 1.1 实现http到https的强制跳转 企业环境中&#xff0c;一般会关闭http 80端…

精准定位——MySQL日志学习的一天【错误、二进制、查询、慢查询】

MySQL 日志是记录 MySQL 数据库服务器运行过程中的各种活动和事件的文件。它们对于监控、故障排查、性能优化和数据恢复等方面都非常重要。 回顾一下Linux中查看文件的指令操作 cat 命令&#xff1a; cat 命令用于将文件的内容一次性输出到终端。它的主要功能是将文件连接起来…

在全志R128上启用USB ADB以及无线ADB配置方法

首先在FreeRTOS的环境下&#xff0c;选择r128_c906_pro&#xff1a; source envsetup.sh lunch_rtos r128s2_pro_c906USB ADB的配置比较常规&#xff0c;注意以下几个驱动的勾选 usb device驱动adb gadget驱动adbd应用 运行menuconfig&#xff0c;选择对应的驱动以及软件包&…