c语言通讯录——静态版本(带详细文字解释)

c语言通讯录——静态版本(带详细文字解释)_第1张图片

1.定义用于存储一个人信息的结构体

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

定义了一个名为 “PeoInfo” 的结构体(struct)类型,用于存储有关一个人的信息。
该结构体包含以下字段:

“name” - 一个字符数组,最多可以存储 NAME_MAX 个字符,表示这个人的姓名。
“age” - 一个整数,表示这个人的年龄。
“sex” - 一个字符数组,最多可以存储 SEX_MAX 个字符,表示这个人的性别。
“addr” - 一个字符数组,最多可以存储 ADDR_MAX 个字符,表示这个人的地址。
“tele” - 一个字符数组,最多可以存储 TELE_MAX 个字符,表示这个人的电话号码。
这个结构体可以用于存储一个人的信息,并且可以作为需要处理人员数据的函数的参数或返回类型。通常使用 typedef 创建结构体的别名,以允许更简洁的代码。

2.定义用于存储信息的通讯录的结构体

typedef struct Contact
{
	PeoInfo data[MAX];//存放人的信息
	int sz;//当前已经放的信息
}Contact;

这段代码定义了一个名为 “Contact” 的结构体(struct)类型,用于存储联系人的信息。该结构体包含以下字段:

“data” - 一个 PeoInfo 类型的数组,最多可以存储 MAX 个联系人的信息,其中 PeoInfo 是另一个结构体类型,用于存储单个联系人的信息。
“sz” - 一个整数,表示当前已经存储的联系人信息的数量。
可以将 “Contact” 结构体视为一个联系人列表,其中 “data” 数组存储了所有联系人的信息,而 “sz” 字段表示当前列表中已经存储的联系人数量。

这个结构体可以用于创建一个通讯录,其中每个联系人都有一个 PeoInfo 类型的信息。可以将 Contact 结构体作为参数或返回类型传递给需要处理联系人信息的函数。

3.初始化通讯录

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

这段代码定义了一个名为 “InitContact” 的函数,用于初始化一个 Contact 结构体类型的变量,即初始化一个通讯录。

该函数接受一个指向 Contact 类型的指针作为参数,表示要初始化的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先将 Contact 结构体中的 “sz” 字段设置为 0,表示当前通讯录中没有联系人信息。然后使用 memset 函数将 “data” 数组中的所有元素都设置为 0,以确保通讯录中所有联系人的初始信息都为空。

这个函数可以用于在创建一个新的通讯录时初始化通讯录。

4.创建主函数框架

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://排序联系人
			SortContactName(&con);
			break;
		case 0:
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (input);

这段代码包含了一个主函数的框架,用于管理一个通讯录的信息。主函数的具体实现可能包括以下步骤:

创建一个 Contact 类型的变量 con 作为通讯录。
调用 InitContact 函数初始化通讯录。
使用 do-while 循环显示菜单,要求用户输入数字进行操作。
根据用户输入的数字,调用相应的函数进行操作
如果用户输入1,执行函数AddContact,添加联系人
如果用户输入2,执行函数DelContact,删除联系人
如果用户输入3,执行函数SearchContact,查找联系人
如果用户输入4,执行函数ModifyContact,更改联系人
如果用户输入5,执行函数ShowContact,显示联系人
如果用户输入6,执行函数SortContactName,排序联系人
如果用户输入了 0,则退出程序。
输入用户输入“其他”,显示“输入错误,重新输入”。

5.创建显示通讯录菜单的函数

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

这段代码定义了一个名为 “menu” 的函数,用于显示通讯录操作的菜单,其中包括以下选项:
1.add——添加联系人
2.del——删除联系人
3.search——查找联系人
4.modify ——更改联系人
5.show——显示联系人
6.sort——排序联系人
0.exit ——退出程序

6.创建添加联系人的函数

//添加联系人
void AddContact(Contact* pc)
{
	assert(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++;
}

这段代码定义了一个名为 “AddContact” 的函数,用于向通讯录中添加一个新联系人。

该函数接受一个指向 Contact 类型的指针作为参数,表示要添加联系人的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先检查通讯录中是否还有空间来添加新的联系人信息,如果通讯录已满,则打印一条消息并返回函数。否则,提示用户输入新联系人的信息,包括姓名、年龄、性别、地址和电话号码,并将这些信息存储在通讯录中的一个 PeoInfo 类型的结构体中。最后,将通讯录中已经存储的联系人数量加 1。

这个函数可以用于向通讯录中添加新的联系人信息。

7.创建删除联系人的函数

//删除指定联系人的信息
void DelContact(Contact* pc)
{
	char name[NAME_MAX] = { 0 };
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通信录为空,无法删除\n");
		return;
	}
	//删除
	printf("请输入要删除人的名字:\n");
	scanf("%s", name);
	int ret=FindByName(pc,name);
	if (-1==ret)
	{
		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");
}

这段代码定义了一个名为 “DelContact” 的函数,用于根据人名删除通讯录中的联系人信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要删除联系人的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先检查通讯录中是否有联系人信息,如果通讯录为空,则打印一条消息并返回函数。否则,提示用户输入要删除的联系人的姓名,并调用 FindByName 函数查找通讯录中是否存在该联系人。如果不存在,则打印一条消息并返回函数。如果存在,则将该联系人信息从通讯录中删除,即将该联系人信息的后面的所有联系人信息向前移动一个位置,并将通讯录中已经存储的联系人数量减 1。

这个函数可以用于根据人名删除通讯录中的联系人信息。

8.创建查找指定联系人的函数

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

这段代码定义了一个名为 “SearchContact” 的函数,用于根据人名查找通讯录中的联系人信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要查找联系人的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,提示用户输入要查找的联系人的姓名,并调用 FindByName 函数查找通讯录中是否存在该联系人。如果不存在,则打印一条消息并返回函数。如果存在,则打印该联系人的信息,包括姓名、年龄、性别、地址和电话号码。

这个函数可以用于根据人名查找通讯录中的联系人信息。

9.创建修改指定联系人信息的函数

//修改指定联系人的信息
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	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].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("修改完成\n");
}

这段代码定义了一个名为 “ModifyContact” 的函数,用于根据人名修改通讯录中的联系人信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要修改联系人的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,提示用户输入要修改的联系人的姓名,并调用 FindByName 函数查找通讯录中是否存在该联系人。如果不存在,则打印一条消息并返回函数。如果存在,则提示用户输入新的联系人信息,包括姓名、年龄、性别、地址和电话号码,并将这些信息存储在通讯录中该联系人的 PeoInfo 类型结构体中。

这个函数可以用于根据人名修改通讯录中的联系人信息。

10.创建显示通讯录信息的函数

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

这段代码定义了一个名为 “ShowContact” 的函数,用于显示通讯录中所有联系人的信息。

该函数接受一个指向 Contact 类型的指针作为参数,表示要显示联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,首先打印表头,包括姓名、年龄、性别、地址和电话号码。然后使用循环遍历通讯录中所有的联系人信息,并打印出每个联系人的信息。

这个函数可以用于显示通讯录中所有联系人的信息。

11.创建查找对应联系人位置的函数

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

这段代码定义了一个名为 “FindByName” 的函数,用于根据姓名在通讯录中查找对应联系人的位置。

该函数接受一个指向 Contact 类型的指针作为参数,表示要查找联系人信息的通讯录。同时,该函数还接受一个字符串参数 name,表示要查找的联系人姓名。函数使用循环遍历通讯录中所有的联系人信息,逐一比较姓名是否与要查找的姓名相同。如果找到对应的联系人,则返回该联系人在通讯录中的位置,否则返回 -1。

这个函数可以用于根据姓名在通讯录中查找对应联系人的位置。

12.创建按名字排序联系人信息的函数

//按名字排序联系人的信息
void SortContactName(Contact* pc)
{
	assert(pc);
	PeoInfo temp;
	for (int i = 0; i < pc->sz - 1; i++)
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				temp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = temp;
			}
		}
	}
	printf("排序后为:\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}

这段代码定义了一个名为 “SortContactName” 的函数,用于按照通讯录中联系人姓名的字典序对联系人信息进行排序。

该函数接受一个指向 Contact 类型的指针作为参数,表示要排序联系人信息的通讯录。函数使用 assert 宏检查指针是否为空,以确保程序不会崩溃。

在函数体中,使用冒泡排序算法对通讯录中的联系人信息进行排序,具体实现是比较相邻的两个联系人姓名的字典序,如果前者大于后者,则交换两个联系人的信息。排序完成后,使用 ShowContact 函数打印排序后的通讯录信息。

这个函数可以用于按照通讯录中联系人姓名的字典序对联系人信息进行排序。

13.完整源代码

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include
#include
#include
#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);
//增加联系人
void AddContact(Contact* pc);
//删除指定联系人
void DelContact(Contact* pc);
//显示通讯录的信息
void ShowContact(const Contact* pc);
//查找指定联系人
void SearchContact(const Contact* pc);
//修改指定联系人的信息
void ModifyContact(Contact* pc);
//按名字排序联系人的信息
void SortContactName(Contact* pc);

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

//添加联系人
void AddContact(Contact* pc)
{
	assert(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)
{
	assert(pc);
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\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 name[])
{
	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)
{
	char name[NAME_MAX] = { 0 };
	assert(pc);
	if (pc->sz == 0)
	{
		printf("通信录为空,无法删除\n");
		return;
	}
	//删除
	printf("请输入要删除人的名字:\n");
	scanf("%s", name);
	int ret=FindByName(pc,name);
	if (-1==ret)
	{
		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(const Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要查找人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要查找的人不存在\n");
		return;
	}
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
		pc->data[pos].name,
		pc->data[pos].age,
		pc->data[pos].sex,
		pc->data[pos].addr,
		pc->data[pos].tele);
}

//修改指定联系人的信息
void ModifyContact(Contact* pc)
{
	assert(pc);
	char name[NAME_MAX] = { 0 };
	printf("请输入要修改的人的名字:>");
	scanf("%s", name);
	int pos = FindByName(pc, name);
	if (-1 == pos)
	{
		printf("要修改的人不存在\n");
		return;
	}
	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].addr);
	printf("请输入电话:");
	scanf("%s", pc->data[pos].tele);
	printf("修改完成\n");
}

//按名字排序联系人的信息
void SortContactName(Contact* pc)
{
	assert(pc);
	PeoInfo temp;
	for (int i = 0; i < pc->sz - 1; i++)
	{
		for (int j = 0; j < pc->sz - 1 - i; j++)
		{
			if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0)
			{
				temp = pc->data[j];
				pc->data[j] = pc->data[j + 1];
				pc->data[j + 1] = temp;
			}
		}
	}
	printf("排序后为:\n");
	printf("%-20s\t%-4s\t%-5s\t%-20s\t%-12s\t\n",
		"姓名", "年龄", "性别", "地址", "电话");
	int i = 0;
	for (i = 0; i < pc->sz; i++)
	{
		printf("%-20s\t%-4d\t%-5s\t%-20s\t%-12s\t\n",
			pc->data[i].name,
			pc->data[i].age,
			pc->data[i].sex,
			pc->data[i].addr,
			pc->data[i].tele);
	}
}
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://排序联系人
			SortContactName(&con);
			break;
		case 0:
			printf("退出程序");
			break;
		default:
			printf("输入错误,重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

你可能感兴趣的:(小项目,c语言,开发语言,算法)