前言
本文主要是写了一个简易版的通讯录管理系统,这个代码是基于Liunx环境(清屏操作是使用linux的clear命令),功能在总体设计中有描述,耗时三个小时左右难免有缺陷,不足之处大家可以留言指出。
版本迭代
时间 | 版本 | 修改内容 |
---|---|---|
2024.09.17 | V1.0 | 初始版本 |
总体设计
实现一个通讯录:
- 可以保存100个人的信息(后续优化成动态开辟)
- 增加人的信息
- 删除指定联系人的信息
- 查询指定联系人的信息
- 修改指定联系人的信息
- 显示所有联系人的信息
- 导入导出通讯录
其中,人的信息包括:名字、年龄、性别、电话 、地址
知识点
本文使用了结构体数组、函数指针(回调函数)、文件操作函数。
代码详解
导入导出功能:会在可执行文件的同级目录下查找或者生成一个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;
}