通讯录和学生信息管理系统的基本功能部分实现一模一样。
来看看不一样的部分。
查找
通讯录需要实现根据联系人不同信息查找的功能,可以为每一种查找情况都封装一个查找函数,或者根据不同情况返回不同的比较结果进行查找。
为了使函数更加简短,我们将该功能分为三个函数。
//根据 mode 的不同获取不同比较方式的比较结果
//mode: 1 通过姓名,2 通过职务,3 通过职称,4 通过电话,5 通过邮件
int GetCmpRes(Person per, char* goal, int mode) {
int cmp_res = -2;
switch (mode) {
case 1:
cmp_res = strcmp(per.name, goal);
break;
case 2:
cmp_res = strcmp(per.job, goal);
break;
case 3:
cmp_res = strcmp(per.title, goal);
break;
case 4:
cmp_res = strcmp(per.telephone, goal);
break;
case 5:
cmp_res = strcmp(per.email, goal);
break;
default:
break;
}
return cmp_res;
}
//查找并返回对应联系人所在下标,若联系人不存在,返回 -1
//可通过修改 mode 参数切换不同的查找方式
int FindByMode(Person per_arr[], int length, char* goal, int mode) {
int i, is_find = 0;
for (i = 0; i < length && is_find == 0; i++) {
int cmp_res = GetCmpRes(per_arr[i], goal, mode);
if (cmp_res == 0) {
is_find = 1;
}
}
if (is_find == 0) {
i = -1;
} else {
i -= 1;
}
return i;
}
//查找联系人信息,可通过修改 mode 参数改变查找的方式
void FindPerson(Person per_arr[], int length) {
char* text[6] = {"", "姓名", "工作", "职务", "职称", "邮箱"};
int mode;
printf("你想通过什么方式查找?\n");
printf("1.姓名 2.工作 3.职务 4.职称 5.邮箱\n@请输入操作号码>");
scanf("%d", &mode);
if (mode < 1 || mode > 5) {mode = 1;}
char goal[30];
printf("请输入要查找的联系人的%s:", text[mode]);
scanf("%s", &goal);
int in = FindByMode(per_arr, length, goal, mode);
if (in == -1) {
printf("未找到改联系人!\n");
} else {
printf("通讯姓名\t工作职务\t工作职称\t电话号码\t电子邮件\n");
printf("%s\t\t%s\t\t%s\t\t%s\t\t%s\n",
per_arr[in].name, per_arr[in].job,
per_arr[in].title, per_arr[in].telephone,
per_arr[in].email);
}
}
函数调用关系如下图:
运行效果
开发工具 Dev-C++。
源码下载地址。