实现通讯录(C语言)

news2024/11/28 12:34:06

功能实现

实现步骤:

创建通讯录

初始化通讯录

打印菜单

实现选择功能

实现添加功能 

实现删除功能

实现查找功能

实现修改功能

实现清空功能

实现排序功能

实现查询所有联系人信息功能

通讯录总代码

创建通讯录

1、创建成员信息结构体

我们用结构体来封装一个联系人的信息,信息包括:姓名、性别、年龄、电话号,而这个结构体成员也就要包含: 姓名、性别、年龄、电话号四种变量,姓名,性别,电话号 都用字符串封装,年龄,用整型封装

2、创建封装成员信息和个数的结构体

为了可以存放更多联系人,我们创建一个成员信息结构体数组,成员信息结构体数组,为了统计存入联系人的数量,我们创建一个整型变量,将结构体数组跟整型变量,封装在一个结构体中,以方便后续使用!,再创建一个结构体变量,以便后续通过变量访问通讯录

代码如下:

#define NAME_MAX 11
#define EAX_MAX 3
#define PHONE_MAX 12
#define MAX 1000

//创建通讯录内容
typedef struct SS 
{
	char name[NAME_MAX];//名字
	char eax[EAX_MAX];//性别
	int age;//年龄
	char phone[PHONE_MAX];//电话
}SS;

typedef struct contict 
{
	SS data[1000];//存放联系人信息
	int sz;//存放联系人的个数
}contict;

//创建结构体变量
contict con;//通过变量后续访问通讯录

初始化通讯录

创建好通讯录之后

我们对它进行初始化操作,将其信息全部初始化为0,我们用一个函数来实现

代码如下:

//参数是结构体变量con的地址

//初始化通讯录
void init_contict(contict* pc)
{
	assert(pc);
	//用memset函数初始化
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

打印菜单

创建一个简易菜单,供用户选择,用一个函数来封装菜单

代码如下:

//菜单
void nuem(void)
{
	printf("********************************\n");
	printf("****** 1、add    2、del   ******\n");
	printf("****** 3、sel    4、change *****\n");
	printf("****** 5、clear  6、sort   *****\n");
	printf("****** 7、show   0、exit   *****\n");
	printf("********************************\n");
}

实现选择功能

对于功能的选择,我们用do while里面嵌套switch来实现,选择里面的函数功能我们往下慢慢一一实现,具体看代码 一目了然

代码如下:

int main()
{
    	int input = 0;
	do 
	{
		//菜单
		nuem();
		printf("请选择-> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			add_contict(&con);//添加信息
			break;
		case 2:
			del_contict(&con);//删除信息
			break;
		case 3:
			sel_contict(&con);//查询指定联系人信息
			break;
		case 4:
			change_contict(&con);//修改指定联系人信息
			break;
		case 5:
			clear_contict(&con);//清空联系人信息
			break;
		case 6:
			sort_contict(&con);//排序联系人信息
			break;
		case 7:
			show_contict(&con);//查询所有数据
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("选择项不存在,重新选择\n");
			break;
		}
	} while (input);

    return 0;
}

实现添加功能 

添加功能就是在通讯录里面添加联系人的信息,就是在我们所创建的结构体数组里面输入数据,每输入一个人的信息,我们都让整型变量sz +1,sz就是用来表示联系人的个数,同时sz也可以当做结构体数组的下标,我们用一个函数来实现添加功能

代码如下:

//添加一个联系人信息让sz++一次
//1、增加信息
void add_contict(contict* pc)
{
	assert(pc);
	printf("请输入姓名-> ");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别-> ");
	scanf("%s", pc->data[pc->sz].eax);
	printf("请输入年龄-> ");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话-> ");
	scanf("%s", pc->data[pc->sz].phone);

	pc->sz++;
}

实现删除功能

删除一个联系人的信息,要删除此联系人,我们得先找到该联系人的位置,给定字符数组,输入一个名字,然后遍历结构体数组,将输入的名字跟存入的所有联系人的名字进行比较,通过其名字,找到该联系人在结构体数组中的位置找到下标,然后从这个下标位置开始,让她后面的信息往前移动,并且让其元素个数sz-1,用一个函数来实现此功能

移动方法图解:

 

因为后续还会判断联系人是否存在,所以我们用一个函数来封装,判断该联系人名字是否存在于结构体数组中,这一功能!

代码如下:

//判断联系人是否存在
int ment(char* name,contict* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}



//2、删除信息
void del_contict(contict* pc)
{
	char name[NAME_MAX];
	printf("请输入要删除人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}

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

实现查找功能

要查找指定联系人的信息,跟删除一样的原理,创建一个字符数组,输入一个名字,遍历结构体数组,判断该联系人是否存在,找到与输入名字相同名字的联系人,并将这个联系人的信息打印出来

代码如下:

//判断联系人是否存在
int ment(char* name,contict* 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 sel_contict(contict* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查询人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("查无此人\n");
		return;
	}

	//查询联系人
	printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");
	printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name,
		                              pc->data[pos].eax,
		                              pc->data[pos].age,
		                              pc->data[pos].phone);
}

实现修改功能

跟查找联系人的思路一样,创建一个字符数组,输入要修改联系人的名字,并遍历结构体数组,判断该名字的联系人是否存在,若存在 对该联系人的信息重新输入值,就修改成功

代码如下:

//判断联系人是否存在
int ment(char* name,contict* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}


//4、修改指定联系人信息
void change_contict(contict* pc) 
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查询人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("此人不存在\n");
		return;
	}
	//修改
	printf("请输入姓名-> ");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别-> ");
	scanf("%s", pc->data[pos].eax);
	printf("请输入年龄-> ");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入电话-> ");
	scanf("%s", pc->data[pos].phone);
	printf("修改成功\n");
}

实现清空功能

清空就是将所有的联系人信息都清空,其实将所有的联系人都清空,我们只要重新初始化一下封装联系人信息的数组跟记录联系人个数的整型变量就行了,我们上面已经创建了初始化函数,只要在调用一次这个函数就行,在清空函数内部调用初始化函数即可

代码如下:

//初始化通讯录
void init_contict(contict* pc)
{
	assert(pc);
	//用memset函数初始化
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//5、清空联系人信息
void clear_contict(contict* pc)
{
	assert(pc);
	init_contict(pc);
	printf("清空成功\n");
}

实现排序功能

要排序联系人的信息,其实本质上就是排序结构体,结构体可以按照他的成员变量来排序,我们在这给用户提供两种排序方式,1、用姓名排序,2、用年龄排序,可以升序,也可以降序,这个是你自己选择的,用姓名排序就是比较两个名字字符串的大小,用年龄排序就是比较两个整型数的大小,这里的排序,我们使用 qsort函数来排序,(注:若是看不懂这一块,点我主页,指针进阶文章里面有目录,有详细的qsort函数的介绍),用一个函数来封装排序功能

代码如下:


//按照姓名排序
int con_name(void* e1, void* e2)
{
	//升序排序
	return strcmp(((contict*)e1)->data->name , ((contict*)e2)->data->name);

	//降序排序
	//return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name);
}

//按照年龄排序
int con_age(void* e1, void* e2)
{
	//升序排序
	return ((contict*)e1)->data->age - ((contict*)e2)->data->age;

	//降序排序
	//return ((contict*)e2)->data->age - ((contict*)e1)->data->age;

}


//6、排序联系人信息
void sort_contict(contict* pc)
{
	int n = 0;
	do {
		printf("*************************\n");
		printf("***** 1、按姓名排序  ****\n");
		printf("***** 2、按年龄排序  ****\n");
		printf("***** 0、退出不排序  ****\n");
		printf("*************************\n");
		printf("请选择排序方式->  ");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);
			printf("按照姓名排序成功\n");
			goto name;
			break;
		case 2:
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age);
			printf("按照年龄排序成功\n");
			goto age;
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("选择排序方式不存在,重新选择\n");
			break;
		}
	} while (n);
name:
	return;
age:
	return;
}

实现查询所有联系人信息功能

查询所有联系人,就是将结构体数组里面存放的所有联系人的信息打印出来,至于具体有多少位联系人信息,其实就是sz位,一开始我们就用sz来记录联系人的个数,遍历这个结构体数组将每个元素的值都打印出来即可,我们用函数封装这一功能

代码如下:


//7、查询所有信息
void show_contict(contict* pc) 
{
	if (pc->sz == 0)
	{
		printf("联系人列表为空\n");
		return;
	}
	printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name,
										  pc->data[i].eax,
										  pc->data[i].age,
										  pc->data[i].phone);
	}
}

通讯录总代码

一个简易版通讯录总代码实现:

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

#define NAME_MAX 11
#define EAX_MAX 3
#define PHONE_MAX 12
#define MAX 1000

//创建通讯录内容
typedef struct SS
{
	char name[NAME_MAX];//名字
	char eax[EAX_MAX];//性别
	int age;//年龄
	char phone[PHONE_MAX];//电话
}SS;

typedef struct contict
{
	SS data[1000];//存放联系人信息
	int sz;//存放联系人的个数
}contict;

//创建结构体变量
contict con;//通过变量后续访问通讯录

//菜单
void nuem(void)
{
	printf("********************************\n");
	printf("****** 1、add    2、del   ******\n");
	printf("****** 3、sel    4、change *****\n");
	printf("****** 5、clear  6、sort   *****\n");
	printf("****** 7、show   0、exit   *****\n");
	printf("********************************\n");
}

//初始化通讯录
void init_contict(contict* pc)
{
	assert(pc);
	//用memset函数初始化
	memset(pc->data, 0, sizeof(pc->data));
	pc->sz = 0;
}

//判断联系人是否存在
int ment(char* name, contict* pc)
{
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		if (strcmp(name, pc->data[i].name) == 0)
		{
			return i;
		}
	}
	return -1;
}

//1、增加信息
void add_contict(contict* pc)
{
	assert(pc);
	printf("请输入姓名-> ");
	scanf("%s", pc->data[pc->sz].name);
	printf("请输入性别-> ");
	scanf("%s", pc->data[pc->sz].eax);
	printf("请输入年龄-> ");
	scanf("%d", &(pc->data[pc->sz].age));
	printf("请输入电话-> ");
	scanf("%s", pc->data[pc->sz].phone);
	pc->sz++;
}

//2、删除信息
void del_contict(contict* pc)
{
	char name[NAME_MAX];
	printf("请输入要删除人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("联系人不存在\n");
		return;
	}

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

//3、查询指定联系人信息
void sel_contict(contict* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要查询人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("查无此人\n");
		return;
	}

	//查询联系人
	printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");
	printf("%-10s %-2s %-2d %-11s\n", pc->data[pos].name,
		pc->data[pos].eax,
		pc->data[pos].age,
		pc->data[pos].phone);
}

//4、修改指定联系人信息
void change_contict(contict* pc)
{
	assert(pc);
	char name[NAME_MAX];
	printf("请输入要修改人的姓名-> ");
	scanf("%s", name);

	//判断联系人是否存在
	int pos = ment(name, pc);
	if (pos == -1)
	{
		printf("此人不存在\n");
		return;
	}
	//修改
	printf("请输入姓名-> ");
	scanf("%s", pc->data[pos].name);
	printf("请输入性别-> ");
	scanf("%s", pc->data[pos].eax);
	printf("请输入年龄-> ");
	scanf("%d", &(pc->data[pos].age));
	printf("请输入电话-> ");
	scanf("%s", pc->data[pos].phone);
	printf("修改成功\n");
}

//5、清空联系人信息
void clear_contict(contict* pc)
{
	assert(pc);
	init_contict(pc);
	printf("清空成功\n");
}

//按照姓名排序
int con_name(void* e1, void* e2)
{
	//升序排序
	return strcmp(((contict*)e1)->data->name, ((contict*)e2)->data->name);

	//降序排序
	//return strcmp(((contict*)e2)->data->name ,((contict*)e1)->data->name);
}

//按照年龄排序
int con_age(void* e1, void* e2)
{
	//升序排序
	return ((contict*)e1)->data->age - ((contict*)e2)->data->age;

	//降序排序
	//return ((contict*)e2)->data->age - ((contict*)e1)->data->age;

}

//6、排序联系人信息
void sort_contict(contict* pc)
{
	int n = 0;
	do {
		printf("*************************\n");
		printf("***** 1、按姓名排序  ****\n");
		printf("***** 2、按年龄排序  ****\n");
		printf("***** 0、退出不排序  ****\n");
		printf("*************************\n");
		printf("请选择排序方式->  ");
		scanf("%d", &n);
		switch (n)
		{
		case 1:
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_name);
			printf("按照姓名排序成功\n");
			goto name;
			break;
		case 2:
			qsort(pc->data, pc->sz, sizeof(pc->data[0]), con_age);
			printf("按照年龄排序成功\n");
			goto age;
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("选择排序方式不存在,重新选择\n");
			break;
		}
	} while (n);
name:
	return;
age:
	return;
}


//7、查询所有信息
void show_contict(contict* pc)
{
	if (pc->sz == 0)
	{
		printf("联系人列表为空\n");
		return;
	}
	printf("%-10s %-2s %-2s %-11s\n", "姓名", "性别", "年龄", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-10s %-2s %-2d %-11s\n", pc->data[i].name,
			pc->data[i].eax,
			pc->data[i].age,
			pc->data[i].phone);
	}
}

void test_contict(void)
{
	//初始化通讯录
	init_contict(&con);

	int input = 0;
	do
	{
		//菜单
		nuem();
		printf("请选择-> ");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			add_contict(&con);//添加信息
			break;
		case 2:
			del_contict(&con);//删除信息
			break;
		case 3:
			sel_contict(&con);//查询指定联系人信息
			break;
		case 4:
			change_contict(&con);//修改指定联系人信息
			break;
		case 5:
			clear_contict(&con);//清空联系人信息
			break;
		case 6:
			sort_contict(&con);//排序联系人信息
			break;
		case 7:
			show_contict(&con);//查询所有数据
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("选择项不存在,重新选择\n");
			break;
		}
	} while (input);
}

int main()
{
	//测试通讯录
	test_contict();
	return 0;
}

 

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

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

相关文章

【系列04】数组 多维数组 冒泡排序 稀疏数组[有目录]

数组声明和创建 变量类型 变量名称 变量的值 声明数组 int []nums;//定义//上面是首选 /*也可以 int nums2[];*/下面这种写法是为了迎合c与c用户的喜爱,更推荐用上面的定义 方式 创建数组 numsnew int[10];定义数组计算数组的和 package com.SunAo.array; //变量类型 变量名称…

TypeScript 数据模型层编程的最佳实践

虽然 TypeScript 主要用于客户端&#xff0c;而数据模型的设计主要是服务端来做的。 但是要写出优雅的代码&#xff0c;也还是有不少讲究的。 让我们从一个简单的我的文章列表 api 返回的数据开始&#xff0c;返回的文章列表的信息如下&#xff1a; {"id": 2018,&qu…

原生PHP及thinkphp6接入阿里云短信

申请accesskey获取到Accesskey ID和Accesskey Secret保存下来&#xff0c;一会要用到添加测试手机号&#xff0c;在接口测试能否正常发送下载阿里云短信sdk&#xff0c;使用composer下载&#xff0c;没有安装请先安装安装可以安装到任意文件夹下&#xff0c;后面代码写好后&…

TDSQL的安装教程(低配体验)

一、了解TDSQL tdsql腾讯云文档 TDSQL-C MySQL 版&#xff08;TDSQL-C for MySQL&#xff09;是腾讯云自研的新一代云原生关系型数据库。融合了传统数据库、云计算与新硬件技术的优势&#xff0c;为用户提供具备极致弹性、高性能、海量存储、安全可靠的数据库服务。TDSQL-C My…

AtCoder Beginner Contest 285解题报告

A - Edge Checker 2 Problem Statement Determine if there is a segment that directly connects the points numbered a and b in the figure below. Constraints 1≤a<b≤15a and b are integers.Input The input is given from Standard Input in the following for…

用SpectorJS调试WebGL应用

随着使用 WebGL 构建的体验不断涌现&#xff0c;以及 WebVR/AR 领域的所有改进&#xff0c;拥有高效的调试工具变得至关重要。 无论你是刚刚起步还是已经是使用 WebGL 开发 3D 应用程序的经验丰富的开发人员&#xff0c;都可能知道工具对于生产力的重要性。 在寻找此类工具时&…

【开发环境】JRE 裁剪 ① ( 裁剪 bin 目录下的 dll 动态库文件 )

文章目录一、JRE 裁剪二、裁剪 bin 目录下的 dll 动态库文件参考博客 : 精简jre1.8精简jre步骤裁剪JRE(嵌入式设备的java环境移植) 资源下载地址 : https://download.csdn.net/download/han1202012/87388400 一、JRE 裁剪 在 【IntelliJ IDEA】使用 exe4j 生成 jre jar 可执…

华为MPLS跨域A、B方案实验配置

目录 MPLS域内配置 MPLS-AS100域内配置 MPLS-AS200域内配置 域间方式A配置 ASBR4和ASBR5配置实例 ASBR之间建立基于实例的EBGP邻居关系 域间方式B配置 ASBR相连接口开启MPLS ASBR之间建立MP-BGP的EBGP邻居 配置取消RT值检测 配置传递路由时更改下一跳为自身 MPLS域内…

程序员必知必会 QPS TPS、URI URL、PV UV GMV

一、QPS和 TPS QPS&#xff1a;Queries Per Second&#xff0c;意思是“每秒查询数”&#xff0c;是一台服务器每秒能够响应的查询次数&#xff0c;是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 即最大吞吐能力。 TPS&#xff1a;TransactionsPerSecond&…

springboot整合log4j2

导入依赖 <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency><!--log4j2--> <dependency><groupId>org.apache.logging.log4j</groupId>&…

Spring Boot(五十三):SpringBoot Actuator之实现

1 场景介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;在线上时通常会遇到下面一些问题&#xff0c;比如&#xff1a; 1. 如何知道哪些服务除了问题&#xff0c;如何快速定位&#xff1f; (健康状况&#xff09; 2. 如何统一监控各个微服务的性能指标…

JAVA会员营销系统源码+数据库,实体店铺会员管理和营销系统源码,采用SpringBoot + Mysql+Mybatis

会员营销系统介绍 介绍 fuint会员营销系统是一套开源的实体店铺会员管理和营销系统。系统基于前后端分离的架构&#xff0c;后端采用Java SpringBoot Mysql&#xff0c;前端基于当前流行的Uniapp&#xff0c;Element UI&#xff0c;支持小程序、h5。主要功能包含电子优惠券、…

冰蝎V4.0流量分析到攻防检测

0x01 前言 最近在改写 yso&#xff0c;觉得自己基础太差了&#xff0c;想先阅读一下 sqlmap、冰蝎以及一些其他工具的开发思路。文章可能写的不够严谨&#xff0c;有不对的地方还请师傅们多多指出。 0x02 环境搭建 这里我看的是 MountCloud 师傅所二开的冰蝎项目&#xff0c…

【关于Linux中----进程间通信方式之system V共享内存】

文章目录一、共享内存示意图二、学习共享内存前的准备工作三、共享内存函数3.1创建共享内存&#xff1a;3.2控制共享内存&#xff1a;3.3挂接和去挂接&#xff1a;一、共享内存示意图 上一篇文章中讲述的是管道的通信方式&#xff0c;而这里要讲的是操作系统层面专门为进程间通…

编译原理-链接实例分析

gcc-arm-none-eabi 工具链功能1.arm-none-eabi-gcc &#xff1a;c语言编译器&#xff0c;可以将.c文件编译为.o的执行文件2.arm-none-eabi-g &#xff1a;c编译器&#xff0c;可以将.cpp文件编译成.o的执行文件3.arm-none-eabi-ld : 链接器&#xff0c;链接所有的.o文件生成可执…

CDH6.3生产环境中禁用Kerberos

在集群启用Kerberos后&#xff0c;会对现有环境的部分代码做改造&#xff0c;有些人觉得使用起来不方便&#xff0c;想取消Kerberos。本篇文章主要介绍如何禁用CDH集群的Kerberos及禁用后对各组件服务的测试。修改了网上相关文档的一些缺陷&#xff0c;在生产环境中实际使用过通…

GIT ---- GitHub配置SSH Key的完整步骤

1. 配置 SSH Key 由于提交代码每次输入用户名和密码&#xff0c;很繁琐&#xff0c;所以直接配置 SSH Key&#xff0c;直接自动验证&#xff0c;减少提交代码的操作步骤。 2. 查看配置命令 git config --list 查看当前Git环境所有配置&#xff0c;还可以配置一些命令别名之类…

这一年,熬过许多夜,也有些许收获 | 2022年度总结

弹指一挥间&#xff0c;时间如白驹过隙。光阴似箭&#xff0c;日月如梭&#xff0c;时间如闪电&#xff0c;转瞬即逝。回望来时路&#xff0c;不觉潸然泪下… 一说到年终总结&#xff0c;好像都离不开这样煽情的开场白。但不可否认的是&#xff0c;时间确实过得很快&#xff0…

学习记录661@项目管理之项目立项管理

什么是项目立项管理 项目立项管理关注的重点在于是否要启动一个项目&#xff0c;并为其提供相应的预算支持具体来说&#xff0c;项目立项管理包括以下 5 个典型环节&#xff0c;分别是 项目建议项目可行性分析项目审批项目招投标项目合同谈判与签订 需要说明的是&#xff0c…

两大技巧教你轻松应对IB数学

同学想要在IB数学科取得好成绩&#xff0c;可以从两个方面来着手。 1.复习技巧第一个是复习技巧。这方面&#xff0c;同学要清楚知道自己读的课程&#xff0c;它的教学大纲&#xff08;Syllabus&#xff09;要求是什么&#xff0c;还有它背后想要同学达到什么样的目标。 IB数学…