【C语言】通讯录

news2024/11/28 16:37:21

目录

一、关于通讯录

二、代码逻辑

三、通讯录实现

1.菜单设计

2.逻辑主要功能设计

3.增加联系人功能实现

4.显示全部联系人信息 

 5.删除联系人

6.查找联系人

7.修改联系人信息

8.对联系人进行排序

 9.一键清空所有联系人

四、完整源码

test.c

contact.c

contact.h


一、关于通讯录

在通讯录中,我们一般保存联系人的信息,联系人的信息一般会有 姓名、年龄、性别、电话、地址等。在通讯录中,我们也会对一些信息进行增删改查。

二、代码逻辑

代码文件

test.c 用于测试代码

contact.h 用于存放头文件

contact.c 用于主要代码的功能实现

  1. 菜单设计
  2. 功能实现

三、通讯录实现

1.菜单设计

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

 

2.逻辑主要功能设计

因为有了菜单可以进行功能选择

功能实现的前提是  先对通讯录 进行设计 并 初始化

采用结构体进行设计

typedef struct PeoInfo 
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char tele[TELE_MAX];
	char addr[ADDR_MAX];
}PeoInfo;

typedef struct Contact 
{
	PeoInfo data[MAX];//存放通讯录数据
	int sz;//记录通讯录存了多少个数据
}Contact;

 

通讯录初始化(使用memset 将通讯录数据置0)

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

采用do ...while 和 switch 进行设计

	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 CLEAR:
			InitContact(&con);//清空通讯录
			break;
		case EXIT:
			printf("退出通讯录!\n");
			break;
		default:
			Sleep(300);
			system("cls");//清屏
			printf("输入错误,请重新输入!\n");
		}
	} while (input);

在这里我们发现switch 语句中 的case 选项中的常量表达式 是字母,这里主要是利用了枚举常量。

enum Option 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	CLEAR
};

EXIT表示0 ,ADD表示1 依次类推... 

这样在switch语句中就增加了代码的可读性和可调试性

3.增加联系人功能实现

//增加联系人
void AddContact(Contact* pc) 
{
	assert(pc);
	//首先应该判断通讯录是否已满
	if (pc->sz == MAX) 
	{
		printf("通讯录已满,无法添加!\n");
		return;
	}

	Sleep(300);
	system("cls");//清屏
	//增加的信息
	//名字 年龄 性别 电话 地址
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n","名字","年龄","性别","电话","地址");
	printf("----------------------------------------------------------------------------\n");


	//增加信息
	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);
	pc->sz++;
	printf("增加成功\n");
	Sleep(1000);
	system("cls");//清屏
}

4.显示全部联系人信息 

上述是增加联系人的信息,既然增加联系人我们就来查看联系人信息

//显示全部联系人
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc -> sz;i++)
	{
		printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}

 

 5.删除联系人

这里采用的思想是 数组后面的元素前移将前面的元素覆盖来达到删除该信息的目的

这里是删除指定联系人

//按名字查找
static int FindByName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz;i++)
	{
		if (strcmp(pc->data[i].name,name) == 0) 
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法删除!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	char name[NAME_MAX];
	printf("输入要删除的名字:");
	scanf("%s",&name);
	int ret = FindByName(pc,name);
	if (ret == -1)
	{
		printf("要删除的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	int i = 0;
	//进行删除的操作
	for (i = ret; i < pc->sz - 1;i++) 
	{
		pc->data[i] = pc->data[i + 1];
	}
	pc->sz--;
	printf("删除成功!\n");
	Sleep(1000);
	system("cls");//清屏
}

6.查找联系人

 

//查找联系人
void SearchContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	Sleep(1000);
	system("cls");//清屏
	printf("请输入要查找人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的联系人不存在\n");
		//Sleep(1000);
		//system("cls");//清屏
		return;
	}
	Sleep(1000);
	system("cls");//清屏
	//显示出查找的联系人
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-18s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	Sleep(3000);
}

7.修改联系人信息

enum option_menu 
{
	EXIT,
	NAME ,
	AGE,
	SEX,
	TELE,
	ADDR
};
//修改联系人信息
void ModifyContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}

	//修改联系人
	printf("**********\n");
	printf("#1. 名字 *\n#2. 年龄 *\n#3. 性别 *\n#4. 电话 *\n#5. 地址 *\n#0. 返回 *\n");
	printf("**********\n");
	int input = 0;
	do
	{
		//option_menu();
		printf("请选择你要的信息:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case NAME:
			printf("请输入名字:\n");
			scanf("%s", pc->data[ret].name);
			break;
		case AGE:
			printf("请输入年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			break;
		case SEX:
			printf("请输入性别:\n");
			scanf("%s", pc->data[ret].sex);
			break;
		case TELE:
			printf("请输入电话:\n");
			scanf("%s", pc->data[ret].tele);
			break;
		case ADDR:
			printf("请输入地址:\n");
			scanf("%s", pc->data[ret].addr);
			break;
		case EXIT:
			printf("返回主界面\n");
			return;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}

 

8.对联系人进行排序

int cmp_name(const void* s1,const void* s2) 
{
	return strcmp(((Contact*)s1)->data->name, ((Contact*)s2)->data->name);
}
int cmp_age(const void* s1,const void* s2)
{
	return ((Contact*)s1)->data->age - ((Contact*)s2)->data->age;
}
//排序
void SortContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法排序 !");
		return;
	}
	int input = 0;
	printf("***********\n");
	printf("# 1. 名字 *\n# 2. 年龄 *\n");
	printf("***********\n");
	printf("请选择排序的方法:");
	scanf("%d",&input);
	if (input == 1) 
	{
		//按名字进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_name);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
	else if (input == 2) 
	{
		//按年龄进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_age);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}

 

先展示一下原来数据的信息

 排序1

排序2

 

 9.一键清空所有联系人

 这里是直接调用的初始化通讯录函数

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

四、完整源码

test.c

#define _CRT_SECURE_NO_WARNINGS 
//用于测试
#include "contact.h"
void menu() 
{
	printf("***********************************\n");
	printf("****** 1. add      2. del    ******\n");
	printf("****** 3. search   4. modify ******\n");
	printf("****** 5. show     6. sort   ******\n");
	printf("****** 7. clear    0. exit   ******\n");
	printf("***********************************\n");
}
enum Option 
{
	EXIT,
	ADD,
	DEL,
	SEARCH,
	MODIFY,
	SHOW,
	SORT,
	CLEAR
};
int main() 
{
	int input = 0;
	Contact con;//con 通讯录对象
	InitContact(&con);//初始化通讯录

	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 CLEAR:
			InitContact(&con);//清空通讯录
			break;
		case EXIT:
			printf("退出通讯录!\n");
			break;
		default:
			Sleep(300);
			system("cls");//清屏
			printf("输入错误,请重新输入!\n");
		}
	} while (input);
	return 0;
}

contact.c

#define _CRT_SECURE_NO_WARNINGS 
#include "contact.h"

//用于实现函数

//初始化通讯录
void InitContact(Contact *pc) 
{
	assert(pc);//断言一下,避免空指针
	//将通讯录数据置0
	memset(pc->data,0,sizeof(pc->data)); //这里使用的内存函数,也可以使用for循环进行
	pc->sz = 0;//将记录通讯录信息个数置0
}

//增加联系人
void AddContact(Contact* pc) 
{
	assert(pc);
	//首先应该判断通讯录是否已满
	if (pc->sz == MAX) 
	{
		printf("通讯录已满,无法添加!\n");
		return;
	}

	Sleep(300);
	system("cls");//清屏
	//增加的信息
	//名字 年龄 性别 电话 地址
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n","名字","年龄","性别","电话","地址");
	printf("----------------------------------------------------------------------------\n");


	//增加信息
	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);
	pc->sz++;
	printf("增加成功\n");
	Sleep(1000);
	system("cls");//清屏
}

//显示全部联系人
void ShowContact( const Contact* pc)
{
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通讯录为空!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	for (int i = 0; i < pc -> sz;i++)
	{
		printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].tele,
			pc->data[i].addr);
	}

}
//按名字查找
static int FindByName(Contact* pc,char name[])
{
	assert(pc);
	int i = 0;
	for (i = 0; i < pc->sz;i++)
	{
		if (strcmp(pc->data[i].name,name) == 0) 
		{
			return i;
		}
	}
	return -1;
}

//删除联系人
void DelContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法删除!\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}
	char name[NAME_MAX];
	printf("输入要删除的名字:");
	scanf("%s",&name);
	int ret = FindByName(pc,name);
	if (ret == -1)
	{
		printf("要删除的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		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);
	char name[NAME_MAX];
	Sleep(1000);
	system("cls");//清屏
	printf("请输入要查找人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要查找的联系人不存在\n");
		//Sleep(1000);
		//system("cls");//清屏
		return;
	}
	Sleep(1000);
	system("cls");//清屏
	//显示出查找的联系人
	printf("----------------------------------------------------------------------------\n");
	printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
	printf("----------------------------------------------------------------------------\n");
	printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-18s\n",
			pc->data[ret].name,
			pc->data[ret].age,
			pc->data[ret].sex,
			pc->data[ret].tele,
			pc->data[ret].addr);
	Sleep(3000);
}


enum option_menu 
{
	EXIT,
	NAME ,
	AGE,
	SEX,
	TELE,
	ADDR
};
//修改联系人信息
void ModifyContact(Contact* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改联系人的名字:");
	scanf("%s",name);
	int ret = FindByName(pc, name);
	if (ret == -1)
	{
		printf("要修改的联系人不存在\n");
		Sleep(1000);
		system("cls");//清屏
		return;
	}

	//修改联系人
	printf("**********\n");
	printf("#1. 名字 *\n#2. 年龄 *\n#3. 性别 *\n#4. 电话 *\n#5. 地址 *\n#0. 返回 *\n");
	printf("**********\n");
	int input = 0;
	do
	{
		//option_menu();
		printf("请选择你要的信息:>\n");
		scanf("%d", &input);
		switch (input)
		{
		case NAME:
			printf("请输入名字:\n");
			scanf("%s", pc->data[ret].name);
			break;
		case AGE:
			printf("请输入年龄:\n");
			scanf("%d", &(pc->data[ret].age));
			break;
		case SEX:
			printf("请输入性别:\n");
			scanf("%s", pc->data[ret].sex);
			break;
		case TELE:
			printf("请输入电话:\n");
			scanf("%s", pc->data[ret].tele);
			break;
		case ADDR:
			printf("请输入地址:\n");
			scanf("%s", pc->data[ret].addr);
			break;
		case EXIT:
			printf("返回主界面\n");
			return;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}

	} while (input);

}



int cmp_name(const void* s1,const void* s2) 
{
	return strcmp(((Contact*)s1)->data->name, ((Contact*)s2)->data->name);
}
int cmp_age(const void* s1,const void* s2)
{
	return ((Contact*)s1)->data->age - ((Contact*)s2)->data->age;
}
//排序
void SortContact(Contact* pc) 
{
	assert(pc);
	if (pc->sz == 0) 
	{
		printf("通讯录为空,无法排序 !");
		return;
	}
	int input = 0;
	printf("***********\n");
	printf("# 1. 名字 *\n# 2. 年龄 *\n");
	printf("***********\n");
	printf("请选择排序的方法:");
	scanf("%d",&input);
	if (input == 1) 
	{
		//按名字进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_name);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
	else if (input == 2) 
	{
		//按年龄进行排序
		qsort(pc->data, pc->sz, sizeof(PeoInfo), cmp_age);
		printf("----------------------------------------------------------------------------\n");
		printf("-%-20s\t|%-5s\t|%-5s\t|%-12s\t|%-18s-\n", "名字", "年龄", "性别", "电话", "地址");
		printf("----------------------------------------------------------------------------\n");
		for (int i = 0; i < pc->sz; i++)
		{
			printf("%-20s\t|%-5d\t|%-5s\t|%-12s\t|%-30s\n",
				pc->data[i].name,
				pc->data[i].age,
				pc->data[i].sex,
				pc->data[i].tele,
				pc->data[i].addr);
		}
	}
}

contact.h

#pragma once

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

#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 30

#define MAX 1000 //用于存放通信录信息的条数
//用于声明函数

typedef struct PeoInfo 
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	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);

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

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

相关文章

新版WordPress系统文章自动采集插件/Auto Post pro完美运行版/多线程采集(wp自动采集)

源码介绍&#xff1a; 最新版WordPress系统文章自动采集插件&#xff0c;它是一款帮助用户提供方便快捷的文章自动采集方案的插件。WordPress自动采集插件&#xff0c;让内容采集变得高效便捷。作为Auto Post pro完美运行版&#xff0c;这里分享的是WordPress文章采集插件Auto…

【Vue3】v-model

v-model 基本用法 prop: modelValue 事件&#xff1a;update:modelValue <!-- App.vue --><template><div><h1>我是父组件</h1><div>isShow: {{ isShow }}</div><div><button click"isShow !isShow">开关&…

Java 华为真题-出租车计费

需求 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…

未曾想象!AIGC席卷之下,版权法律界竟手足无措?

人工智能生成内容&#xff08;AIGC&#xff09;的惊人崛起&#xff0c;标志着我们正步入一片前所未有的创作之境。美国纽约&#xff0c;销售员布雷特希克勒&#xff08;Brett Schickler&#xff09;通过与对话机器人ChatGPT的交流&#xff0c;仅用数小时便完成了一本名为《聪明…

KSG互信息估计器的原理详细推导(Kraskov, 2004)

KSG Estimators KSG估计器是Kraskov在2004年提出的互信息估计器&#xff0c;其原文过于简略&#xff0c;我参考大量文献对细节进行了补充。原文位置&#xff1a;[https://arxiv.org/pdf/cond-mat/0305641.pdf] KSG估计的基本方法是首先对互信息进行如下分解 (1) I ( X , Y )…

纽扣电池16CRF1700.15,16CFR1700.20,ANSI C18.3M如何申请?

随着科技的发展&#xff0c;纽扣电池被广泛应用于小型电子产品&#xff0c;如计算器、电子手表、玩具、医疗设备等。由于其体积小&#xff0c;易于拆卸&#xff0c;也造成了儿童误吞的潜在风险。因此&#xff0c;对于纽扣电池的认证和包装&#xff0c;各国均有相应的规定。 在美…

磁盘占用率100% 的优化方案

1.禁用不必要的系统服务 右键点击此电脑&#xff0c;打开管理 打开服务 寻找SysMain 右键属性 》 禁用 》 停止 》 应用 SysMain的作用&#xff1a;当开机后&#xff0c;windows会加载大量的应用程序预加载到内存中&#xff0c;会在后台预加载数据&#xff08;如果是旧版本win…

概率深度学习建模数据不确定性

https://zhuanlan.zhihu.com/p/568912284理解论文 What uncertainties do we need in Bayesian deep learning for computer vision? &#xff08;NeurIPS 2017) [1]中的数据不确定性建模&#xff0c;并给出公式推导。论文[1]指出不确定性uncertainty分为随机不确定性(aleator…

【算法与数据结构】JavaScript实现十大排序算法(一)

文章目录 关于排序算法冒泡排序选择排序插入排序希尔排序归并排序 关于排序算法 稳定排序&#xff1a; 在排序过程中具有相同键值的元素&#xff0c;在排序之后仍然保持相对的原始顺序。意思就是说&#xff0c;现在有两个元素a和b&#xff0c;a排在b的前面&#xff0c;且ab&…

linux通过time命令统计代码编译时间

首先编写一个编译脚本 build.sh 内容如下&#xff1a; 然后执行time sh build.sh 编译完成后输出三个时间 time sh xxx.sh # 会返回3个时间数据 (1) real&#xff1a;从进程 ls 开始执行到完成所耗费的 CPU 总时间。该时间包括 ls 进程执行时实际使用的 CPU 时间&#xff0c;…

影刀自动化采集底层逻辑

hello,大家好&#xff0c;这里是【玩数据的诡途】 接上回 <我的影刀故事> 今天给大家介绍一下整个采集的底层逻辑&#xff0c;包括业务流程自动化也是基于这一套基础逻辑进行展开的&#xff0c;顺便带大家熟悉一下影刀&#xff0c;既然叫影刀系列了&#xff0c;那后续一些…

怕客户跑单?这套上市制造企业都在使的订单管理方案你一定要看看

随着我国工业和科技的不断发展&#xff0c;越来越多的制造业企业出现订单管理问题&#xff0c;比如订单交期延误、缺乏预警能力等等&#xff0c;轻则客户跑单&#xff0c;重则影响品牌声誉。 其实这些问题都是因为制造企业的订单全流程无法打通、订单信息不能可视化、无法实时监…

【问题解决】Android Studio 无法连接手机(荣耀90)无法识别手机usb

问题描述&#xff1a; 使用AS调试的时候遇到一个问题&#xff0c;由于是重装后的电脑&#xff0c;什么都没配置&#xff0c;但是两个旧手机都在安装SDK tools里的Google usb driver后直接连上AS&#xff0c;而我的新手机却死活连不上&#xff0c;查了一下午&#xff0c;啥方法都…

6种最常用的3D点云语义分割AI模型对比

由于增强现实/虚拟现实的发展及其在计算机视觉、自动驾驶和机器人领域的广泛应用&#xff0c;点云学习最近引起了人们的关注。 深度学习已成功用于解决 2D 视觉问题&#xff0c;然而&#xff0c;由于其处理面临独特的挑战&#xff0c;深度学习技术在点云上的使用仍处于起步阶段…

模仿快猫猫App实现的微信小程序,前端页面基本完成

概述 模仿快猫猫App实现的微信小程序&#xff0c;前端页面基本完成&#xff0c;通过微信开发这工具可以直接跑&#xff0c;代码没有问题&#xff0c;首页数据已经模拟&#xff0c;上拉加载等。 详细 通过小程序模拟快猫猫App的前端页面。代码简单易懂&#xff0c;没有什么高…

Mock.js介绍和使用与首页导航栏左侧菜单搭建

1.1 mockjs介绍 Mock.js是一个用于生成随机数据和模拟接口请求的JavaScript库。它可以帮助开发人员在前端开发过程中模拟后端接口的返回数据&#xff0c;以便进行前端页面的开发和测试。 Mock.js有两个重要的特性风靡前端: 数据类型丰富 Mock.js提供了一套简单易用的API&#x…

蓝牙手表出口欧盟CE认证常规测试项目和流程

蓝牙手表是一种带蓝牙功能的手表,是多功能智能通讯手表的一种,通过手表带有的蓝牙功能,可以和蓝牙手机配对连接后使用。现如今这种产品在生活中收到了许多年轻人的欢迎&#xff0c;一般这类产品要出口欧洲则必须要办理CE认证。 蓝牙手表是无线产品&#xff0c;所以需要办理CE-R…

哈希表的模拟实现

unordered_set: 接口函数&#xff1a; 对应的应用&#xff1a; unrodered_map: 对应的函数接口&#xff1a; 对应的应用&#xff1a; 比较set和unordered_set的效率&#xff1a; 可以看到各个方面hashset是优于set的。 哈希表的模拟实现&#xff1a; 哈希表的实现分为两种&…

Python大数据之PySpark(一)SparkBase

文章目录 SparkBase环境基础Spark框架概述Spark环境搭建-Local SparkBase环境基础 Spark学习方法&#xff1a;不断重复&#xff0c;28原则(使用80%时间完成20%重要内容) Spark框架概述 Spark风雨十年s 2012年Hadoop1.x出现&#xff0c;里程碑意义2013年Hadoop2.x出现&#…

html播放视频

文章目录 <embed>标签<object> 标签<video>标签<video>浏览器支持视频格式与浏览器的支持DOM元素提供的方法、属性和事件 兼容多版本的浏览器自定义控制栏 <embed>标签 <embed> 标签的作用是在 HTML 页面中嵌入多媒体元素。 前提&#xf…