【C语言】通讯录管理系统

前言

本文主要是写了一个简易版的通讯录管理系统,这个代码是基于Liunx环境(清屏操作是使用linux的clear命令),功能在总体设计中有描述,耗时三个小时左右难免有缺陷,不足之处大家可以留言指出。

版本迭代

时间版本修改内容
2024.09.17V1.0初始版本

总体设计

实现一个通讯录:

  1. 可以保存100个人的信息(后续优化成动态开辟)
  2. 增加人的信息
  3. 删除指定联系人的信息
  4. 查询指定联系人的信息
  5. 修改指定联系人的信息
  6. 显示所有联系人的信息
  7. 导入导出通讯录

其中,人的信息包括:名字、年龄、性别、电话 、地址

知识点

本文使用了结构体数组、函数指针(回调函数)、文件操作函数。

代码详解

导入导出功能:会在可执行文件的同级目录下查找或者生成一个contact_data.txt文件

添加功能:依次添加名字、年龄、性别、电话 、地址

删除功能:输入序号,删除对应的联系人

搜索(查询)功能:分为序号查找、名字查找、电话查找三个模式

修改功能:依次修改名字、年龄、性别、电话 、地址,不想修改某属性可以输入n跳过

代码

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

int Exitsys();
int InitContact();
int AddContact();
int DelContact();
int SearchContact();
int ModifyContact();
int ShowContact();
int SortContact();
int ImportContact();
int ExportContact();
#define MENU_LEN 10
#define PEOPLE_NUM 100
typedef struct
{
	int serial_num;
	char name[20];
	int age;
	char sex[5];
	char phone[15];
	char addr[20];
} PEOPEL_INFO;

typedef struct
{
	char *func_str;
	int (*Function)(void);
} MENU_LIST;

PEOPEL_INFO addr_people[PEOPLE_NUM];
int arr_num = 0;//通讯录人数

MENU_LIST menu[] = {
	{"退出系统", Exitsys},			// 退出系统
	{"添加", AddContact},			// 添加
	{"删除", DelContact},			// 删除
	{"搜索", SearchContact},		// 搜索
	{"修改", ModifyContact},		// 修改
	{"显示所有联系人", ShowContact}, // 显示所有联系人
	//{"排序", SortContact},			// 排序
	{"导入", ImportContact},		// 导入
	{"导出", ExportContact},		// 导出
	{NULL, NULL}
};

int Exitsys()
{
	exit(0);
	return 0;
}
int InitContact()
{
	/* init arr */
	int i;
	for(i = 0;i < PEOPLE_NUM; i++)
	{
		addr_people[i].serial_num = -1;
	}
	return 0;
}
/* 添加用户 */
int AddContact()
{
	char user_name[20] = {0};
	int user_age = 0;
	char user_sex[5] = {0};
	char user_phone[15] = {0};
	char user_addr[20] = {0};

	printf("开始添加联系人!\n");
	printf("请输入联系人的姓名:");
	scanf("%s", user_name);
	printf("请输入联系人的年龄:");
	scanf("%d", &user_age);
	printf("请输入联系人的性别:");
	scanf("%s", user_sex);
	printf("请输入联系人的电话:");
	scanf("%s", user_phone);
	printf("请输入联系人的地址:");
	scanf("%s", user_addr);

	addr_people[arr_num].serial_num = arr_num + 1;
	strcpy(addr_people[arr_num].name, user_name);
	addr_people[arr_num].age = user_age;
	strcpy(addr_people[arr_num].sex, user_sex);
	strcpy(addr_people[arr_num].phone, user_phone);
	strcpy(addr_people[arr_num].addr, user_addr);

	printf("用户 %s 添加成功!\n", user_name);
	arr_num++;

	return 0;
}
int DelContact()
{
	int num;
	int people_num_status = ShowContact();
	if(people_num_status == -1)
	{
		printf("通讯录列表为空,无法进行修改操作...");
		return -1; 
	}
	printf("请输入你要删除的联系人的序号(1-%d):", arr_num);
	if (scanf("%d", &num) != 1 || num < 1 || num > arr_num)
	{
		printf("输入错误!\n");
		return -1;
	}
	num--;
	int i;
	for (i = num; i < arr_num - 1; i++)
	{
		addr_people[i] = addr_people[i + 1];  
	}
		arr_num--;
		addr_people[arr_num].serial_num = -1;

	return 0;
}
int num_find()
{
	int serial_num;
	system("clear");
	printf("请输入你要查找的序号:");
	scanf("%d", &serial_num);

	int i = 0;
	int find_flag = 0;
	while(addr_people[i].serial_num != -1)
	{
		if(addr_people[i].serial_num == serial_num)
		{
			find_flag = 1;
			break;
		}
		i++;
	}
	if(find_flag == 1)
	{
		system("clear");
		printf("查找结束...\n");
		printf("num:%-3d|name:%-10s|age:%-2d|sex:%-3s|phone:%-15s|addr:%-10s\n",
					addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
					addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);
	}else
	{
		system("clear");
		printf("查找结束,未查找到相关信息...\n");
	}
	return 0;
}
int name_find()
{
	char user_name[20] = {0};
	system("clear");
	printf("请输入你要查找的用户名:");
	scanf("%s", user_name);

	int i = 0;
	int find_flag = 0;
	while(addr_people[i].serial_num != -1)
	{
		if(!strcmp(addr_people[i].name, user_name))
		{
			find_flag = 1;
			break;
		}
		i++;
	}
	if(find_flag == 1)
	{
		system("clear");
		printf("查找结束...\n");
		printf("num:%-3d|name:%-10s|age:%-2d|sex:%-3s|phone:%-15s|addr:%-10s\n",
					addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
					addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);
	}else
	{
		system("clear");
		printf("查找结束,未查找到相关信息...\n");
	}
	return 0;
}
int phone_find()
{
	char phone_num[20] = {0};
	system("clear");
	printf("请输入你要查找的电话号码:");
	scanf("%s", phone_num);

	int i = 0;
	int find_flag = 0;
	while(addr_people[i].serial_num != -1)
	{
		if(!strcmp(addr_people[i].phone, phone_num))
		{
			find_flag = 1;
			break;
		}
			
		i++;
	}
	if(find_flag == 1)
	{
		system("clear");
		printf("查找结束...\n");
		printf("num:%-3d|name:%-10s|age:%-2d|sex:%-3s|phone:%-15s|addr:%-10s\n",
					addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
					addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);
	}else
	{
		system("clear");
		printf("查找结束,未查找到相关信息...\n");
	}

	return 0;
}
int SearchContact()
{
	int num, i;

	printf("查找联系人\n");
	printf("1-序号查找\n2-名字查找\n3-电话查找\n请选择你要查找的方式:");
	scanf("%d", &num);

	switch(num)
	{
		case 1:
			num_find();
		break;	
		case 2:
			name_find();
		break;	
		case 3:
			phone_find();
		break;
		default:
			printf("输入错误,返回上一级...\n");
		break;
	}
	return 0;
}
int modify_data(int i, int j, char *input_str)
{
	switch(j)
	{
		case 1://name
			strcpy(addr_people[i].name, input_str);
		break;
		case 2://age
			addr_people[i].age = atoi(input_str);
		break;
		case 3://sex
			strcpy(addr_people[i].sex, input_str);
		break;
		case 4://phone
			strcpy(addr_people[i].phone, input_str);
		break;
		case 5://addr
			strcpy(addr_people[i].addr, input_str);
		break;
	}
	return 0;
}
int ModifyContact()
{
	int num, count;
	int i = 0;
	printf("通讯录修改功能\n");
	int people_num_status = ShowContact();
	if(people_num_status == -1)
	{
		printf("通讯录列表为空,无法进行修改操作...");
		return -1; 
	}

	printf("请输入你要修改的序号:");
	scanf("%d", &num);

	while(addr_people[i].serial_num != -1)
	{
		if(addr_people[i].serial_num == num)
		{
			int j;
			for(j = 0; j < 5; j++)
			{
				char input_str[30] = {0};
				printf("tips:\n1-name\t2-age\n3-sex\t4-phone\n5-addr\n请输入你要修改的内容,如果该项不修改请输入n\n[%d]-->", j + 1);
				scanf("%s", input_str);
				
				if(!strcmp(input_str, "n"))
					continue;
				
				modify_data(i, j + 1, input_str);

			}
			break;
		}
			
		i++;
	}
	return 0;
}
int ShowContact()
{
	printf("通讯录列表\n");
	int i = 0;
	if(addr_people[0].serial_num == -1)
	{
		printf("通讯录列表为空!\n");
		return -1;
	}

	while(addr_people[i].serial_num != -1)
	{
		printf("num:%-3d|name:%-10s|age:%-2d|sex:%-3s|phone:%-15s|addr:%-10s\n",
				addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
				addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);
		i++;
	}

	return 0;
}

int ImportContact()
{
	printf("ready to import contact data!\n");

	FILE *file_fd = NULL;
	char line[256];
	if((file_fd = fopen("contact_data.txt", "r+")) == NULL)
	{
		printf("have not data file!\n");
		return -1;
	}


	while(fgets(line, sizeof(line), file_fd) != NULL)
	{
		char serial_num[5]  = {0};
		char user_name[20]  = {0};
		char user_age[5]    = {0};
		char user_sex[5]    = {0};
		char user_phone[15] = {0};
		char user_addr[20]  = {0};

		sscanf(line, "num %s name %s age %s sex %s phone %s addr %s", serial_num, user_name, user_age, user_sex, user_phone, user_addr);

		int num = atoi(serial_num) - 1;

		addr_people[num].serial_num = atoi(serial_num);
		strcpy(addr_people[num].name, user_name);
		addr_people[num].age = atoi(user_age);
		strcpy(addr_people[num].sex, user_sex);
		strcpy(addr_people[num].phone, user_phone);
		strcpy(addr_people[num].addr, user_addr);
		arr_num++;
		/*printf("num:%-3d name:%-10s age:%-2d sex:%-3s phone:%-15s addr:%-10s\n",
				addr_people[num].serial_num, addr_people[num].name, addr_people[num].age, 
				addr_people[num].sex, addr_people[num].phone, addr_people[num].addr);*/
	}
	printf("import contact data over, import people[%d]!\n", arr_num);
	fclose(file_fd);
	return 0;
}
int ExportContact()
{
	printf("ready to export contact data, will create contact_data.txt file!\n");

	FILE *file_fd = NULL;

	file_fd = fopen("contact_data.txt", "w+");

	if(file_fd == NULL)
	{
		printf("create data file error!\n");
		return -1;
	}
	
	int i = 0;

	while(addr_people[i].serial_num != -1)
	{
		fprintf(file_fd, "num %d name %s age %d sex %s phone %s addr %s\n",
			addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
			addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);

		/*printf("num %d name %s age %d sex %s phone %s addr %s\n",
			addr_people[i].serial_num, addr_people[i].name, addr_people[i].age, 
			addr_people[i].sex, addr_people[i].phone, addr_people[i].addr);*/
		i++;
	}
	printf("export contact data over!\n");
	fclose(file_fd);
	return 0;
}

int get_user_input()
{
	int num;

	printf("请输入选择:");
	fflush(stdin);
	scanf("%d", &num);

	if (num > 9 || num < 0)//这里跟上面的回调函数的结构体数组里面的个数相关
		return -1;
	
	return num;
}
void show_meun_list()
{
	int i = 0;
	printf("\n~~欢迎使用用户管理系统~~\n");
	printf("++++++++++++++++++++++++\n");
	while (menu[i].Function != NULL)
	{
		printf(" %d-%s\n", i + 1, menu[i].func_str);
		i++;
	}
	printf("++++++++++++++++++++++++\n");
}
int main()
{
	int num, i;

	InitContact();
	while (1)
	{
		show_meun_list();

		num = get_user_input();
		system("clear");//清屏
		if(num != -1)
			menu[num - 1].Function();
		else
			printf("输入选项无效,请重新输入...\n");
	}

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

April.19th

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值