通讯录的要求
将每个联系人的信息储存起来,这里我们储存联系人的姓名,性别,年龄,电话,住址。
通讯录的具体程序实现
要实现通讯录,我们就得利用前面所学的顺序表,因为通讯录的底层数据结构就是顺序表。
现在我们要保存每个人的信息,就要用结构体来保存这些自定义类型。
typedef struct personInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int age;
char tel[TEL_MAX];
char addr[ADDR_MAX];
}peoInfo;
为方便后续修改,这里的数组中的值是自己定义的。
#define NAME_MAX 20
#define GENDER_MAX 10
#define TEL_MAX 20
#define ADDR_MAX 100
于是,在我们的头文件中罗列好将要实现的功能函数。
//通讯录相关的方法
//通讯录的初始化
void ContactInit(Contact* con);
//通讯录的销毁
void ContactDesTroy(Contact* con);
//通讯录添加数据
void ContactAdd(Contact* con);
//通讯录删除数据
void ContactDel(Contact* con);
//通讯录的修改
void ContactModify(Contact* con);
//通讯录查找
void ContactFind(Contact* con);
//展示通讯录数据
void ContactShow(Contact* con);
接下来的代码实现很多都利用到了前面的顺序表,我之前有顺序表的详解,具体可以去我空间回顾
1.通讯录的初始化
首先我们先将SeqList换成Contact
typedef struct SeqList Contact;
void ContactInit(Contact* con)//sl
{
//实际上要进行的是顺序表的初始化
//顺序表的初始化已经实现好了
SLInit(con);
}
2.通讯录的销毁
void ContactDesTroy(Contact* con)
{
SLDestroy(con);
}
3.通讯录添加数据
void ContactAdd(Contact* con)
{
//获取用户输入的内容:姓名+性别+年龄+电话+地址
peoInfo info;
printf("请输入要添加的联系人姓名:\n");
scanf("%s", info.name);
printf("请输入要添加的联系人性别:\n");
scanf("%s", info.gender);
printf("请输入要添加的联系人年龄:\n");
scanf("%d", &info.age);
printf("请输入要添加的联系人电话:\n");
scanf("%s", info.tel);
printf("请输入要添加的联系人住址:\n");
scanf("%s", info.addr);
//往通讯录中添加联系人数据
SLPushBack(con, info);
}
在这里我们先要单独创建一个结构体来储存接收联系人的信息,最后再用尾插将这个结构体存储的联系人数据并入将要打印的con中
4.通讯录寻找数据
int FindByName(Contact* con, char name[])
{
for (int i = 0; i < con->size; i++)
{
if (0 == strcmp(con->arr[i].name, name))
{
//找到了
return i;
}
}
//没有找到
return -1;
知识点:strcmp比较俩字符串,若相等返回零,否则返回非零值。
5.通讯录删除数据
void ContactDel(Contact* con)
{
//要删除的数据必须要存在,才能执行删除操作
//查找
char name[NAME_MAX];
printf("请输入要删除的联系人姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要删除的联系人数据不存在!\n");
return;
}
//要删除的联系人数据存在--->知道了要删除的联系人数据对应的下标
SLErase(con, find);
printf("删除成功!\n");
}
6.展示通讯录数据
void ContactShow(Contact* con)
{
//表头:姓名 性别 年龄 电话 地址
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
//遍历通讯录,按照格式打印每个联系人数据
for (int i = 0; i < con->size; i++)
{
printf("%3s %4s %4d %4s %4s\n", //手动调整一下格式
con->arr[i].name,
con->arr[i].gender,
con->arr[i].age,
con->arr[i].tel,
con->arr[i].addr
);
}
}
这里创建了一个类似表格格式的东西来显示数据,效果如下:
7.通讯录的修改
void ContactModify(Contact* con)
{
//要修改的联系人数据存在
char name[NAME_MAX];
printf("请输入要修改的用户姓名:\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要修改的联系人数据不存在!\n");
return;
}
//直接修改
printf("请输入新的姓名:\n");
scanf("%s", con->arr[find].name);
printf("请输入新的性别:\n");
scanf("%s", con->arr[find].gender);
printf("请输入新的年龄:\n");
scanf("%d", &con->arr[find].age);
printf("请输入新的电话:\n");
scanf("%s", con->arr[find].tel);
printf("请输入新的住址:\n");
scanf("%s", con->arr[find].addr);
printf("修改成功!\n");
}
8.通讯录查找
void ContactFind(Contact* con)
{
//11
char name[NAME_MAX];
printf("请输入要查找的联系人姓名\n");
scanf("%s", name);
int find = FindByName(con, name);
if (find < 0)
{
printf("要查找的联系人数据不存在!\n");
return;
}
// 姓名 性别 年龄 电话 地址
// 11 11 11 11 11
printf("%s %s %s %s %s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%8s %3s %3d %3s %3s\n", //手动调整一下格式
con->arr[find].name,
con->arr[find].gender,
con->arr[find].age,
con->arr[find].tel,
con->arr[find].addr
);
}
这里也可以尝试写出可以用更多方式来查找联系人的代码。
在完成程序功能的实现后,我们还要进行输入界面的创建。
通讯录输入界面的创建
1.菜单界面的创建
void menu()
{
printf("******************通讯录******************\n");
printf("*******1.增加联系人 2.删除联系人********\n");
printf("*******3.修改联系人 4.查找联系人********\n");
printf("*******5.展示联系人 0. 退出 *********\n");
printf("******************************************\n");
}
打印出一个界面的样子
2.菜单程序实现
如果我们要进行选择,则循环至少得执行一次。所以我们应该使用do-while循环,而while循环的条件我们可以设置一个变量op,将其初始值设为-1,最后op为0时循环得以停止,程序退出。
而对于这种选项的选择,我们倾向于选择switch语句,最后,完成代码:
int main()
{
int op = -1;
Contact con;
ContactInit(&con);
do {
menu();
printf("请选择您的操作:\n");
scanf("%d", &op);
//要根据对应的op执行不同的操作
switch (op)
{
case 1:
ContactAdd(&con);
break;
case 2:
ContactDel(&con);
break;
case 3:
ContactModify(&con);
break;
case 4:
ContactFind(&con);
break;
case 5:
ContactShow(&con);
break;
case 0:
printf("退出通讯录....\n");
break;
default:
printf("输入错误,请重新选择您的操作!\n");
break;
}
} while (op != 0);
ContactDesTroy(&con);
return 0;
}
3.程序使用测试
这里我们先添加五个数据,然后修改
没有问题,再执行删除操作
再进行查找
这样,我们的通讯录就实现完成了!