C语言简易版通讯录(静态版)

  • 通讯录的功能
    • 菜单显示
    • 增加联系人
    • 删除联系人
    • 查找联系人
    • 信息变更
    • 显示联系人信息
    • 清空通讯录
    • 排序通讯录
    • 主函数

通讯录的功能

菜单显示

void print()
{
	printf("****************************************\n");
	printf("*****1.增加联系人      2.删除联系人*****\n");
	printf("*****3.查找联系人      4.信息变更  *****\n");
	printf("*****5.显示信息        6.清空通讯录*****\n");
	printf("*****7.排序                  0.退出*****\n");
	printf("****************************************\n");
}

增加联系人

void add(contact* con)
{
	assert(con);
	if (con->count > 1000)
	{
		printf("通讯录已满!\n");
		return;
	}
	printf("请输入联系人姓名:>\n");
	scanf("%s", con->data[con->count].name);
	printf("请输入联系人性别:>\n");
	scanf("%s", con->data[con->count].sex);
	printf("请输入联系人年龄:>\n");
	scanf("%d", &(con->data[con->count].age));
	printf("请输入联系人电话:>\n");
	scanf("%s", con->data[con->count].tele);
	printf("请输入联系人地址:>\n");
	scanf("%s", con->data[con->count].addr);
	con->count++;
}

这里增加联系人就是输入联系人的信息,同时让结构体的计数次数+1.

删除联系人

void del(contact* con)
{
	char name[20] = { 0 };
	printf("请输入要删除的联系人名字:>\n");
	scanf("%s", name);
	int s = search(con,name);
	int i = 0;
	for (i = s; i < con->count - 1; i++)
	{
		con->data[i] = con->data[i + 1];
	}
	con->count--;
	printf("删除成功!\n");
}

删除联系人很简单,我这里是通过查找联系人的方法来删除联系人,如果你们自己写,可以通过电话号码或者其他别的方法来

查找联系人

int search(contact* con,char name[])
{
	assert(con);
	int i = 0;
	for (i = 0; i < con->count; i++)
	{
		if ((strcmp(name, con->data[i].name))==0)
		{
			return i;
		}
	}
	return -1;
}

查找联系人这个函数很简单,就是输入名字,然后让输入的名字和已有的联系人的名字相比较即可

信息变更

//菜单选项
void menu1()
{
	printf("*************************************\n");
	printf("*********1.姓名       2.性别*********\n");
	printf("*********3.年龄       4.电话号码*****\n");
	printf("*********5.地址       0.不做修改*****\n");
	printf("*************************************\n");
}
//修改联系人信息
void modify(contact* con)
{
	char name[max_name] = { 0 };
	int choice = 0;
	printf("请输入要修改的联系人姓名:>\n");
	scanf("%s", name);
	int s = search(con, name);
	if (s != -1)
	{
		do
		{
			printf("请根据您的需要修改联系人信息!\n");
			menu1();
			printf("请输入您要修改的联系人信息的选项:>\n");
			scanf("%d", &choice);
			switch (choice)
			{
			case 1:
				printf("请修改联系人姓名:>\n");
				scanf("%s", con->data[s].name);
				break;
			case 2:
				printf("请修改联系人性别:>\n");
				scanf("%s", con->data[s].sex);
				break;
			case 3:
				printf("请修改联系人年龄:>\n");
				scanf("%d", &(con->data[s].age));
				break;
			case 4:
				printf("请修改联系人电话号码:>\n");
				scanf("%s", con->data[s].tele);
				break;
			case 5:
				printf("请修改联系人地址:>\n");
				scanf("%s", con->data[s].addr);
				break;
			default:
				printf("没有该选项,请重新选择:>\n");
				break;
			}
		} while (choice);
	}
	else
	{
		printf("你要修改的联系人信息不存在!\n");
		return ;
	}
}

也是通过调用查找函数,然后根据自己的需要修改联系人信息

显示联系人信息

void show(contact* con)
{
	int i = 0;
	printf("%-10s%-5s%-6s%-15s%-20s\n", "姓名", "性别", "年龄", "电话号码", "地址");
	for (i = 0; i < con->count; i++)
	{
		printf("%-10s%-5s%-6d%-15s%-20s\n", con->data[i].name,
										con->data[i].sex,
										con->data[i].age,
										con->data[i].tele,
										con->data[i].addr);
	}
}

遍历这个结构体中的联系人的数据,然后一一打印

清空通讯录

//清空通讯录
void clear(contact* con)
{
	con->count = 0;
	printf("清除成功!\n");
}

这个函数最简单,就让通讯录的次数变成0,无法读取通讯录信息。

排序通讯录

//比较函数
int cmp(void* e1, void* e2)
{
	return (strcmp(((info*)e1)->name ,((info*)e2)->name));
}

//交换函数
void Swap(char* e1, char* e2, int size)
{
	int i = 0;
	for (i = 0; i < size; i++)
	{
		char tmp = *e1;
		*e1 = *e2;
		*e2 = tmp;
		e1++;
		e2++;
	}
}

//基于冒泡排序思想的排序函数
void bubble_sort(void* base,
	size_t num,
	size_t size,
	int(*cmp)(void* e1, void* e2))
{
	int i = 0;
	int j = 0;
	for (i = 0; i < num - 1; i++)
	{
		for (j = 0; j < num - 1 - i; j++)
		{
			int sz = cmp(((char*)base + j * size), ((char*)base + (j + 1) * size));
			if (sz>0)
			{
				Swap(((char*)base + j * size), ((char*)base + (j + 1) * size), size);
			}
		}
	}
}
//排序通讯录
void sort(contact* con)
{
	bubble_sort(con->data,
				con->count,
				sizeof(info),
				cmp);
	printf("排序成功!\n");
}

这里我用了冒泡排序的思想排序通讯录,同时我这个排序函数适用于各种类型的排序,如果读者嫌麻烦可以使用库函数的qsort函数进行排序。

主函数

enum choe {
	EXIT,
	ADD,
	DELETE,
	SEARCH,
	MODIFY,
	SHOW,
	CLEAR,
	SORT
};
int main()
{	
	int input = 0;
	contact con;
	memset(&con, 0, sizeof(con));
	do 
	{
		print();
		printf("请选择功能:>\n");
		scanf("%d", &input);
		switch (input)
		{
			case ADD:
				printf("请输入信息:>\n");
				add(&con);
				break;
			case DELETE:
				del(&con);
				break;
			case SEARCH:
				printf("请输入要查找的联系人:>\n");
				char name[max_name] = { 0 };
				inputname(name);
				int x = search(&con, name);
				if (x >= 0)
				{
					printf("查找成功!\n");

				}
				else
				{
					printf("查无此人!\n");
				}
				show1(&con, x);
				break;
			case MODIFY
				:
				modify(&con);
				break;
			case SHOW:
				show(&con);
				break;
			case CLEAR:
				clear(&con);
				break;
			case SORT:
				sort(&con);
				break;
			case EXIT:
				printf("退出\n");
				break;
		}
	} while (input);
	return 0;
}

这里用了枚举,使得每一个功能都能够做到见名知意,清晰明了。
这里就不做效果展示咯,这个通讯录比较简单,大家可以自行复制,然后运行,编译器是vs2019,感谢各位!

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