文章目录
前言
学习完C语言的结构体之后,用结构体的相关知识来实现一个简易的通讯录管理系统,因为目前还没学习到动态内存管理,所以实现的通讯录管理系统是静态的,同时,代码也还有很多可以改进的地方。
一、通讯录功能介绍
1、通讯录应当有以下功能
(1)保存1000个联系人的信息
(2)增加联系人
(3)删除联系人
(4)修改联系人
(5)查找联系人
(6)打印联系人信息
(7)对录入的联系人进行排序
2、联系人的信息组成
(1)名字
(2)性别
(3)年龄
(4)电话
(5)住址
二、通讯录前期准备
1、打印一个菜单,选择要进行的功能操作
void menu()
{
printf(" 通讯录\n");
printf("*************************************\n");
printf("****** 1、Add 2、Del *********\n");
printf("****** 3、Modify 4、Search *********\n");
printf("****** 5、Print 6、Sort *********\n");
printf("****** 0、Exit *********\n");
printf("*************************************\n");
}
2、创建通讯录
struct Peoinfo//每个人的信息
{
char name[NAME_MAX];
char sex[SEX_MAX];
int age;
char tele[TELE_MAX];
char addr[ADDR_MAX];
};
typedef struct Contact
{
struct Peoinfo p[People_MAX];
int sz;//记录存放在通讯录中的人数
}Con;
3、初始化通讯录
void InitContact(Con* pc)
{
assert(pc);
pc->sz = 0;
memset(pc->p,0,sizeof(pc->p));
}
三、通讯录功能的具体实现
用switch语句来实现功能的选择
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case add:
AddContact(&con);
break;
case del:
DelContact(&con);
break;
case modify:
Modify(&con);
break;
case search:
Search(&con);
break;
case print:
Print(&con);
break;
case sort:
Sort(&con);
break;
case Exit:
printf("退出通讯录\n");
break;
default:
printf("选择错误\n");
break;
}
case 的值使用了枚举常量,这样提高了代码的可读性,所以,我创建了两个枚举变量,一个是表示选择的功能,一个是修改信息时,要修改的选项。
//通讯录功能
enum fun
{
Exit,
add,
del,
modify,
search,
print,
sort
};
enum modifyoption//修改信息选项
{
Name = 1,
Sex,
Age,
Tele,
Addr
};
1、增加联系人
void AddContact(Con* pc)
{
assert(pc);
if (pc->sz == People_MAX)
{
printf("通讯录已满,无法增加\n");
return;
}
printf("请输入名字:");
scanf("%s", pc->p[pc->sz].name);
printf("请输入性别:");
scanf("%s", pc->p[pc->sz].sex);
printf("请输入年龄:");
scanf("%d", &(pc->p[pc->sz].age));
printf("请输入电话:");
scanf("%s", pc->p[pc->sz].tele);
printf("请输入住址:");
scanf("%s", pc->p[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
2、打印联系人
这里先接着实现打印的功能,也便于调试验证增加联系人的函数是否能正确实现。
void Print(const Con* pc)
{
assert(pc);
//打印
int i = 0;
printf("%-20s %-5s %-10s %-13s %-30s\n", "名字", "性别", "年龄", "电话", "住址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-5s %-10d %-13s %-30s\n", pc->p[i].name, pc->p[i].sex, pc->p[i].age, pc->p[i].tele, pc->p[i].addr);
}
}
3、删除联系人
void DelContact(Con* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通讯录已空,无法删除\n");
return;
}
//要删除,首先要找到删除的对象
char name[NAME_MAX] = {
0 };
printf("请输入要查找的名字:");
scanf("%s", name);
int ret = FindByName(pc,name);//找到返回下标,找不到返回-1
if (ret == -1)
{
printf("找不到\n");
return;
}
else
{
//删除-->把后面的数据覆盖到要删除的地方
int i = 0;
for (i = ret; i < pc->sz-1; i++)
{
pc->p[i] = pc->p[i + 1];
}
pc->sz--;
printf("删除成功\n");
return;
}
}
int FindByName(const Con* pc,char* name)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->p[i].name, name) == 0)
{
return i;
}
}
return -1;
}
4、查找联系人
在删除联系人的功能模块中已经实现了查找的功能,所以可以调用对应的查找的函数
void Search(const Con* pc)
{
assert(pc);
if (pc->sz == 0)
{
printf("通讯录是空的,找不到\n");
return;
}
//找
char name[NAME_MAX] &#