没有她的通讯录(C语言实现)

news2024/12/28 22:52:45

在这里插入图片描述

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:夏目的C语言宝藏
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

文章目录

  • 前言
  • 一、通讯录前期准备
    • 1.1菜单函数的实现
    • 1.2菜单的功能
    • 1.3关于联系人结构体的创建
    • 1.4全局变量的定义
  • 二、通讯录的功能实现
    • 2.1初始化通讯录
    • 2.2添加联系人
    • 2.3联系人
    • 2.4删除联系人
    • 2.5查找联系人
    • 2.6修改联系人
    • 2.7对通讯录中联系人的信息进行排序
  • 三、实现通讯录的所有文件展现
    • 3.1通讯录函数绘总
    • 3.2通讯录函数的实现
    • 3.3通讯录测试代码
  • 总结


前言

本篇博客夏目浅石带着大家学习大一期末大作业—通讯录的实现,说真的,完成通讯录之前,夏目已经完成了三子棋游戏,扫雷,猜数字游戏这样类似的大作业类型的任务,所以这里会更加熟练的写出来我完成通讯录的逻辑以及C语言代码实现过程。


一、通讯录前期准备

1.1菜单函数的实现

1.先实现菜单函数,能够实现与用户的交互

代码如下:

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");
}

1.2菜单的功能

1.用switch选择语句do——while循环语句来实现各自的功能

代码如下:

int main()
{
	int input;
	
	//创建通讯录 
	Contact con;
	//初始化通讯录
	InitContact(&con);
	
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				AddContact(&con);
				break;
			case 2:
				DelContact(&con);
				break;
			case 3:
				SearchContact(&con);
				break;
			case 4:
				ModifyContact(&con);
				break;
			case 5:
				ShowContact(&con);
				break;
			case 6:
				SortContact(&con);
			case 0:
				printf("退出通讯录\n");
				break;
			default:
				printf("选择错误\n");
				break;
		}
	} while (input);
	return 0;
}

1.3关于联系人结构体的创建

结构体的创建
第一个结构体peoInfo是是用来存放人的信息,第二个结构体Contact通讯录的信息data是以第一个结构体为类型的数组sz用来记录当前通讯录中实际的人数。

代码如下:

//人的信息
typedef struct peoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}peoInfo;

typedef struct Contact
{
	peoInfo data[MAX];
	int sz;
}Contact;

1.4全局变量的定义

利用宏定义处理

代码如下:

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

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

二、通讯录的功能实现

2.1初始化通讯录

代码如下:

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

2.2添加联系人

代码如下:

//增加联系人
void AddContact(Contact* pc)
{
	if(pc->sz==MAX)
	{
		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].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[pc->sz].tele);
	sz++;
}

2.3联系人

代码如下:

//显示联系人 
void ShowContact(const Contact* pc)
{
	int i=0;
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);
	}
}

2.4删除联系人

先查找,再删除

代码如下:


int FindByName(Contact* pc,char names[])
{
	for(int i=0;i<pc->sz;++i)
	{
		if(strcmp(pc->data[i].name,names)==0)
		{
			return i;
		}	
	}
	return -1;
}

//删除联系人 
void DelContact(Contact* pc)
{
	char names[NAME_MAX]={0};
	
	if(pc->sz==0) 
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s",names);
	
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要删除的人不存在\n");
		return; 
	}
	
	//删除
	int j=0;
	for(j=ret;j<pc->sz-1;++j)
	{
		pc->data[j]=pc->data[j+1];
	}
	pc->sz--;
	printf("删除成功\n");
}

2.5查找联系人

代码如下:


//查找指定联系人 
SearchContact(const Contact* pc)
{
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//打印信息
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);
	}
}

2.6修改联系人

代码如下:


//修改指定联系人 
void ModifyContact(Contact* pc)
{
	//要修改就要先查找到
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//修改,从新录入一遍
	printf("请输入名字:>");
	scanf("%s",pc->data[ret].name);
	printf("请输入年龄:>");
	scanf("%d",&(pc->data[ret].age));
	printf("请输入性别:>");
	scanf("%s",pc->data[ret].sex);
	printf("请输入地址:>");
	scanf("%s",pc->data[ret].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[ret].tele);
	
	printf("修改完成\n");
	
}

2.7对通讯录中联系人的信息进行排序

代码如下:

void SortContact(Contact* pc)
{
	if (pc->count == 0)
	{
		printf("通讯录中没有联系人");
	}
	else
	{													
		for (int i = 0; i < pc->count - 1; i++)
		{
			for (int j = 0; j < pc->count-i-1; j++)
			{
				if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0)
				{
					PeoInfo tmp = pc->data[j];
					pc->data[j] = pc->data[j+1];
					pc->data[j + 1] = tmp;
				}

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

三、实现通讯录的所有文件展现

3.1通讯录函数绘总

#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
//人的信息
typedef struct peoInfo
{
	char name[20];
	int age;
	char sex[5];
	char addr[30];
	char tele[12];
}peoInfo;

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

//初始化 
void InitContact(Contact* pc);

//增加联系人 
void AddContact(Contact* pc);

//显示联系人 
void ShowContact(const Contact* pc);

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

//查找指定联系人 
void Se0archContact(Contact* pc);

//修改指定联系人 
void ModifyContact(Contact* pc);

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

3.2通讯录函数的实现

//函数实现
#define MAX 100
#define MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELE_MAX 12
//初始化 
void InitContact(Contact* pc)
{
	pc->sz=0;
	memset(pc->data,0,sizeof(pc->data));
}

//增加联系人
void AddContact(Contact* pc)
{
	if(pc->sz==MAX)
	{
		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].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[pc->sz].tele);
	sz++;
}

//显示联系人 
void ShowContact(const Contact* pc)
{
	int i=0;
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);
	}
}

int FindByName(Contact* pc,char names[])
{
	for(int i=0;i<pc->sz;++i)
	{
		if(strcmp(pc->data[i].name,names)==0)
		{
			return i;
		}	
	}
	return -1;
}

//删除联系人 
void DelContact(Contact* pc)
{
	char names[NAME_MAX]={0};
	
	if(pc->sz==0) 
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s",names);
	
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要删除的人不存在\n");
		return; 
	}
	
	//删除
	int j=0;
	for(j=ret;j<pc->sz-1;++j)
	{
		pc->data[j]=pc->data[j+1];
	}
	pc->sz--;
	printf("删除成功\n");
}


//查找指定联系人 
SearchContact(const Contact* pc)
{
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//打印信息
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);
	}
}


//修改指定联系人 
void ModifyContact(Contact* pc)
{
	//要修改就要先查找到
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//修改,从新录入一遍
	printf("请输入名字:>");
	scanf("%s",pc->data[ret].name);
	printf("请输入年龄:>");
	scanf("%d",&(pc->data[ret].age));
	printf("请输入性别:>");
	scanf("%s",pc->data[ret].sex);
	printf("请输入地址:>");
	scanf("%s",pc->data[ret].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[ret].tele);
	
	printf("修改完成\n");
	
}

void SortContact(Contact* pc)
{
	if (pc->count == 0)
	{
		printf("通讯录中没有联系人");
	}
	else
	{													
		for (int i = 0; i < pc->count - 1; i++)
		{
			for (int j = 0; j < pc->count-i-1; j++)
			{
				if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0)
				{
					PeoInfo tmp = pc->data[j];
					pc->data[j] = pc->data[j+1];
					pc->data[j + 1] = tmp;
				}

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

3.3通讯录测试代码

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

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

//人的信息
typedef struct peoInfo
{
	char name[NAME_MAX];
	int age;
	char sex[SEX_MAX];
	char addr[ADDR_MAX];
	char tele[TELE_MAX];
}peoInfo;

typedef struct Contact
{
	peoInfo data[MAX];
	int sz;
}Contact;

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

//增加联系人
void AddContact(Contact* pc)
{
	if(pc->sz==MAX)
	{
		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].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[pc->sz].tele);
	pc->sz++;
}

//显示联系人 
void ShowContact(const Contact* pc)
{
	int i=0;
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].addr,pc->data[i].tele);
	}
}

删除联系人 
//void DelContact(Contact* pc)
//{
//	char names[NAME_MAX]={0};
//	
//	if(pc->sz==0) 
//	{
//		printf("通讯录为空,无法删除\n");
//		return;
//	}
//	//删除
//	//找到要删除的人
//	printf("请输入要删除的人的名字:>");
//	scanf("%s",names);
//	int del=0;
//	for(int i=0;i<pc->sz;++i)
//	{
//		if(strcmp(pc->data[i].name,names)==0)
//		{
//			del=i;
//			break;
//		}	
//	}
//	//删除
//	int j=0;
//	for(j=del;j<pc->sz-1;++j)
//	{
//		pc->data[j]=pc->data[j+1];
//	}
//	pc->sz--;
//	printf("删除成功\n");
//}

int FindByName(Contact* pc,char names[])
{
	for(int i=0;i<pc->sz;++i)
	{
		if(strcmp(pc->data[i].name,names)==0)
		{
			return i;
		}	
	}
	return -1;
}

//删除联系人 
void DelContact(Contact* pc)
{
	char names[NAME_MAX]={0};
	
	if(pc->sz==0) 
	{
		printf("通讯录为空,无法删除\n");
		return;
	}
	//删除
	//找到要删除的人
	printf("请输入要删除的人的名字:>");
	scanf("%s",names);
	
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要删除的人不存在\n");
		return; 
	}
	
	//删除
	int j=0;
	for(j=ret;j<pc->sz-1;++j)
	{
		pc->data[j]=pc->data[j+1];
	}
	pc->sz--;
	printf("删除成功\n");
}

//查找指定联系人 
void SearchContact(Contact* pc)
{
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//打印信息
	printf("%-20s\t%4s\t%-5s\t%-20s\t%-12s\n","名字","年龄","性别","地址","电话");
	for(int i=0;i<pc->sz;i++)
	{
		printf("%-20s\t%4d\t%-5s\t%-20s\t%-12s\n",pc->data[ret].name,pc->data[ret].age,pc->data[ret].sex,pc->data[ret].addr,pc->data[ret].tele);
	}
}

//修改指定联系人 
void ModifyContact(Contact* pc)
{
	//要修改就要先查找到
	char names[NAME_MAX];
	printf("请输入要查找人的名字:>");
	scanf("%s",names);
	int ret = FindByName(pc,names);
	
	if(-1==ret)
	{
		printf("要查找的人不存在\n");
		return; 
	}
	//修改,从新录入一遍
	printf("请输入名字:>");
	scanf("%s",pc->data[ret].name);
	printf("请输入年龄:>");
	scanf("%d",&(pc->data[ret].age));
	printf("请输入性别:>");
	scanf("%s",pc->data[ret].sex);
	printf("请输入地址:>");
	scanf("%s",pc->data[ret].addr);
	printf("请输入电话:>");
	scanf("%s",pc->data[ret].tele);
	
	printf("修改完成\n");	
}


void SortContact(Contact* pc)
{
	if (pc->sz == 0)
	{
		printf("通讯录中没有联系人");
	}
	else
	{													
		for (int i = 0; i < pc->sz - 1; i++)
		{
			for (int j = 0; j < pc->sz-i-1; j++)
			{
				if ((strcmp(pc->data[j].name, pc->data[j + 1].name)) > 0)
				{
					peoInfo tmp = pc->data[j];
					pc->data[j] = pc->data[j+1];
					pc->data[j + 1] = tmp;
				}

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

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");
}

int main()
{
	int input;
	
	//创建通讯录 
	Contact con;
	//初始化通讯录
	InitContact(&con);
	
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				AddContact(&con);
				break;
			case 2:
				DelContact(&con);
				break;
			case 3:
				SearchContact(&con);
				break;
			case 4:
				ModifyContact(&con);
				break;
			case 5:
				ShowContact(&con);
				break;
			case 6:
				SortContact(&con);
			case 0:
				printf("退出通讯录\n");
				break;
			default:
				printf("选择错误\n");
				break;
		}
	} while (input);
	return 0;
}

总结

我是夏目浅石,希望和你一起学习进步,刷题无数!!!希望各位大佬能一键三连支持一下博主,hhhh~我们下期见喽

在这里插入图片描述
如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn

原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

👍 点赞,你的认可是我创作的动力! \textcolor{9c81c1}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

⭐️ 收藏,你的青睐是我努力的方向! \textcolor{ed7976}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

✏️ 评论,你的意见是我进步的财富! \textcolor{98c091}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

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

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

相关文章

优劣解距离法TOPSIS——清风老师

TOPSIS法是一种常用的综合评价方法&#xff0c;能充分利用原始数据的信息&#xff0c;其结果能精确地反映各评价方案之间的差距。 基本过程为先将原始数据矩阵统一指标类型&#xff08;一般正向化处理&#xff09;得到正向化的矩阵&#xff0c;再对正向化的矩阵进行标准化处理…

​ICLR 2023 | GReTo:以同异配关系重新审视动态时空图聚合

©PaperWeekly 原创 作者 | 周正阳单位 | 中国科学技术大学论文简介动态时空图数据结构在多种不同的学科中均普遍存在&#xff0c;如交通流、空气质量观测、社交网络等&#xff0c;这些观测往往会随着时间而变化&#xff0c;进而引发节点间关联的动态时变特性。本文的主要…

springboot学习(八十) springboot中使用Log4j2记录分布式链路日志

在分布式环境中一般统一收集日志&#xff0c;但是在并发大时不好定位问题&#xff0c;大量的日志导致无法找出日志的链路关系。 可以为每一个请求分配一个traceId&#xff0c;记录日志时&#xff0c;记录此traceId&#xff0c;从网关开始&#xff0c;依次将traceId记录到请求头…

【C#】[带格式的字符串] 复合格式设置字符串与使用 $ 的字符串内插 | 如何格式化输出字符串

复合格式输出 string name "Fred"; String.Format("Name {0}, hours {1:hh}", name, DateTime.Now);通过指定相同的参数说明符&#xff0c;多个格式项可以引用对象列表中的同一个元素。 例如&#xff0c;通过指定“0x{0:X} {0:E} {0:N}”等复合格式字符…

凸优化学习:PART3凸优化问题(持续更新)

凸优化问题 凸优化问题的广义定义&#xff1a; 目标函数为凸函数约束集合为凸集 一、优化问题 基本用语 一般优化问题的描述&#xff1a; minimize⁡f0(x)subject to fi(x)⩽0,i1,⋯,mhi(x)0,i1,⋯,p(1)\begin{array}{ll} \operatorname{minimize} & f_0(x) \\ \text { s…

Centos7 安装Hadoop3 单机版本(伪分布式版本)

环境版本CentOS-7JDK-8Hadoop-3CentOS-7 服务器设置设置静态IP查看IP配置在/etc/sysconfig/network-scripts/目录下的ifcfg-ens33文件中。[rootHadoop3-master sbin]# cd /etc/sysconfig/network-scripts [rootHadoop3-master network-scripts]# ll 总用量 232 -rw-r--r--. 1 r…

云计算培训靠谱吗?

怎么算靠谱的培训呢&#xff1f; 举个例子&#xff1a; 我想参加云计算培训找个工作&#xff0c;机构满足了我的要求&#xff0c;有工作了&#xff0c;但是不是做云计算相关的。 小强也参加了云计算培训&#xff0c;想学好云计算成为技术大牛&#xff0c;最后专业学得普普通…

java环境配置

java环境配置步骤下载jdk安装jdk配置环境变量通过控制台命令验证配置是否成功大功告成安装教程&#xff1a; https://blog.csdn.net/m0_37220730/article/details/103585266 下载jdk 若不理解JDK/JRE/JVM的关系&#xff0c;可以点此查看初识Java&#xff08;概念、版本迭代、…

DIN解读

传统的Embedding&MLP架构将用户特征编码进一个固定长度的向量。当推出一个商品时&#xff0c;该架构无法捕捉用户丰富的历史行为中的多样性兴趣与该商品的关联。阿里妈妈团队提出了DIN网络进行改进&#xff0c;主要有如下两点创新&#xff1a; 引入注意力机制来捕捉历史行为…

【Linux下代码调试工具】gdb 的基本使用

gdb的基本使用前言准备gdb工具调试须知gdb的基本指令进入调试退出调试显示代码及函数内容运行程序给程序打断点查看断点位置断点使能取消断点逐过程调试逐语句调试运行到下一个断点查看变量的值变量值常显示取消变量值常显示前言 在主页前面的几篇文章已经介绍了Vim编辑器及Ma…

C语言(内联函数(C99)和_Noreturn)

1.内联函数 通常&#xff0c;函数调用都有一定的开销&#xff0c;因为函数的调用过程包含建立调用&#xff0c;传递参数&#xff0c;跳转到函数代码并返回。而使用宏是代码内联&#xff0c;可以避开这样的开销。 内联函数&#xff1a;使用内联diamagnetic代替函数调用。把函数…

【MySQL】 事务

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…

opencv窗口的创建/显示/销毁

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

Docker-harbor私有仓库

一、Harbor概述 1、Harbor的概念 • Harbor是VMware公司开源的企业级Docker Registry项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的Docker Registry服务 • Harbor以 Docker 公司开源的Registry 为基础&#xff0c;提供了图形管理UI、基于角色的访问控制(Role Base…

力扣SQL刷题9

目录1107. 每日新用户统计-勉强579. 查询员工的累计薪水 - 各种绕易错点&#xff1a;range与rows区别615. 平均工资&#xff1a;部门与公司比较with建临时表注意点1107. 每日新用户统计-勉强 题型&#xff1a;每个日期中首次登录人数 解答&#xff1a;从原表中用按用户分组后m…

嵌入式开发----示波器入门

示波器入门前言一、示波器介绍关键指标工作原理二、功能按钮介绍三、一键入门四、 典型应用场景校准捕捉测试总线通讯总结前言 对于嵌入式工程师来说&#xff0c;示波器的使用极为重要&#xff0c;他就像是“电子工程师的眼睛”&#xff0c;把被测信号的实际波形显示在屏幕上&…

Java特性之设计模式【桥接模式】

一、桥接模式 概述 桥接&#xff08;Bridge&#xff09;是用于把抽象化与实现化解耦&#xff0c;使得二者可以独立变化。这种类型的设计模式属于结构型模式&#xff0c;它通过提供抽象化和实现化之间的桥接结构&#xff0c;来实现二者的解耦 这种模式涉及到一个作为桥接的接口…

67. 二进制求和

文章目录题目描述竖式模拟转换为十进制计算题目描述 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a “11”, b “1” 输出&#xff1a;“100” 示例 2&#xff1a; 输入&#xff1a;a “1010”, b “1011” …

“白学”了十几年?这两年才感悟出的高效学习方法

作者&#xff1a;元青 微信公众号 「技乐书香」 引言 虽然从小学开始算起&#xff0c;一直到我现在硕士快毕业&#xff0c;已经学习了接近十九年了&#xff0c;但是只有最近两年算得上真正的在"学习"&#xff0c;之前的十七年都没有明白也没有认可学习的意义&#…

网络安全实验室7.综合关

7.综合关 1.渗透测试第一期 url&#xff1a;http://lab1.xseclab.com/base14_2d7aae2ae829d1d5f45c59e8046bbc54/ 进入忘记密码页面&#xff0c;右键查看源码&#xff0c;发现一个手机号 解题思路&#xff1a;通过给admin用户绑定13388758688手机号码&#xff0c;然后再进行…